Birden çok atlama ve hızlı kimlik doğrulama için ProxyCommand kullanımı


18

Aşağıdaki komutu nasıl yeniden yazabilirim ProxyCommand?

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

Bu işe yaramıyor

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

Kullanımının farkındayım nc, ancak 3+ atlama ile kullanmanın yolunu arıyorum ve bu seçeneği ile de kullanıyorum scp. ssh_configMan sayfasını kontrol ettim , ama en azından benim için bilgiler oldukça az.

DÜZENLE

Aşağıda önerildiği gibi ProxyCommandbaşka bir yuvada kullanmayı denedim ProxyCommandama her zaman aşağıdaki satırlarda bir şey alıyorum

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 no-more-sessions@openssh.com
debug3: send packet: type 80
debug1: Entering interactive session.

Neyse ki, o zamandan beri 7.3 -Jya da ProxyJumpamacım hizmet ediyor - yine de anahtarlarımın kurulumunu yapmak zorundayım.

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

Yanıtlar:


26

ncSürümü artık önerilmemektedir. -WOpenSSH'nin son sürümlerinde sağlanan anahtarı kullanın . Ayrıca, yapılandırmayı diğer ana bilgisayarlara kopyalamanız gerekmez! Tüm yapılandırmanın ana makinenizde yapılması gerekir ve scpherhangi bir şekilde karışmaz . Şununla bir dosya ~/.ssh/configoluşturun:

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

Ve sonra kullanarak ssh serverveya kullanın scp file server:path/. Oneliner'da ısrar ediyorsanız (veya ProxyCommandyuvalama hakkında ne demek istediğinizden emin değilseniz ), daha önce de belirtildiği gibi, bu kaçışların cehennemidir:

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

Temelde içeriden gitmeniz gerekiyor.


Teşekkürler. Tek astarı denedim, işe yaramadı. Sadece kaçan mı bilmiyorum. Tekrar kontrol edebilir misiniz lütfen? Ayrıca, yuvalamanın neden gerekli olduğunu ve zincirlemenin neden işe yaramadığını açıklayabilir misiniz?
1.61803

1
Peki "ne işe yaramaz!" anlamına gelmek? Zincirleme çalışır ancak scpSCP SCP kontrol mesajlarını beklediğinden SSH kontrol mesajlarını alır ve başarısız olur. Öte yandan, ProxyCommandşeffaf bir şekilde yapar ve bu nedenle en dıştaki ssh(veya scp) mesajları doğrudan diğer uçtan alacaktır.
Jakuje

Ben olsun > komut asla yürütür, yani - sanırım istemi nerede hat devamını kırmaya bekliyor.
1.61803

1
@TrevorBoydSmith Çünkü tüm proxy ana bilgisayarlarında bazı harici programların (nc) yüklü olmasını gerektirir. -W kullanarak IO yönlendirmesi buna ihtiyaç duymaz ve tek gereklilik bilgisayarınızda opensh istemcisinin kurulu olmasıdır.
Jakuje

2
@RomanDodin çift %çalışması gerekir: %%hsizin durumunuzda
Jakuje

-1

Bunu iki şerbetle yaptım , ama üç kez çalışmalı. En basit yol, ~/.ssh/configdosyanın her ana bilgisayarda ayarlanmasıdır. Yani, açık olmak hostave hostdüzerinden hostbve hostc` almak istiyorsanız, yapılandırmalarınızı bu şekilde ayarlayabilirsiniz:

İçinde hosta:~/.ssh/config:

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

İçinde hostb:~/.ssh/config:

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

İçinde hostc:~/.ssh/config:

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

Daha sonra ssh hostdzincirdeki ana bilgisayarlardan herhangi birine gidebilir ve yolunuzu açarsınız hostd.

Proxy için netcat kullanmak karışmaz scp.

Herhangi bir nedenden dolayı yerel ~/.ssh/configdosyaları kullanmak istemiyorsanız , bunu aşağıdakiler üzerinde yapabilirsiniz 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

Dediğim gibi, nckullanımının farkındayım . Gönderdiğim komutu aslında ProxyCommandbir seçenek olarak yeniden yazabilir misiniz ?
1.61803

"Kullanımının farkındasınız ama kullanmak istiyorsunuz" dan bahsediyorsunuz scp. Buna müdahale etmez scp. Ama kısa bir süre içinde size komik bir şekilde uzun bir komut vereceğim.
DopeGhoti

Teşekkürler. Cevabınızı yuvaya odaklanarak yeniden yazabilir misiniz ProxyCommand? Gönderiyi tekrar okursan, bunun özü olduğunu göreceksin. Senin gibi yuvalamak yerine tüm orta düğümleri zincirleyebileceğimi düşündüm ProxyCommand. Hala bunun bir şekilde mümkün olup olmadığını merak ediyorum.
1.61803

Aslında yapılan budur; tüm iç içe (ve gittikçe kaçan) alıntılar nedeniyle yerinde yapılandırmalardan okumak çok daha zor . Bunu bu şekilde yapmak zorundasınız çünkü sizinle ProxyCommandbirlikte tüm direktifleri zincirdeki bir sonraki sunucuya taşıyorsunuz .
DopeGhoti

Bu yanlış. Yapılandırma yalnızca yerel bilgisayarınızdadır, teklif vermeye çalışırken yolcular arasında dağıtılmaz.
Jakuje
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.