ssh: vérifier si un tunnel est vivant

j'ai écrit un petit script bash qui nécessite un tunnel ssh pour tirer des données à partir d'un serveur distant, de sorte qu'il invite l'utilisateur:

echo "Please open an ssh tunnel using 'ssh -L 6000:localhost:5432 example.com'"

je voudrais vérifier si l'Utilisateur a ouvert ce tunnel, et sortir avec un message d'erreur si aucun tunnel n'existe. Y a-t-il un moyen d'interroger le tunnel ssh , c'est-à-dire de vérifier si le port 6000 local est vraiment tunnel vers ce serveur?

28
demandé sur slm 2010-01-04 11:49:57

9 réponses

C'est mon test. J'espère que c'est utile.

# $COMMAND is the command used to create the reverse ssh tunnel
COMMAND="ssh -p $SSH_PORT -q -N -R $REMOTE_HOST:$REMOTE_HTTP_PORT:localhost:80 $USER_NAME@$REMOTE_HOST"

# Is the tunnel up? Perform two tests:

# 1. Check for relevant process ($COMMAND)
pgrep -f -x "$COMMAND" > /dev/null 2>&1 || $COMMAND

# 2. Test tunnel by looking at "netstat" output on $REMOTE_HOST
ssh -p $SSH_PORT $USER_NAME@$REMOTE_HOST netstat -an | egrep "tcp.*:$REMOTE_HTTP_PORT.*LISTEN" \
   > /dev/null 2>&1
if [ $? -ne 0 ] ; then
   pkill -f -x "$COMMAND"
   $COMMAND
fi
27
répondu Tommy 2010-10-19 13:48:27

Netcat est votre ami:

nc -z localhost 6000 || echo 'no tunnel open'; exit 1
33
répondu rwilhelm 2014-06-22 21:40:25

Autossh est la meilleure option de vérification des processus ne fonctionne pas dans tous les cas (par exemple, zombie processus, réseau liées à des problèmes)

exemple:

autossh -M 2323 -c arcfour -f -N -L 8088:localhost:80 host2
17
répondu Jeff 2016-01-09 15:35:19

c'est plus une question de type serverfault, mais vous pouvez utiliser netstat.

quelque chose comme:

 # netstat -lpnt | grep 6000 | grep ssh

cela vous indiquera s'il y a un processus SSH qui écoute sur le port spécifié. il vous indiquera également le PID du processus.

si vous voulez vraiment vérifier que le processus ssh a été démarré avec les bonnes options, vous pouvez alors regarder le processus par PID dans quelque chose comme

# ps aux | grep PID
8
répondu Igor Serebryany 2018-01-16 19:22:38

utiliser autossh . C'est l'outil qui est conçu pour surveiller la connexion ssh.

6
répondu plaes 2010-08-17 19:24:11

stunnel est un bon outil pour établir des connexions semi-permanentes entre les hôtes.

http://www.stunnel.org /

1
répondu anttir 2012-09-22 18:03:28
#!/bin/bash

# Check do we have tunnel to example.com server
lsof -i tcp@localhost:6000 > /dev/null

# If exit code wasn't 0 then tunnel doesn't exist.
if [ $? -eq 1 ]
then
  echo ' > You missing ssh tunnel. Creating one..'
  ssh -L 6000:localhost:5432 example.com
fi

echo ' > DO YOUR STUFF < '
0
répondu sobi3ch 2017-09-22 10:43:08

ce sont des étapes plus détaillées pour tester ou dépanner un tunnel SSH. Vous pouvez les utiliser dans un script. J'ajoute cette réponse parce que j'ai dû dépanner le lien entre deux applications après qu'elles aient cessé de fonctionner. Il ne suffisait pas de se réjouir du processus ssh, car il était toujours là. Et je ne pouvais pas utiliser nc -z parce que cette option n'était pas disponible sur mon incantation de netcat.

commençons par le début. Supposons qu'il y ait une machine, qui s'appellera local avec l'adresse IP 10.0.0.1 et un autre, appelé remote , à 10.0.3.12. Je vais préparer ces noms d'hôtes, aux commandes ci-dessous, donc c'est évident où ils sont exécutés.

le but est de créer un tunnel qui acheminera le trafic TCP de l'adresse de boucle sur la machine distante sur le port 123 à la machine locale sur le port 456. Cela peut être fait avec la commande suivante sur le local machine:

local:~# ssh -N -R 123:127.0.0.1:456 10.0.3.12

pour vérifier que le processus est en cours, nous pouvons faire:

local:~# ps aux | grep ssh

si vous voyez la commande dans la sortie, nous pouvons continuer. Sinon, vérifiez que la clé SSH est installée dans la télécommande. Notez qu'en excluant le nom d'utilisateur avant L'IP distante, ssh utilise le nom d'utilisateur courant.

Ensuite, nous voulons vérifier que le tunnel est ouvert sur la télécommande:

remote:~# netstat | grep 10.0.0.1

nous devrions obtenez une sortie similaire à celle-ci:

tcp  0  0  10.0.3.12:ssh  10.0.0.1:45988  ESTABLISHED

serait bien de réellement voir quelques données allant de la télécommande à l'hôte. C'est ici que netcat entre en jeu. Sur CentOS il peut être installé avec yum install nc .

d'abord, ouvrez un port d'écoute sur la machine locale:

local:~# nc -l 127.0.0.1:456

puis faire une connexion sur la télécommande:

remote:~# nc 127.0.0.1 123

si vous ouvrez un second terminal à la machine locale, vous pouvez voir la connexion. Quelque chose comme ceci:

local:~# netstat | grep 456
tcp  0  0 localhost.localdom:456 localhost.localdo:33826 ESTABLISHED
tcp  0  0 localhost.localdo:33826 localhost.localdom:456 ESTABLISHED

Mieux encore, allez-y et tapez quelque chose sur la télécommande:

remote:~# nc 127.0.0.1 8888
Hallo?
anyone there?

vous devriez voir cela se refléter sur le terminal local:

local:~# nc -l 127.0.0.1:456
Hallo?
anyone there?

le tunnel fonctionne! Mais que faire si vous avez une application, appelée appname , qui est censée être à l'écoute sur le port 456 de la machine locale? Terminez nc des deux côtés puis lancez votre application. Vous pouvez vérifier qu'il écoute sur le port correct avec ce :

local:~# netstat -tulpn | grep LISTEN | grep appname
tcp  0  0  127.0.0.1:456  0.0.0.0:* LISTEN  2964/appname

soit dit en passant, exécuter la même commande sur la télécommande devrait afficher sshd listening sur le port 127.0.0.1:123.

0
répondu Nagev 2017-11-07 08:39:41

nous pouvons vérifier en utilisant la commande ps

# ps -aux | grep ssh

montrera tout shh service en cours d'exécution et nous pouvons trouver le service tunnel listée

0
répondu Shakeel 2018-01-16 14:38:23