Penggunaan ProxyCommand untuk beberapa lompatan dan otentikasi yang cepat

17

Bagaimana saya bisa menulis ulang perintah berikut ProxyCommand?

ssh -l username1 -t jumphost1 \
ssh -l username2 -t jumphost2 \
ssh -l username3 -t jumphost3 \
ssh -l username4    server

Ini tidak berhasil

ssh -o ProxyCommand="\
ssh -l username1 -t jumphost1  \
ssh -l username2 -t jumphost2  \
ssh -l username3 -t jumphost3" \
    -l username4    server

username1@jumphost1's password:
Pseudo-terminal will not be allocated because stdin is not a terminal.
Permission denied, please try again.
Permission denied, please try again.
Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
ssh_exchange_identification: Connection closed by remote host

Saya mengetahui penggunaannya nc, tetapi saya sedang mencari cara untuk menggunakannya dengan 3+ hop, dan juga menggunakan opsi ini dengan scp. Saya memeriksa ssh_confighalaman manual, tetapi informasinya cukup langka, setidaknya bagi saya.

EDIT

Saya mencoba menggunakan ProxyCommandbersarang di yang lain ProxyCommandseperti yang disarankan di bawah ini tetapi saya selalu mendapatkan sesuatu di sepanjang baris berikut

debug3: ssh_init_stdio_forwarding: 192.17.2.2:2222
debug1: channel_connect_stdio_fwd 192.17.2.2:2222
debug1: channel 0: new [stdio-forward]
debug2: fd 4 setting O_NONBLOCK
debug2: fd 5 setting O_NONBLOCK
debug1: getpeername failed: Bad file descriptor
debug3: send packet: type 90
debug2: fd 3 setting TCP_NODELAY
debug3: ssh_packet_set_tos: set IP_TOS 0x10
debug1: Requesting [email protected]
debug3: send packet: type 80
debug1: Entering interactive session.

Untungnya, karena 7.3 -Jatau ProxyJumpmelayani tujuan saya - meskipun saya masih harus memperbaiki pengaturan kunci saya.

ssh -q -J user1@jumphost1,user2@jumphost2,user3@jumphost3 user@server
1.61803
sumber

Jawaban:

25

The ncVersi tidak dianjurkan lagi. Gunakan -Wsakelar, yang disediakan dalam versi terbaru OpenSSH. Anda juga tidak perlu menyalin konfigurasi ke host lain! Semua konfigurasi perlu dilakukan pada host Anda dan itu tidak mengganggu dengan scpcara apa pun. Cukup buat file ~/.ssh/configdengan:

Host jumphost1
  User username1
Host jumphost2
  User username2
  ProxyCommand ssh -W %h:%p jumphost1
Host jumphost3
  User username3
  ProxyCommand ssh -W %h:%p jumphost2
Host server
  User username4
  ProxyCommand ssh -W %h:%p jumphost3

Dan kemudian hubungkan menggunakan ssh serveratau menggunakan scp file server:path/. Jika Anda bersikeras menggunakan oneliner (atau tidak yakin apa yang Anda maksud tentang ProxyCommandbersarang), maka seperti yang sudah ditunjukkan, itu adalah neraka yang lolos:

ssh -oProxyCommand= \
  'ssh -W %h:%p -oProxyCommand= \
    \'ssh -W %h:%p -oProxyCommand= \
      \\\'ssh -W %h:%p username1@jumphost1\\\' \
    username2@jumphost2\' \
  username3@jumphost3' \
username4@server

Anda pada dasarnya harus pergi dari dalam.

