Posso fazer com que o SSH falhe quando um encaminhamento de porta falha?

39

Se eu encaminhar uma porta remota, a la -R 3690:localhost:3690quando uma ligação já existir na porta do host remoto, recebo este aviso:

Warning: remote port forwarding failed for listen port 3690

Existe uma maneira de o ssh falhar (ou seja, sair com um código de retorno diferente de zero), em vez de apenas emitir um aviso?

Matt Joiner
fonte
Você realmente precisa criar um canal terminal também, ou apenas o encaminhamento?
Ignacio Vazquez-Abrams
11
@ IgnacioVazquez-Abrams: Apenas o encaminhamento.
Matt Joiner

Respostas:

63

Corre

ssh -o "ExitOnForwardFailure yes" ...

ou colocar

ExitOnForwardFailure yes

em ~/.ssh/config. Veja man ssh_configpara detalhes.

Andrew Schulman
fonte
Infelizmente eu tenho o OpenSSH 4. Você pode me dizer quando esse recurso foi adicionado?
Matt Joiner
2
Não sei disso. Pode ser um recurso da versão 5. Mas a versão 4 deve ter muitos anos agora e existem correções de segurança o tempo todo. Se você não conseguir atualizar o servidor, pergunte ao administrador do servidor se ele acha seguro continuar usando essa versão.
Andrew Schulman
Esteja ciente de que, se você não especificar explicitamente, o bind_addressssh ainda poderá não falhar. Por exemplo, se outro usuário já estiver ouvindo no localhost do ipv6 [::1]:3690, o ssh poderá vincular apenas o ipv4 127.0.0.1:3690e não se queixar. Mas seu cliente svn provavelmente prefere o soquete ipv6 (do invasor). Para estar seguro, use-o melhor-R [::1]:3690:localhost:3690 -R 127.0.0.1:3690:localhost:3690
rudimeier
3
Pode-se também usar ssh -o ExitOnForwardFailure = yes para evitar espaços em branco e a necessidade de citar.
freespace
1

Eu uso o script bash no host de destino para garantir que o encaminhamento foi aberto corretamente. A conexão SSH executará isso e sairá se houver algum problema com o encaminhamento de porta, por exemplo,

script do lado do cliente: (usa .ssh / config para configurações de encaminhamento de porta)

#!/bin/bash    

while true; do
    echo -n starting at : "
    date
    ssh user@server bin/sshloop.sh
    echo "got back, sleeping 17 "
    sleep 17
done 

script do lado do servidor (bin / sshloop.sh)

#!/bin/bash

while true; do 
  echo $(date)" : SSH Reverse 1090:80, 1232:22 From Server to Client"
  sleep 17
  if ! netstat -an | grep -q ":::1090 " ; then
     echo "1090 forward missing, bailing out"
     exit
  fi
done

Talvez até execute o script do lado do cliente na tela com -dmS

Antti Rytsölä Circles Consult
fonte
2
O caso que estou tentando evitar é que uma porta encaminhada já exista e um aviso seja dado. Eu acho que esse script tratará uma ligação existente à porta como sucesso, e não como falha.
Matt Joiner
11
Isso é verdade. Meu problema foi com o mesmo script mantendo a porta aberta por alguns minutos antes de atingir o tempo limite. Este script seria encerrado e executado novamente algumas vezes, após o qual a porta seria aberta novamente. Se você precisa saber com certeza quem é o proprietário da porta, tente executar o netstat -anp com o sudo e cumpri-lo.
Círculos Antti Rytsölä Consulte
@ AnttiRytsöläCirclesConsult: Observe que você pode precisar verificar o ID do processo, por exemplo, a correspondência em "ssh" como nome do processo ainda não informa qual cliente SSH está encaminhando essa porta no momento.
Piskvor 18/03