Pseudo-terminal จะไม่ถูกจัดสรรเนื่องจาก stdin ไม่ใช่เทอร์มินัล


14

ฉันกำลังพยายามตั้งค่า SSH อัตโนมัติโดยการข้ามเซิร์ฟเวอร์ที่ไม่มี nc

ใช้งานได้จากบรรทัดคำสั่ง:

ssh -A gateway ssh steve@target

(ฉันได้เพิ่มกุญแจสาธารณะของฉันไปยังตัวแทน SSH)

อย่างไรก็ตามการเพิ่มลงใน ~ / .ssh / config ไม่ได้:

Host target
  User steveb
  ProxyCommand ssh -A gateway ssh steve@targetip

$ ssh target
Pseudo-terminal will not be allocated because stdin is not a terminal.


^CKilled by signal 2.

ความพยายามในการบังคับใช้ปัญหาด้วยความ-tสนุกสนาน แต่ไม่ช่วยเหลือ

ProxyCommand ssh -A -t gateway ssh steve@targetip

$ ssh target
Pseudo-terminal will not be allocated because stdin is not a terminal.
Pseudo-terminal will not be allocated because stdin is not a terminal.


^CKilled by signal 2.

เพิ่มเติม-t's? ไม่ดี.

ProxyCommand ssh -A -t -t gateway ssh steve@targetip

$ ssh target
tcgetattr: Inappropriate ioctl for device


^CKilled by signal 2.

เป็นไปได้ไหม บทเรียนมากที่สุด (เช่นhttp://www.arrfab.net/blog/?p=246 ) ncแนะนำให้ใช้


สรุปว่าจำเป็นต้องมี netcat หรือไม่?
MountainX

ดูเหมือนว่ามัน ในตัวอย่างนี้ฉันสามารถติดตั้งแก้ปัญหาของฉัน - แต่ฉันไม่ได้หรูหรา
Steve Bennett

ดูคำตอบของฉันด้านล่างสำหรับสองวิธีที่ฉันสามารถทำได้โดยไม่ใช้ netcat
MountainX

คำตอบ:


13

SSH ProxyCommand โดยไม่มี netcat

ProxyCommand มีประโยชน์มากเมื่อโฮสต์เข้าถึงได้ทางอ้อมเท่านั้น ด้วย netcat มันเป็นช่องแคบญาติไปข้างหน้า:

ProxyCommand ssh {gw} netcat -w 1 {host} 22

ที่นี่ {gw} และ {host} เป็นตัวยึดตำแหน่งสำหรับเกตเวย์และโฮสต์

แต่ก็เป็นไปได้เช่นกันเมื่อไม่ได้ติดตั้ง netcat บนเกตเวย์:

ProxyCommand ssh {gw} 'exec 3<>/dev/tcp/{host}/22; cat <&3 & cat >&3;kill $!'

/ dev / tcp เป็นคุณสมบัติในตัวของ bash มาตรฐาน ไฟล์ไม่มีอยู่ ในการตรวจสอบว่าทุบตีมีการใช้งานในตัวคุณลักษณะนี้:

cat < /dev/tcp/google.com/80 

... บนเกตเวย์

เพื่อให้แน่ใจว่ามีการใช้ bash ให้ใช้:

ProxyCommand ssh {gw} "/bin/bash -c 'exec 3<>/dev/tcp/{host}/22; cat <&3 & cat >&3;kill $!'"

และมันยังทำงานร่วมกับ ControlMaster ได้

(อัปเดตเมื่อวันที่ 22 ต.ค. เพื่อรวมการฆ่าเพื่อล้างแมวพื้นหลัง) (อัปเดตเมื่อวันที่ 3 มีนาคม 2011 เพื่อให้ตัวยึดตำแหน่งชัดเจนยิ่งขึ้นและอธิบาย / dev / tcp)

เครดิต 100% กับ roland schulz นี่คือแหล่งที่มา:
http://www.rschulz.eu/2008/09/ssh-proxycommand-without-netcat.html
ดูข้อมูลที่เป็นประโยชน์เพิ่มเติมในความคิดเห็นที่นั่น

นอกจากนี้ยังมีเพิ่มเติมได้ที่นี่:
http://www.linuxjournal.com/content/tech-tip-tcpip-access-using-bash
http://securityreliks.securegossip.com/2010/08/enabling-devtcp-on-backtrack -4r1ubuntu /

UPDATE : นี่คือสิ่งใหม่จากMarco

ในการอ้างอิงถึง ProxyCommand ใน ~ / .ssh / config โดยที่หนึ่งมีบรรทัดดังนี้:

ProxyCommand ssh gateway nc localhost %p

มาร์โกพูดว่า:

คุณไม่ต้องการ netcat ถ้าคุณใช้ OpenSSH เวอร์ชันล่าสุด คุณสามารถแทนที่ nc localhost% p ด้วย -W localhost:% p

ผลลัพธ์จะเป็นดังนี้:

ProxyCommand ssh gateway -W localhost:%p

8

T ใหญ่ไม่น้อย t

-T' Disable pseudo-tty allocation.
-t' Force pseudo-tty allocation. 

สคริปต์ของฉันใช้เพื่อส่งคืนข้อความนั้นและไม่อีกต่อไป

/usr/bin/ssh -T -q -i $HOME/.ssh/one_command other_system

ฉันใช้authorized_keyบน other_system เพื่อให้สิ่งนี้เพื่อเรียกใช้คำสั่ง:

from="my.mydomain.com",command="bin/remotely-run" ssh-rsa ... 

3

ลองดูสิ:

ProxyCommand ssh -A -t gateway ssh -t steve@targetip

เดี๋ยวก่อนมันแตกต่างจากที่ฉันเคยลองมาอย่างไร
Steve Bennett

@SteveBennett ความแตกต่างคือสิ่งนี้ไม่เพียง แต่พยายามจัดสรร TTY ในระบบที่สอง แต่ในครั้งแรกด้วย
Hauke ​​Laging

มันเป็นคำสั่งเดียวกับที่ฉันพูดถึงด้วยผลลัพธ์ที่ "น่าขบขัน แต่ไม่ช่วยเหลือ"
Steve Bennett

@ SteveBennett ฉันเข้าใจผิดจริง ๆ เป้าหมายของฉันคือการ-tเชื่อมต่อทั้งสองและฉันเห็นมันผิด ฉันได้แก้ไขคำตอบของฉัน
Hauke ​​Laging

อา. ก็ยังไม่ดี พยายามรวมกันทั้งหมด
Steve Bennett

-3

คุณสามารถลองใช้เทคนิคต่อไปนี้ของ ssh'ing เป็น server1 ตามด้วย ssh'ing เป็น server2

$ ssh -t user1@server1 ssh -t user2@server2 

ทำแบบนี้ได้ผลกับฉัน


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