Puis-je faire échouer SSH en cas d'échec d'un transfert de port?

39

Si je fais un transfert de port distant, -R 3690:localhost:3690alors qu’une liaison existe déjà sur le port de l’hôte distant, je reçois cet avertissement:

Warning: remote port forwarding failed for listen port 3690

Existe-t-il un moyen de faire échouer ssh (c’est-à-dire quitter avec un code retour non nul) plutôt que de simplement émettre un avertissement?

Matt Joiner
la source
Avez-vous également besoin de créer un canal de terminal, ou simplement le transfert?
Ignacio Vazquez-Abrams
1
@ IgnacioVazquez-Abrams: Juste la transmission.
Matt Joiner

Réponses:

63

Courir

ssh -o "ExitOnForwardFailure yes" ...

ou mettre

ExitOnForwardFailure yes

dans ~/.ssh/config. Voir man ssh_configpour plus de détails.

Andrew Schulman
la source
Malheureusement, j'ai OpenSSH 4. Pouvez-vous me dire quand cette fonctionnalité a été ajoutée?
Matt Joiner
2
Non, je ne le sais pas. Ce peut être une fonctionnalité de la version 5. Mais la version 4 doit être vieille de plusieurs années et il y a toujours des correctifs de sécurité . Si vous ne pouvez pas mettre à niveau le serveur vous-même, vous pouvez demander à votre administrateur de serveur s'il pense qu'il est prudent de continuer à utiliser cette version.
Andrew Schulman
Sachez que si vous ne spécifiez pas explicitement le système, bind_addressssh pourrait ne pas échouer. Par exemple, si un autre utilisateur écoute déjà sur ipv6 localhost, [::1]:3690ssh peut ne lier que ipv4 127.0.0.1:3690et ne se plaint pas. Mais votre client svn préférerait probablement le socket ipv6 (de l'attaquant). Pour être en sécurité, mieux utiliser-R [::1]:3690:localhost:3690 -R 127.0.0.1:3690:localhost:3690
Rudimeier
3
On peut également utiliser ssh -o ExitOnForwardFailure = yes pour éviter les espaces et le besoin de guillemets.
espace libre le
1

J'utilise le script bash sur l'hôte cible pour m'assurer que le transfert a été ouvert correctement. La connexion SSH le lancera et se terminera s’il ya un problème avec la redirection de port, par exemple:

script côté client: (ceci utilise .ssh / config pour les paramètres de redirection de port)

#!/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 côté serveur (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

Peut-être même exécuter le script côté client sous screen avec -dmS

Antti Rytsölä Circles Consult
la source
2
Le cas que j'essaie d'éviter est qu'un transfert de port existe déjà et qu'un avertissement est donné. Je pense que ce script traitera une liaison existante vers le port comme un succès plutôt que comme un échec.
Matt Joiner
1
C'est vrai. Mon problème était avec le même script tenant le port ouvert pendant quelques minutes avant l'expiration du délai. Ce script quitterait et relancerait quelques fois après quoi le port serait à nouveau ouvert. Si vous avez besoin de savoir avec certitude à qui appartient le port, vous pouvez essayer de lancer netstat -anp avec sudo et de le mettre en sécurité.
Antti Rytsölä Cercles Consult
@ AnttiRytsöläCirclesConsult: Notez que vous devrez peut-être vérifier l'ID du processus, par exemple, la correspondance sur "ssh" en tant que nom du processus ne vous indique toujours pas lequel des clients SSH transmet actuellement ce port.
Piskvor