J'utilise beaucoup de tunnels SSH vers différents serveurs sur ma machine Linux (pour la gestion de tunnels vers des bases de données, des serveurs Web, etc.) et il serait très pratique d'afficher une liste des tunnels actuellement ouverts via un script Shell.
Je peux identifier les connexions locales via un grep sur netstat du type:
netstat -n --protocol inet | grep ':22'
mais cela ne me montrera pas le port distant auquel elle est connectée (et inclut évidemment les connexions SSH standard non tunnellées)
UPDATE: Les réponses sont correctes mais ne me montrent pas le port distant auquel je suis connecté. Par exemple, j'ai souvent un tunnel menant à mysql, disons localhost: 3308 en correspondance avec: 3306 sur le serveur. Normalement, je peux deviner par les ports locaux que j'ai choisis mais ce serait bien d'avoir accès aux deux.
Des idées?
si vous voulez seulement lister les tunnels créés par ssh
:
% Sudo lsof -i -n | egrep '\<ssh\>'
ssh 19749 user 3u IPv4 148088244 TCP x.x.x.x:39689->y.y.y.y:22 (ESTABLISHED)
ssh 19749 user 4u IPv6 148088282 TCP [::1]:9090 (LISTEN)
ssh 19749 user 5u IPv4 148088283 TCP 127.0.0.1:9090 (LISTEN)
(ce serait un -L 9090: localhost: 80 tunnel)
si vous voulez voir les tunnels/connexions établis avec une sshd
:
% Sudo lsof -i -n | egrep '\<sshd\>'
sshd 15767 root 3u IPv4 147401205 TCP x.x.x.x:22->y.y.y.y:27479 (ESTABLISHED)
sshd 15842 user 3u IPv4 147401205 TCP x.x.x.x:22->y.y.y.y:27479 (ESTABLISHED)
sshd 15842 user 9u IPv4 148002889 TCP 127.0.0.1:33999->127.0.0.1:www (ESTABLISHED)
sshd 1396 user 9u IPv4 148056581 TCP 127.0.0.1:5000 (LISTEN)
sshd 25936 root 3u IPv4 143971728 TCP *:22 (LISTEN)
ssh-daemon écoute sur le port 22 (dernière ligne), 2 sous-processus sont générés (les 2 premières lignes, login de 'utilisateur'), un tunnel -R créé sur le port 5000 et un tunnel -L qui transmet un port de my ( local) machine à localhost: 80 (www).
Essayez cette commande, elle pourrait être utile:
ps aux | grep ssh
pas exactement la solution à votre problème, mais aussi pratique parfois:
Depuis une session SSH:
vous montre une liste de toutes les connexions ouvertes sur vos tunnels pour cette session.
netstat -tpln | grep ssh
EDIT: exemple pour le commentaire @akira:
(header added, tested on Debian wheezy)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:1443 0.0.0.0:* LISTEN 4036/ssh
Ce qui peut être lu comme suit: SSH (pas SSHd) écoute le port local TCP 1443.
Ceci est le meilleur résultat de Google pour cette question, je vais donc mettre ma réponse ici. Je suis resté éveillé toute la nuit à filtrer les résultats et à proposer une longue commande complexe qui vous montre uniquement vos tunnels ssh inversés dans ce format:
publicipaddress: remoteforwardedport
Voici le code. J'utilise Ubuntu Server 12. J'utilise des tunnels SSH inversés qui transmettent le port local 5900 à mon serveur SSH public et cette commande astucieuse affiche toutes mes adresses IP publiques avec le port distant.
Sudo lsof -i -n | egrep '\<sshd\>' | grep -v ":ssh" | grep LISTEN | sed 1~2d | awk '{ print $2}' | while read line; do Sudo lsof -i -n | egrep $line | sed 3~3d | sed 's/.*->//' | sed 's/:......*(ESTABLISHED)//' | sed 's/.*://' | sed 's/(.*//' | sed 'N;s/\n/:/' 2>&1 ;done
/sbin/ip tunnel list # replacement for the deprecated iptunnel command
Comme je n'aime pas lsof, je suggère une méthode alternative (un autre gars m'a appris :)):
$ netstat -l | grep ssh
De cette façon, vous montrez les tunnels SSH créés par ssh
qui sont ouverts en mode LISTEN (et omis par défaut par netstat
).
#!/bin/csh -f echo tunnels SSH connectés echo pour chaque f (`netstat -an -p | grep tcp | grep sshd | grep -v :: | grep -v 0:22 | grep LISTEN | cut -d "" -f45- | cut -d "/" -f1`) set ip = `netstat -an -p | grep tcp | grep sshd | grep -v :: | grep -v 0:22 | grep ESTABLISH | grep $ f | cut -d "" -f20- | cut -d ":" -f1` # set h = `grep -a" $ ip "/htdocs/impsip.html | grep br | cut -d "" -f2` echo -n "$ ip" echo `netstat -an -p | grep tcp | grep sshd | grep -v :: | grep -v 0:22 | grep LISTEN | grep $ f | cut -d ":" -f2 | cut -d "" -f1` # echo "$ h" end