में
ssh host tail -f file
ssh
ग्राहक को जोड़ता है sshd
पर सर्वर host
एक TCP कनेक्शन पर। sshd
रन tail -f
अपने stdout के साथ एक पाइप दिया करता था। sshd
पढ़ता है कि पाइप के दूसरे छोर से क्या आ रहा है और ssh
क्लाइंट को भेजने के लिए इसे sshd प्रोटोकॉल में इनकैप्सुलेट करता है । (के साथ rshd
, tail
स्टडआउट सीधे सॉकेट होता, लेकिन sshd
एन्क्रिप्शन जोड़ता है और एकल टीसीपी कनेक्शन पर कई धाराओं (जैसे पोर्ट / एजेंट / एक्स 11 / टनल पुनर्निर्देशन, स्टेडर के लिए मल्टीप्लेक्स करने में सक्षम है) ताकि पाइप का सहारा लेना पड़े।
जब आप CTRL-C दबाते हैं, तो ssh
क्लाइंट को एक SIGINT भेजा जाता है । जो ssh
मरने का कारण बनता है। मरने पर टीसीपी कनेक्शन बंद हो जाता है। और इसलिए, पर host
, sshd
साथ ही मर जाता है।tail
मारा नहीं गया है, लेकिन उसका स्टडआउट अब एक पाइप है जिसके दूसरे छोर पर कोई पाठक नहीं है। तो, अगली बार जब यह अपने स्टडआउट के लिए कुछ लिखता है, तो यह एक SIGPIPE प्राप्त करेगा और मर जाएगा।
में:
ssh -t host 'tail -f file'
यह सिवाय इसके कि बजाय एक पाइप के साथ होने का, के बीच संचार में एक ही बात है sshd
और tail
एक छद्म टर्मिनल के माध्यम से है। tail
's stdout एक दास छद्म-टर्मिनल (जैसे /dev/pts/12
) है और जो कुछ भी tail
वहाँ है read
वह मास्टर की ओर (संभवतः tty लाइन अनुशासन द्वारा संशोधित) द्वारा sshd
और ssh
ग्राहक को इनकैप्सुलेट किए जाने पर लिखा जाता है ।
क्लाइंट के साथ -t
, ssh
टर्मिनल को raw
मोड में रखता है। विशेष रूप से, जो टर्मिनल कैनोनिकल मोड और टर्मिनल सिग्नल हैंडलिंग को अक्षम करता है।
इसलिए, जब आप प्रेस करते हैं, तो Ctrl+Cग्राहक की टर्मिनल लाइन अनुशासन के बजाय ssh
नौकरी के लिए एक संकेत भेजते हैं , जो कि ^C
कनेक्शन को चरित्र को भेजता है sshd
और sshd
लिखता है कि ^C
दूरस्थ टर्मिनल के मास्टर पक्ष में। और रिमोट टर्मिनल का लाइन अनुशासन एक भेजता SIGINT
है tail
। tail
तब मर जाता है, और sshd
बाहर निकलता है और कनेक्शन को बंद कर देता है और ssh
समाप्त कर देता है (यदि यह अन्यथा पोर्ट अग्रेषण या अन्य के साथ व्यस्त नहीं है)।
इसके अलावा, -t
यदि ssh
ग्राहक मर जाता है (उदाहरण के लिए यदि आप प्रवेश करते हैं ~.
), तो कनेक्शन बंद हो sshd
जाता है और मर जाता है। परिणामस्वरूप, एक SITEUP को भेजा जाएगाtail
।
अब, सावधान रहें कि -t
साइड इफेक्ट्स का उपयोग करना है। उदाहरण के लिए, डिफ़ॉल्ट टर्मिनल सेटिंग्स के साथ, \n
वर्णों को परिवर्तित किया जाता है \r\n
और रिमोट सिस्टम के आधार पर अधिक चीजें हो सकती हैं, इसलिए आप stty -opost
दूरस्थ होस्ट पर एक (आउटपुट पोस्ट-प्रोसेसिंग को अक्षम करने के लिए) जारी करना चाह सकते हैं यदि वह आउटपुट के लिए अभिप्रेत नहीं है एक टर्मिनल:
$ ssh localhost 'echo x' | hd
00000000 78 0a |x.|
00000002
$ ssh -t localhost 'echo x' | hd
00000000 78 0d 0a |x..|
00000003
$ ssh -t localhost 'stty -opost; echo x' | hd
00000000 78 0a |x.|
00000002
का उपयोग करने का एक और दोष -t
/ -tt
कि stdout और stderr ग्राहक पर अलग नहीं कर रहे हैं। दूरस्थ कमांड के स्टडआउट और स्टॉडर दोनों को ssh
क्लाइंट के स्टडआउट को लिखा जाएगा :
$ ssh localhost ls /x | wc -l
ls: cannot access /x: No such file or directory
0
$ ssh -t localhost ls /x | wc -l
1