Pseudo-terminal tidak akan dialokasikan karena stdin bukan terminal


14

Saya mencoba untuk mengatur SSH otomatis melompat melalui server yang tidak memiliki nc.

Ini bekerja dari baris perintah:

ssh -A gateway ssh steve@target

(Saya telah menambahkan kunci publik saya ke agen SSH).

Namun, menambahkannya ke ~ / .ssh / config tidak:

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.

Mencoba memaksakan masalah -tini lucu tapi tidak membantu.

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.

Lagi -t? Tidak baik.

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

$ ssh target
tcgetattr: Inappropriate ioctl for device


^CKilled by signal 2.

Apakah ini mungkin? Sebagian besar tutorial (mis. Http://www.arrfab.net/blog/?p=246 ) menyarankan penggunaan nc.


Apakah kesimpulan bahwa netcat diperlukan?
MountainX-for-Monica

Sepertinya begitu. Dalam hal ini, saya dapat menginstalnya, menyelesaikan masalah saya - tetapi saya tidak selalu memiliki kemewahan itu.
Steve Bennett

Lihat jawaban saya di bawah ini untuk dua cara saya bisa melakukan ini tanpa netcat.
MountainX-for-Monica

Jawaban:


13

SSH ProxyCommand tanpa netcat

ProxyCommand sangat berguna ketika host hanya dapat diakses secara tidak langsung. Dengan netcat, ini relatif lurus:

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

Di sini {gw} dan {host} adalah placeholder untuk gateway dan host.

Tetapi juga memungkinkan ketika netcat tidak diinstal pada gateway:

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

/ Dev / tcp adalah fitur bawaan dari bash standar. File tidak ada. Untuk memeriksa apakah bash menjalankan fungsi bawaan fitur ini:

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

... di gateway.

Untuk memastikan bahwa bash digunakan, gunakan:

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

Dan itu bahkan bekerja sama dengan ControlMaster.

(Diperbarui pada 22 Oktober untuk memasukkan kill untuk membersihkan latar belakang kucing) (Diperbarui pada 3 Maret 2011 untuk membuat placeholder lebih jelas dan menjelaskan / dev / tcp)

Kredit 100% untuk roland schulz. Inilah sumbernya:
http://www.rschulz.eu/2008/09/ssh-proxycommand-without-netcat.html
lihat info lebih bermanfaat di komentar di sana.

Ada juga lebih banyak di sini:
http://www.linuxjournal.com/content/tech-tip-tcpip-access-using-bash
http://securityreliks.securegossip.com/2010/08/enabling-devtcp-on-backtrack -4r1ubuntu /

PEMBARUAN : ini sesuatu yang baru dari Marco

Mengacu pada ProxyCommand di ~ / .ssh / config di mana seseorang memiliki baris seperti ini:

ProxyCommand ssh gateway nc localhost %p

Marco berkata:

Anda tidak perlu netcat jika menggunakan versi terbaru OpenSSH. Anda dapat mengganti nc localhost% p dengan -W localhost:% p.

Hasilnya akan terlihat seperti ini:

ProxyCommand ssh gateway -W localhost:%p

8

Big T, bukan sedikit t.

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

Skrip saya digunakan untuk mengembalikan pesan itu, dan tidak lagi.

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

Saya menggunakan authorized_keypada other_system untuk menyebabkan ini menjalankan perintah:

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

3

Cobalah ini:

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

Tunggu, apa bedanya dengan yang saya coba?
Steve Bennett

@SteveBennett Perbedaannya adalah bahwa ini tidak hanya mencoba mengalokasikan TTY pada sistem kedua tetapi juga pada yang pertama.
Hauke ​​Laging

itu persis perintah yang sama yang saya sebutkan dengan hasil "lucu tapi tidak membantu"?
Steve Bennett

@SteveBennett Saya salah membaca itu, memang. Tujuan saya adalah untuk memiliki -tdi kedua koneksi dan saya melihatnya di yang salah. Saya telah mengedit jawaban saya.
Hauke ​​Laging

Ah. Yah, masih belum baik. Mencoba semua kombinasi.
Steve Bennett

-3

Anda bisa mencoba teknik ssh'ing ke server1 berikut diikuti dengan ssh'ing ke server2.

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

Melakukannya seperti ini bekerja untuk saya.


1
Tolong jelaskan lebih lanjut ... Apa yang dilakukan perintah ini dan bagaimana berguna untuk menyelesaikan jawabannya.
Tejas
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.