ProxyCommand use para vários saltos e autenticação de prompt

11

Como posso reescrever o seguinte comando com ProxyCommand ?

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

Isso não funciona

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

Estou ciente de seu uso com nc , mas estou pesquisando como usá-lo com 3+ saltos e também usar essa opção com scp . Eu verifiquei ssh_config man page, mas a informação é bastante escassa, pelo menos para mim.

EDITAR

Eu tentei usar ProxyCommand aninhado em outro ProxyCommand como sugerido abaixo, mas sempre consigo algo nas seguintes linhas

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.

Felizmente, como 7.3 -J ou ProxyJump serve ao meu propósito - embora eu ainda precise trabalhar na configuração das minhas chaves.

ssh -q -J user1@jumphost1,user2@jumphost2,user3@jumphost3 user@server
    
por 1.61803 19.10.2016 / 17:47

2 respostas

15

A versão nc não é mais recomendada. Use a opção -W , que é fornecida em versões recentes do OpenSSH. Além disso, você não precisa copiar a configuração para outros hosts! Toda a configuração precisa ser feita no seu host e não interfere de forma alguma no scp . Basta criar um arquivo ~/.ssh/config com:

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

Em seguida, conecte-se usando ssh server ou use scp file server:path/ . Se você insiste em oneliner (ou não tem certeza do que você quer dizer sobre ProxyCommand nesting), então como já apontado, é um inferno de escapes:

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

Você basicamente precisa ir de dentro.

    
por 20.10.2016 / 11:02
-1

Eu fiz isso com dois saltos, mas deve funcionar por três. A maneira mais simples é ter o arquivo ~/.ssh/config definido em cada host. Então, se você quer estar em hosta e chegar a hostd via hostb e hostc ', você pode definir suas configurações desta forma:

Em hosta:~/.ssh/config :

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

Em hostb:~/.ssh/config :

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

Em hostc:~/.ssh/config :

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

Você pode então ssh hostd em qualquer um dos hosts da cadeia e você chegará em hostd .

O uso do netcat para o proxy não interfere no scp .

Se, por alguma razão, você realmente não quiser usar os arquivos ~/.ssh/config locais, poderá fazer isso em 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
    
por 19.10.2016 / 17:57

Tags