मैं ssh के माध्यम से संकेत (SIGINT सबसे महत्वपूर्ण है) भेजने में सक्षम होना चाहता हूं।
यह आदेश:
ssh server "sleep 1000;echo f" > foo
सर्वर पर सोना शुरू कर देगा और 1000 सेकंड के बाद यह मेरे स्थानीय मशीन पर फ़ाइल foo में 'f \ n' डाल देगा। अगर मैं CTRL-C दबाता हूं (यानी sshINT को ssh में भेजें) तो यह ssh को मार देगा, लेकिन यह रिमोट सर्वर पर नींद को नहीं मारेगा। मैं चाहता हूं कि यह रिमोट सर्वर पर नींद को मार दे।
इसलिए मैंने कोशिश की:
ssh server -t "sleep 1000;echo f" > foo
लेकिन अगर स्टडिन एक टर्मिनल नहीं है तो मुझे यह त्रुटि मिलती है:
Pseudo-terminal will not be allocated because stdin is not a terminal.
और तब SIGINT को अभी भी अग्रेषित नहीं किया गया है।
इसलिए मैंने कोशिश की:
ssh server -t -t "sleep 1000;echo f" > output
लेकिन तब foo में आउटपुट 'f \ n' नहीं होता है, बल्कि 'f \ r \ n' होता है, जो मेरी स्थिति में विनाशकारी होता है (जैसा कि मेरा आउटपुट बाइनरी डेटा है)।
ऊपर मैं "स्लीप 1000; इको एफ" का उपयोग करता हूं, लेकिन वास्तव में उपयोगकर्ता द्वारा आपूर्ति की जाती है, इस प्रकार इसमें कुछ भी हो सकता है। हालांकि, अगर हम इसे "स्लीप 1000; इको एफ" के लिए काम कर सकते हैं, तो हम संभवतः इसे सभी यथार्थवादी स्थितियों के लिए काम कर सकते हैं।
मैं वास्तव में दूसरे छोर पर एक छद्म टर्मिनल प्राप्त करने के बारे में परवाह नहीं करता हूं, लेकिन मैं अपने SIGINT को आगे बढ़ाने के लिए ssh प्राप्त करने का कोई अन्य तरीका खोजने में असमर्थ रहा हूं।
क्या कोई और तरीका है?
संपादित करें:
उपयोगकर्ता आदेश दे सकता है कि स्टड से द्विआधारी डेटा पढ़ें, जैसे:
seq 1000 | gzip | ssh server "zcat|bzip2; sleep 1000" | bzcat > foo
उपयोगकर्ता ऐसे कमांड दे सकते हैं जो सीपीयू के गहन हों, जैसे:
ssh server "timeout 1000 burnP6"
EDIT2:
जो संस्करण मेरे लिए काम करता है वह है:
your_preprocessing |
uuencode a | ssh -tt -oLogLevel=quiet server "stty isig -echoctl -echo ; uudecode -o - |
your_command |
uuencode a" | uudecode -o - |
your_postprocessing
मुझे सही दिशा में इंगित करने के लिए digital_infinity का धन्यवाद।
ssh
को उदाहरणों के रूप में दिखाए जाने की तुलना में अधिक जटिल होना चाहिए, क्योंकि आप एक सरल पुनर्व्यवस्थापन के साथ इच्छित व्यवहार प्राप्त कर सकते हैं:sleep 1000 && ssh server "echo f" > foo
(यह होना चाहिए&&
, नहीं;
, ताकि हत्या कमांड को चलने सेsleep
रोकssh
दे।) यदि मैं सही है, कृपया अपने उदाहरणों को अपने वास्तविक उपयोग के अधिक प्रतिनिधि बनाएं, इसलिए बेहतर उत्तर दिया जा सकता है।