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?


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.


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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.