SSH ภายใน SSH ล้มเหลวด้วย“ stdin: ไม่ใช่ tty”


58

ฉันกำลังพยายามเชื่อมต่อกับเครื่องหนึ่งด้วย ssh แล้วเชื่อมต่อกับเครื่องอีกสองเครื่องด้วย ssh แต่ฉันได้รับข้อผิดพลาดนี้

ssh user@computerone.com 'ssh otheruser@computertwo.com'

stdin: is not a tty

ทำไม?


1
ฉันไม่คิดว่าคุณต้องการคำพูดเดียวเหล่านั้นในรอบที่สองssh!
coffeMug

คำตอบ:


70

ตามค่าเริ่มต้นเมื่อคุณเรียกใช้คำสั่งบนเครื่องระยะไกลโดยใช้ 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"'

9

มีวิธีที่ดีกว่าในการใช้ SSH เป็นรีเลย์: ใช้ProxyCommandตัวเลือก คุณจะต้องมีรหัสบนเครื่องไคลเอนต์ที่ให้คุณเข้าสู่ระบบคอมพิวเตอร์เครื่องที่สอง (รหัสสาธารณะเป็นวิธีที่แนะนำให้ใช้ SSH ในสถานการณ์ส่วนใหญ่) ใส่ในของคุณและเรียกใช้~/.ssh/configssh computertwo

Host computerone
HostName computerone.com
UserName user

Host computertwo
HostName computertwo.com
UserName otheruser
ProxyCommand ssh computerone exec nc %h %p

ncเป็นnetcat เวอร์ชันใด ๆ ที่มีอยู่จะมีให้เลือก


เราไม่จำเป็นต้องเพิ่ม "พร็อกซี" - บรรทัดที่เกี่ยวข้องใน 'authorized_keys' ในคอมพิวเตอร์หรือไม่ ฉันตั้งใจจะดูว่าพลังของ 'proxy' ของ openSSH แต่ยังไม่ได้รับมัน
เฟลิเป้อัลวาเรซ

7

คาดหวังว่าเทอร์มินัลเชิงโต้ตอบบนอุปกรณ์ tty บนเซิร์ฟเวอร์ระดับกลาง

หากคุณลองคำสั่งนี้ควรทำงาน:

ssh user@computer1 -t "ssh otheruser@computer2"

ดูman sshสำหรับ-tตัวเลือก


2

ฉันแก้ไขมันโดยเพิ่ม RequestTTY ใช่ไปยังไฟล์ ssh config ของฉันที่ ~ / .ssh / config เช่นนี้ ...

Host myserver.com
  User my-ssh-username
  RequestTTY Yes

1

คุณสามารถใช้ตัวเลือก 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 ~]$

0

คุณสามารถแทนที่ตัวเลือกการกำหนดค่า 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 ที่ต้องการ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.