Jakuje
sumber
Terima kasih. Mencoba satu kalimat, tidak berhasil. Saya tidak tahu apakah itu hanya pelariannya saja. Bisakah Anda memeriksa ulang? Juga, dapatkah Anda menjelaskan mengapa bersarang itu diperlukan dan rantai tidak berfungsi?
1.61803
1
Nah, Apa yang "tidak berhasil!" berarti? Chaining berfungsi, tetapi tidak dengan scp, karena SCP mengharapkan pesan kontrol SCP, tetapi sebaliknya mendapatkan pesan kontrol SSH dan gagal. Di sisi lain, ProxyCommandia melakukannya secara transparan dan karena itu yang paling luar ssh(atau scp) akan mendapatkan pesan langsung dari ujung yang lain.
Jakuje
Saya mendapatkan > prompt di mana menunggu untuk memecah kelanjutan garis, saya kira - yaitu, perintah tidak pernah dijalankan.
1.61803
1
@TrevorBoydSmith Karena itu mengharuskan Anda untuk memiliki beberapa program eksternal (nc) diinstal pada semua host proxy. Pengalihan IO menggunakan -W tidak memerlukan itu dan satu-satunya persyaratan adalah memiliki openssh client diinstal pada komputer Anda.
Jakuje
2
@RomanDodin ganda %harus berfungsi: %%hdalam kasus Anda
Jakuje
-1

Saya telah melakukan ini dengan dua lompatan, tetapi itu harus bekerja untuk tiga. Cara paling sederhana adalah ~/.ssh/configmengatur file pada setiap host. Jadi, jika Anda ingin aktif hostadan mengakses hostdvia hostbdan hostc`, Anda dapat mengatur konfigurasi Anda sebagai berikut:

Dalam hosta:~/.ssh/config:

Host hostd
    User username
    ProxyCommand ssh hostb nc %h %p 2> /dev/null

Dalam hostb:~/.ssh/config:

Host hostd
    User username
    ProxyCommand ssh hostc nc %h %p 2> /dev/null

Dalam hostc:~/.ssh/config:

Host hostd
    User username
    ProxyCommand ssh hostd nc %h %p 2> /dev/null

Anda kemudian dapat ssh hostdpada salah satu host di rantai dan Anda akan membuat jalan Anda hostd.

Menggunakan netcat untuk proksi tidak mengganggu scp.

Jika karena alasan tertentu Anda benar-benar tidak ingin menggunakan ~/.ssh/configfile lokal , Anda dapat melakukannya di hosta:

ssh -oProxyCommand='ssh -oProxyCommand=\'ssh -o ProxyCommand=\\\'ssh username@hostd nc %h %p 2>/dev/null\\\' username@hostc nc %h %p 2> /dev/null' username@hostb nc %h %p 2> /dev/null' username@hostd
DopeGhoti
sumber
Seperti yang saya katakan, saya sadar ncakan penggunaannya. Bisakah Anda benar-benar menulis ulang perintah yang saya kirim ProxyCommandsebagai opsi?
1.61803
Anda menyebutkan "Anda mengetahui penggunaannya tetapi ingin menggunakan scp". Itu tidak mengganggu scp. Tapi saya akan memberi Anda perintah panjang yang lucu sebagai suntingan segera.
DopeGhoti
Terima kasih. Bisakah Anda menulis ulang jawaban yang berfokus pada ProxyCommandbersarang? Jika Anda membaca ulang posting saya, Anda akan melihat itulah intinya. Saya pikir saya bisa, bukannya bersarang seperti Anda, rantai semua node tengah ProxyCommand. Saya masih bertanya-tanya apakah itu mungkin terjadi.
1.61803
Sebenarnya itulah yang sedang dilakukan; itu hanya jauh lebih sulit untuk dibaca daripada konfigurasi in situ karena semua kutipan bersarang (dan semakin lolos). Anda harus melakukannya dengan cara itu karena Anda membawa semua ProxyCommandarahan bersama Anda ke host berikutnya dalam rantai.
DopeGhoti
Ini salah. Konfigurasi hanya di komputer lokal Anda, tidak didistribusikan di antara host di jalan saat Anda mencoba untuk mengusulkan.
Jakuje