ใน
ssh host tail -f file
ssh
ลูกค้าเชื่อมต่อกับsshd
เซิร์ฟเวอร์host
ผ่านการเชื่อมต่อ TCP sshd
ทำงานtail -f
ด้วย stdout ที่เปลี่ยนเส้นทางไปยังไปป์ sshd
อ่านสิ่งที่มาจากปลายอีกด้านหนึ่งของไปป์และสรุปในโพรโทคอล sshd เพื่อส่งไปยังssh
ไคลเอนต์ (มีrshd
, tail
stdout จะได้รับซ็อกเก็ตโดยตรง แต่sshd
เพิ่มการเข้ารหัสและสามารถที่จะ multiplex ลำธารหลาย (เช่นพอร์ต / ตัวแทน / X11 / เปลี่ยนเส้นทางอุโมงค์ stderr) ในการเชื่อมต่อ TCP เดียวเพื่อมีรีสอร์ทเพื่อท่อ)
เมื่อคุณกด CTRL-C SIGINT จะถูกส่งไปยังssh
ลูกค้า ที่ทำให้เกิดssh
การตาย เมื่อกำลังจะตายการเชื่อมต่อ TCP จะถูกปิด และดังนั้นบนhost
, sshd
ตายเช่นกัน tail
ไม่ได้ถูกฆ่า แต่ stdout ของมันตอนนี้เป็นไพพ์ที่ไม่มีตัวอ่านที่ปลายอีกด้าน ดังนั้นในครั้งต่อไปที่มันเขียนอะไรบางอย่างไปยัง stdout มันจะได้รับ SIGPIPE และตาย
ใน:
ssh -t host 'tail -f file'
มันเป็นสิ่งเดียวกันยกเว้นว่าแทนที่จะอยู่กับไพพ์การสื่อสารระหว่างsshd
และtail
ผ่านเทอร์มินัลหลอก tail
's stdout เป็นทาสหลอก terminal (เช่น/dev/pts/12
) และสิ่งที่tail
เขียนมีอยู่read
ในด้านต้นแบบ (อาจแก้ไขได้โดยวินัยบรรทัด tty) โดยsshd
และส่งห่อหุ้มไปยังssh
ลูกค้า
ที่ฝั่งไคลเอ็นต์ด้วย-t
, ให้ssh
วางเทอร์มินัลในraw
โหมด โดยเฉพาะอย่างยิ่งที่ปิดใช้งานโหมดบัญญัติและการจัดการสัญญาณเทอร์มินัล
ดังนั้นเมื่อคุณกดCtrl+Cแทนวินัยของเทอร์มินัลไลน์ของลูกค้าที่ส่ง SIGINT ไปยังssh
งานนั่นก็แค่ส่ง^C
ตัวละครผ่านการเชื่อมต่อไปยังsshd
และsshd
เขียน^C
ไปยังฝั่งมาสเตอร์ของรีโมตเทอร์มินัล และมีระเบียบวินัยสายของขั้วระยะไกลส่งไปSIGINT
จากนั้นจะตายและออกจากและปิดการเชื่อมต่อและยุติ (หากยังไม่ได้ยุ่งกับการส่งต่อพอร์ตหรืออื่น ๆ )tail
tail
sshd
ssh
นอกจากนี้-t
หากssh
ลูกค้าตาย (เช่นหากคุณป้อน~.
) การเชื่อมต่อจะปิดและsshd
ตาย ในฐานะที่เป็นผลให้ SIGHUP 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 ไม่ได้แยกความแตกต่างบนไคลเอนต์ ทั้ง stdout และ stderr ของคำสั่งระยะไกลจะถูกเขียนไปยังssh
stdout ของลูกค้า:
$ ssh localhost ls /x | wc -l
ls: cannot access /x: No such file or directory
0
$ ssh -t localhost ls /x | wc -l
1