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.

Steve Bennett
sumber
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
MountainX-for-Monica
sumber
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 ... 
pengguna46083
sumber
3

Cobalah ini:

ProxyCommand ssh -A -t gateway ssh -t steve@targetip
Hauke ​​Laging
sumber
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.

Jan Marius Evang
sumber
1
Tolong jelaskan lebih lanjut ... Apa yang dilakukan perintah ini dan bagaimana berguna untuk menyelesaikan jawabannya.
Tejas