Uso do ProxyCommand para vários saltos e autenticação rápida

17

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 procurando uma maneira de usá-lo com mais de 3 saltos e também use essa opção com scp. Eu verifiquei a ssh_configpágina de manual, mas as informações são bastante escassas, pelo menos para mim.

EDITAR

Tentei usar ProxyCommandaninhado em outro, ProxyCommandconforme sugerido abaixo, mas sempre recebo 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, desde 7.3 -Jou ProxyJumpserve ao meu propósito - embora eu ainda precise resolver a configuração das minhas chaves.

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

Respostas:

25

A ncversão não é mais recomendada. Use o -Wswitch, que é fornecido nas 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 isso não interfere com a configuração scp. Basta criar um arquivo ~/.ssh/configcom:

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

E então conecte usando ssh serverou use scp file server:path/. Se você insistir em um delineador (ou não tiver certeza do que você quer dizer com ProxyCommandaninhamento), então, como já apontado, é um inferno de escapadas:

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.

Jakuje
fonte
Obrigado. Tentei o one-liner, não funcionou. Não sei se é apenas a fuga. Você pode checar, por favor? Além disso, você pode explicar por que o aninhamento é necessário e o encadeamento não funciona?
1.61803 21/10
1
Bem, o que "não funciona!" significar? O encadeamento funciona, mas não com scp, porque o SCP está esperando mensagens de controle do SCP, mas recebe mensagens de controle do SSH e falha. Por outro lado, o ProxyCommandfaz de forma transparente e, portanto, o mais externo ssh(ou scp) recebe as mensagens diretamente do outro lado.
Jakuje 21/10
Eu recebo o > prompt onde está esperando para interromper a continuação da linha, eu acho - ou seja, o comando nunca é executado.
1.61803
1
@TrevorBoydSmith Porque requer que você tenha algum programa externo (nc) instalado em todos os hosts proxy. O redirecionamento de E / S usando -W não precisa disso e o único requisito é ter o cliente openssh instalado no seu computador.
Jakuje 04/07/19
2
@RomanDodin dobrar %deve funcionar: %%hno seu caso
Jakuje
-1

Eu fiz isso com dois saltos, mas deve funcionar para três. A maneira mais simples é ~/.ssh/configdefinir o arquivo em cada host. Então, se você quer ser em hostae começar a hostdvia hostbe hostc`, você pode definir suas configurações da seguinte maneira:

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 hostdem qualquer um dos hosts da cadeia e seguirá em frente hostd.

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

Se, por algum motivo, você realmente não quiser usar ~/.ssh/configarquivos locais , faça o seguinte 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
fonte
Como eu disse, estou ciente do ncuso de. Você pode realmente reescrever o comando que eu postei ProxyCommandcomo opção?
1.61803
Você menciona "você está ciente de seu uso, mas deseja usá-lo scp". Não interfere com scp. Mas darei a você o comando comicamente longo como uma edição em breve.
DopeGhoti 19/10/2016
Obrigado. Você poderia reescrever sua resposta com foco no ProxyCommandaninhamento? Se você reler meu post, verá que essa é a essência. Eu pensei que poderia, em vez de aninhar como você, encadear todos os nós do meio ProxyCommand. Ainda me pergunto se isso é possível.
1.61803
Isso é de fato o que está sendo feito; é muito mais difícil de ler do que configurações in situ devido a todas as citações aninhadas (e cada vez mais escapadas). Você precisa fazer dessa maneira porque está carregando todas as ProxyCommanddiretrizes junto ao próximo host da cadeia.
DopeGhoti 19/10/2016
Isto está errado. A configuração está apenas no seu computador local, não distribuída entre os hosts no caminho, conforme você tenta propor.
Jakuje 26/01