การใช้ssh -t
แทนssh
การเชื่อมต่อกับเซิร์ฟเวอร์ระยะไกลมีข้อดีหลายประการ ตัวอย่างเช่นฉันสามารถแก้ไขไฟล์โดยตรงด้วย vim: ssh -t host vim foo.txt
ซึ่งจะล้มเหลวเป็นอย่างอื่น
มีสถานการณ์ใดบ้างที่การจัดสรร (หลอก) -tty จะเป็นสิ่งที่ไม่ดีเมื่อใช้ ssh?
การใช้ssh -t
แทนssh
การเชื่อมต่อกับเซิร์ฟเวอร์ระยะไกลมีข้อดีหลายประการ ตัวอย่างเช่นฉันสามารถแก้ไขไฟล์โดยตรงด้วย vim: ssh -t host vim foo.txt
ซึ่งจะล้มเหลวเป็นอย่างอื่น
มีสถานการณ์ใดบ้างที่การจัดสรร (หลอก) -tty จะเป็นสิ่งที่ไม่ดีเมื่อใช้ ssh?
คำตอบ:
เมื่อไพพ์อินพุตหรือรับอินพุตกลับซึ่งเป็นการใช้โดยทั่วไปของ "ssh host command" สามารถตีความอักขระควบคุมได้โดยเลเยอร์ TTY (^ S เป็นตัวอย่าง)
ใช่บางครั้งคุณต้องการทำการเชื่อมต่อที่เงียบและมีพื้นหลังเช่นเมื่อตั้งค่าอุโมงค์ (เช่นพร็อกซี SOCKS) ในตัวอย่างเช่นคุณต้องการให้กระบวนการไม่มี tty
นี่คือตัวอย่างของการตั้งค่าการส่งต่อพอร์ตจากโลคัลโฮสต์ไปยังรีโมตโฮสต์บางตัว ...
ssh -l username -fNTL 8073:server:873
หลังจากตั้งค่านี้แล้วคุณสามารถ rsync ไปยัง localhost แทนที่จะไปที่รีโมตโฮสต์ดังนั้นอย่างมีประสิทธิภาพ tunneling rsync ของคุณผ่านssh
...
rsync --port=8073 -a me@localhost::myStuff /tmp/myStuff/
คุณต้องทำเช่นนี้ถ้า rsync กำลังserver
ถูกบล็อก แต่ssh
ไม่ใช่
นอกเหนือจากข้างต้น ...
(1) การจัดการ tilda หลบหนีที่แตกต่างกัน:
เครื่องหมาย "~" หลบหนีจะปลดคุณถ้าคุณมี pty (-t) สำหรับคำสั่งที่ใช้เวลานานคุณอาจต้องการป้องกันไม่ให้บางคนหยุดกระบวนการโดยไม่ตั้งใจหากพวกเขาพิมพ์ ~
$ ssh hostname.tomontime.com -t sleep 60
[type ~. และมันยกเลิกการเชื่อมต่อ]
ปิดการเชื่อมต่อกับ hostname.tomontime.com
$ ssh ชื่อโฮสต์ -T sleep 60
[ฉันพิมพ์ ~ และมันก็เหมือนกับการกดแป้นปกติซึ่งคำสั่ง sleep จะไม่สนใจ]
~
~
ลองสิ่งเดียวกันกับ CTRL-C คุณจะเห็นว่าด้วย -t คุณกำลังส่ง CTRL-C ไปที่ "sleep" ด้วย -T คุณกำลังส่ง CTRL-C ไปยังโปรแกรม ssh ที่รันบนเครื่องของคุณ อาจมีบางครั้งที่สิ่งนี้สร้างความแตกต่าง (เช่นโปรแกรมจัดการ INT แตกต่างจาก HUP)
(2) คุณเพียงต้องการลดกิจกรรมการเชื่อมต่อเครือข่ายให้น้อยที่สุด
เมื่อพยายามรีบู๊ตเครื่องที่ไม่มี ptys คุณไม่ต้องการให้ระบบพยายามจัดสรร pty! นอกจากนี้ยังลดการเชื่อมต่อเครือข่ายที่จะต้องปิด (ชะลอการรีบูต)
สิ่งนี้จะทำงานได้เร็วขึ้นและเชื่อถือได้มากขึ้น:
ssh -T hostname reboot
สิ่งนี้อาจมีปัญหา:
ssh -t hostname reboot
ssh -t สร้างสถานีหลอกบนเครื่องระยะไกล สิ่งนี้มีประโยชน์หากคุณกำลัง chaining คำสั่ง ssh ผ่านหลาย ๆ เซิร์ฟเวอร์และต้องการเทอร์มินัลจริงที่อยู่ไกลออกไป (เพื่อให้คุณสามารถใช้ 'vi' ตัวอย่างเช่น)
คุณอาจไม่ต้องการ '-t' เมื่อสคริปต์การเข้าสู่ระบบทำงานแตกต่างกันหากมีเทอร์มินัล นี่เป็นวิธีปฏิบัติที่ไม่ดี IMHO แต่ฉันเคยเห็นกรณีที่สคริปต์เข้าสู่ระบบตรวจสอบ TTY ก่อน 1) การตั้งค่าพรอมต์และ 2) การขยายเส้นทางไปยังแอปพลิเคชันแบบโต้ตอบจำนวนมาก
ในอินสแตนซ์อื่น (ที่กล่าวถึงโดย TomOnTime ด้านบน) ฉันได้พบกับกรณีที่ TTY (ptys) หมดไป เห็นได้ชัดว่าการกำหนดค่าผิดพลาด แต่ไม่จำเป็นต้องเคี้ยวทรัพยากรสำหรับอุโมงค์และ rsyncs