ฉันกำลังพยายามเชื่อมต่อกับเครื่องหนึ่งด้วย ssh แล้วเชื่อมต่อกับเครื่องอีกสองเครื่องด้วย ssh แต่ฉันได้รับข้อผิดพลาดนี้
ssh user@computerone.com 'ssh otheruser@computertwo.com'
stdin: is not a tty
ทำไม?
ฉันกำลังพยายามเชื่อมต่อกับเครื่องหนึ่งด้วย ssh แล้วเชื่อมต่อกับเครื่องอีกสองเครื่องด้วย ssh แต่ฉันได้รับข้อผิดพลาดนี้
ssh user@computerone.com 'ssh otheruser@computertwo.com'
stdin: is not a tty
ทำไม?
คำตอบ:
ตามค่าเริ่มต้นเมื่อคุณเรียกใช้คำสั่งบนเครื่องระยะไกลโดยใช้ ssh TTYจะไม่ถูกจัดสรรสำหรับเซสชันระยะไกล สิ่งนี้ช่วยให้คุณถ่ายโอนข้อมูลไบนารี่ ฯลฯ โดยไม่ต้องยุ่งกับ TTY quirks นี่คือสภาพแวดล้อมที่จัดเตรียมไว้สำหรับคำสั่งที่เรียกcomputerone
ใช้งาน
อย่างไรก็ตามเมื่อคุณเรียกใช้ ssh โดยไม่มีคำสั่งระยะไกลมันจะจัดสรร TTY เนื่องจากคุณมีแนวโน้มที่จะใช้เชลล์เซสชัน ssh otheruser@computertwo.com
คำสั่งนี้คาดว่าจะได้แต่เนื่องจากคำอธิบายก่อนหน้านี้จึงไม่มี TTY สำหรับคำสั่งนั้น
หากคุณต้องการเชลล์computertwo
ใช้ให้ใช้แทนซึ่งจะบังคับให้มีการจัดสรร TTY ในระหว่างการดำเนินการจากระยะไกล:
ssh -t user@computerone.com 'ssh otheruser@computertwo.com'
โดยทั่วไปจะเหมาะสมเมื่อคุณใช้เชลล์หรือกระบวนการโต้ตอบอื่น ๆ ในตอนท้ายของเชน ssh หากคุณกำลังจะถ่ายโอนข้อมูลมันไม่เหมาะสมหรือไม่จำเป็นต้องเพิ่ม-t
แต่จากนั้นทุกคำสั่ง ssh จะมีคำสั่งการสร้างข้อมูลหรือ -consuming เช่น:
ssh user@computerone.com 'ssh otheruser@computertwo.com "cat /boot/vmlinuz"'
มีวิธีที่ดีกว่าในการใช้ SSH เป็นรีเลย์: ใช้ProxyCommand
ตัวเลือก คุณจะต้องมีรหัสบนเครื่องไคลเอนต์ที่ให้คุณเข้าสู่ระบบคอมพิวเตอร์เครื่องที่สอง (รหัสสาธารณะเป็นวิธีที่แนะนำให้ใช้ SSH ในสถานการณ์ส่วนใหญ่) ใส่ในของคุณและเรียกใช้~/.ssh/config
ssh computertwo
Host computerone
HostName computerone.com
UserName user
Host computertwo
HostName computertwo.com
UserName otheruser
ProxyCommand ssh computerone exec nc %h %p
คาดหวังว่าเทอร์มินัลเชิงโต้ตอบบนอุปกรณ์ tty บนเซิร์ฟเวอร์ระดับกลาง
หากคุณลองคำสั่งนี้ควรทำงาน:
ssh user@computer1 -t "ssh otheruser@computer2"
ดูman ssh
สำหรับ-t
ตัวเลือก
ฉันแก้ไขมันโดยเพิ่ม RequestTTY ใช่ไปยังไฟล์ ssh config ของฉันที่ ~ / .ssh / config เช่นนี้ ...
Host myserver.com
User my-ssh-username
RequestTTY Yes
คุณสามารถใช้ตัวเลือก PROXY Jump ใน ssh
-J [user@]host[:port]
Connect to the target host by first making a ssh connection to the jump host and then establishing a TCP forwarding to the ultimate destination from there. Multiple jump hops may be specified
separated by comma characters. This is a shortcut to specify a ProxyJump configuration directive.
ดังนั้นถ้าฉันต้องการเชื่อมต่อกับ hostB แต่ฉันต้องผ่าน hostA ก่อนเพื่อไปที่นั่น โดยปกติฉันจะ
ssh hostA
[user@hostA ~]$ ssh hostB
ฉันทำสิ่งนี้แล้ว
ssh -J hostA hostB
[user@hostB ~]$
คุณสามารถแทนที่ตัวเลือกการกำหนดค่า SSH "RequestTTY" จากบรรทัดคำสั่ง
ตัวอย่างการทำงานของฉันcd-serv-one.sh
เริ่มต้น/bin/bash
ในเซสชัน SSH หลังจากใช้หลายคำสั่ง:
#!/bin/bash
ssh -o "requestTTY=yes" User@ExampleHostName "cd /home/myPathFoo/myPathBar; /bin/bash"
และตอนนี้ฉันเพิ่งจะ./cd-serv-one.sh
เริ่มเซสชัน SSH ที่ต้องการ
ssh
!