อักขระเลี่ยง SSH และการถ่ายโอนไฟล์ไบนารี
ข้อดีอย่างหนึ่งที่ยังไม่ได้รับการกล่าวถึงในคำตอบอื่น ๆ ก็คือว่าเมื่อการดำเนินงานโดยไม่ต้องหลอกขั้ว , จุ๊ตัวหนีเช่น~C
จะได้รับการสนับสนุน ; สิ่งนี้ทำให้ปลอดภัยสำหรับโปรแกรมที่จะถ่ายโอนไฟล์ไบนารีซึ่งอาจมีลำดับเหล่านี้
พิสูจน์แนวคิด
คัดลอกไฟล์ไบนารีโดยใช้เทอร์มินัลหลอก:
$ ssh -t anthony@remote_host 'cat /usr/bin/free' > ~/free
Connection to remote_host closed.
คัดลอกไฟล์ไบนารีโดยไม่ใช้เทอร์มินัลหลอก:
$ ssh anthony@remote_host 'cat /usr/bin/free' > ~/free2
ไฟล์สองไฟล์ไม่เหมือนกัน:
$ diff ~/free*
Binary files /home/anthony/free and /home/anthony/free2 differ
สิ่งที่ถูกคัดลอกด้วยเทอร์มินัลเทียมหลอกเสียหาย:
$ chmod +x ~/free*
$ ./free
Segmentation fault
ในขณะที่คนอื่นไม่:
$ ./free2
total used free shared buffers cached
Mem: 2065496 1980876 84620 0 48264 1502444
-/+ buffers/cache: 430168 1635328
Swap: 4128760 112 4128648
ถ่ายโอนไฟล์ผ่าน SSH
สิ่งนี้สำคัญอย่างยิ่งสำหรับโปรแกรมเช่นscp
หรือrsync
ที่ใช้ SSH สำหรับการถ่ายโอนข้อมูล นี้อธิบายรายละเอียดของวิธีการทำงานของโปรโตคอล SCPอธิบายถึงวิธีการโพรโทคอ SCP ประกอบด้วยส่วนผสมของข้อความต้นฉบับเดิมโปรโตคอลและข้อมูลแฟ้มไบนารี
OpenSSH ช่วยปกป้องคุณจากตัวคุณเอง
เป็นที่น่าสังเกตว่าถึงแม้ว่า-t
จะมีการใช้การตั้งค่าสถานะssh
ไคลเอนต์OpenSSH จะปฏิเสธที่จะจัดสรรเทอร์มินัลหลอกถ้าตรวจพบว่าstdin
สตรีมไม่ใช่เทอร์มินัล:
$ echo testing | ssh -t anthony@remote_host 'echo $TERM'
Pseudo-terminal will not be allocated because stdin is not a terminal.
dumb
คุณยังสามารถบังคับให้ไคลเอ็นต์ OpenSSH จัดสรรเทอร์มินัลเทียมด้วย-tt
:
$ echo testing | ssh -tt anthony@remote_host 'echo $TERM'
xterm
ไม่ว่าในกรณีใดมัน (สมเหตุสมผล) ไม่สนใจว่าจะถูกเปลี่ยนเส้นทางstdout
หรือstderr
:
$ ssh -t anthony@remote_host 'echo $TERM' >| ssh_output
Connection to remote_host closed.