2010-01-04 10 views
25

J'ai écrit un small bash script qui a besoin d'un tunnel ssh pour extraire des données à partir d'un serveur distant, il demande à l'utilisateur:ssh: vérifier si un tunnel est vivant

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

Je voudrais vérifier si l'utilisateur avait ouvert ce tunnel, et sortait avec un message d'erreur si aucun tunnel n'existait. Existe-t-il un moyen d'interroger le tunnel ssh, c'est-à-dire de vérifier si le port local 6000 est réellement tunnelisé vers ce serveur?

Merci,

Adam

+0

cela pourrait aider en partie "lsof -i | ssh grep" – qartal

Répondre

26

Ceci 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 [email protected]$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 [email protected]$REMOTE_HOST netstat -an | egrep "tcp.*:$REMOTE_HTTP_PORT.*LISTEN" \ 
    > /dev/null 2>&1 
if [ $? -ne 0 ] ; then 
    pkill -f -x "$COMMAND" 
    $COMMAND 
fi 
+0

On dirait qu'il y a un bug dans le code ci-dessus. si [$? -ne 0], le 0 devrait probablement être un 1. l'egrep distant mettra $? à 0 s'il trouve une correspondance avec succès. Dans tous les cas, j'ai eu besoin d'utiliser 1 pour obtenir cette commande pour arrêter de tuer le tunnel existant chaque fois que j'ai exécuté la commande. – user2495504

7

Ceci est vraiment plus d'une question de type serverfault, mais vous pouvez utiliser netstat.

quelque chose comme:

# netstat -lpnt | grep 6000 | grep ssh 

Cela vous dira s'il y a un processus ssh écoute sur le port spécifié. il vous dira également le PID du processus.

Si vous voulez vraiment bien vérifier que le processus ssh a commencé avec les bonnes options, vous pouvez alors regarder le processus par PID quelque chose comme

# ps aux | grep PID 
+2

Notez que cette La solution ne fonctionne pas sur OS X, car netstat sur OS X est différent. – hlin117

5

Utilisez autossh. C'est l'outil qui est destiné à surveiller la connexion ssh.

16

autossh est la meilleure option - le processus de vérification ne fonctionne pas dans tous les cas (par exemple processus zombie, les problèmes liés au réseau)

exemple:

autossh -M 2323 -c arcfour -f -N -L 8088:localhost:80 host2 
25

Netcat est votre ami:

nc -z localhost 6000 || echo 'no tunnel open'; exit 1 
+0

Wow, c'est sacrément utile.Je crée un script qui crée d'abord un tunnel ssh, et j'utilise maintenant netcat pour savoir quand il est prêt à accepter les connexions. Fonctionne comme un charme. – Hubro

0
#!/bin/bash 

# Check do we have tunnel to example.com server 
lsof -i [email protected]: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

Ce sont des étapes plus détaillées pour tester ou dépanner un tunnel SSH. Vous pouvez utiliser certains d'entre eux 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. Le simple fait de saluer le processus de SSH ne suffisait pas, 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 existe une machine, qui sera appelée local avec l'adresse IP 10.0.0.1 et une autre, appelée à distance, à 10.0.3.12. Je préfèrerai ces noms d'hôtes, aux commandes ci-dessous, donc il est évident où ils sont en cours d'exécution.

L'objectif est de créer un tunnel qui transmettra le trafic TCP de l'adresse de bouclage sur la machine distante sur le port 123 à la machine locale sur le port 456.Cela peut être fait avec la commande suivante, sur la machine locale:

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

Pour vérifier que le processus est en cours d'exécution, nous pouvons faire:

local:~# ps aux | grep ssh 

Si vous voyez la commande dans la sortie, nous peut 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'adresse IP distante, ssh utilise le nom d'utilisateur actuel.

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

remote:~# netstat | grep 10.0.0.1 

Nous devrions obtenir une sortie semblable à ceci:

tcp 0 0 10.0.3.12:ssh 10.0.0.1:45988 ESTABLISHED 

Ce serait bien de réellement voir certaines données passant de la télécommande à l'hôte. C'est où netcat entre. Sur CentOS il peut être installé avec yum install nc.

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

local:~# nc -l 127.0.0.1:456 

Effectuez ensuite une connexion sur la télécommande:

remote:~# nc 127.0.0.1 123 

Si vous ouvrez une deuxième borne à 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 ceci étant en miroir sur le terminal local:

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

Le tunnel travaille! Mais que se passe-t-il si vous avez une application, appelée appname, qui est supposée écouter sur le port 456 sur la machine locale? Terminez nc des deux côtés puis exécutez votre application. Vous pouvez vérifier qu'il est à l'écoute sur le port correct avec this:

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

Par ailleurs, en cours d'exécution de la même commande sur la télécommande doit montrer sshd écoute sur le port 127.0.0.1:123.

0

Nous pouvons vérifier en utilisant la commande ps

# ps -aux | grep ssh 

affiche tous les fonctionement de Shh et nous pouvons trouver le tunnel de service répertorié

Questions connexes