2011-02-21 11:09:34 +0000 2011-02-21 11:09:34 +0000
71
71

Liste des tunnels SSH ouverts

J'utilise beaucoup de tunnels SSH vers différents serveurs sur ma machine linux (pour la connexion à des bases de données, des serveurs web, etc.) et il serait vraiment pratique de pouvoir consulter une liste des tunnels actuellement ouverts via un script shell.

Je peux identifier les connexions locales via un grep sur netstat en s'inspirant de :

netstat -n --protocol inet | grep ':22'

mais cela ne me montrera pas le port distant auquel il est connecté (et inclut évidemment les connexions SSH standard qui ne sont pas tunnelisées)

MISE À JOUR : Les réponses sont correctes mais ne me montrent pas le port distant auquel je suis connecté. Par exemple, j'ai souvent un tunnel vers mysql, disons localhost:3308 qui correspond à :3306 sur le serveur. Normalement, je peux deviner les ports locaux que j'ai choisis, mais ce serait bien d'avoir accès aux deux.

Des idées ?

Réponses (9)

82
82
82
2011-02-21 11:22:02 +0000

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 tunnel -L 9090:localhost:80)

si vous voulez voir les tunnels / connexions créés par un 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)

le ssh-daemon écoute sur le port 22 (dernière ligne), 2 sous-processus sont générés (2 premières lignes, login de l'utilisateur), un tunnel -R créé sur le port 5000, et un tunnel -L qui transmet un port de ma machine (locale) à localhost:80 (www).

16
16
16
2013-07-08 21:45:10 +0000

n'est pas exactement la solution à votre problème, mais elle est aussi parfois pratique :

De l'intérieur d'une session ssh :

  1. appuyez sur enter
  2. tapez ~ et ensuite #

vous montre une liste de toutes les connexions ouvertes sur vos tunnels pour cette session.

16
16
16
2012-11-03 07:29:20 +0000

Essayez cette commande, elle pourrait vous être utile :

ps aux | grep ssh
7
7
7
2011-02-21 12:07:47 +0000
netstat -tpln | grep ssh
  • t : TCP
  • p : montrer le processus
  • l : écouter
  • n : valeurs numériques

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

Qui peut être lu comme : SSH (pas SSHd) écoute le port TCP local 1443.

5
5
5
2014-08-29 12:09:52 +0000

C'est le meilleur résultat de Google pour cette question, je vais donc y répondre ici. Je suis resté debout toute la nuit à filtrer les résultats, et j'ai trouvé une commande longue et complexe qui ne vous montre que vos tunnels ssh inversés dans ce format :

publicipaddress:remoteforwardedport

Voici le code, je suis sous Ubuntu Server 12. J'exécute des tunnels ssh inversés qui redirigent le port local 5900 vers mon serveur ssh public, et cette jolie commande 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
2
2
2
2019-05-15 23:10:05 +0000
report_local_port_forwardings() {

  # -a ands the selection criteria (default is or)
  # -i4 limits to ipv4 internet files
  # -P inhibits the conversion of port numbers to port names
  # -c /regex/ limits to commands matching the regex
  # -u$USER limits to processes owned by $USER
  # http://man7.org/linux/man-pages/man8/lsof.8.html
  # https://stackoverflow.com/q/34032299

  echo 
  echo "LOCAL PORT FORWARDING"
  echo
  echo "You set up the following local port forwardings:"
  echo

  lsof -a -i4 -P -c '/^ssh$/' -u$USER -s TCP:LISTEN

  echo
  echo "The processes that set up these forwardings are:"
  echo

  ps -f -p $(lsof -t -a -i4 -P -c '/^ssh$/' -u$USER -s TCP:LISTEN)

}

report_remote_port_forwardings() {

  echo 
  echo "REMOTE PORT FORWARDING"
  echo
  echo "You set up the following remote port forwardings:"
  echo

  ps -f -p $(lsof -t -a -i -c '/^ssh$/' -u$USER -s TCP:ESTABLISHED) | awk '
  NR == 1 || /R (\S+:)?[[:digit:]]+:\S+:[[:digit:]]+.*/
  '
}

report_local_port_forwardings
report_remote_port_forwardings

Exemple de sortie :

LOCAL PORT FORWARDING

You set up the following local port forwardings:

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
ssh 10086 user 7u IPv4 1924960 0t0 TCP localhost:2301 (LISTEN)
ssh 10086 user 9u IPv4 1924964 0t0 TCP localhost:2380 (LISTEN)
ssh 10086 user 11u IPv4 1924968 0t0 TCP localhost:2381 (LISTEN)

The processes that set up these forwardings are:

UID PID PPID C STIME TTY TIME CMD
user 10086 7074 0 13:05 pts/21 00:00:00 ssh -N ssh.example.com

REMOTE PORT FORWARDING

You set up the following remote port forwardings:

UID PID PPID C STIME TTY STAT TIME CMD
user 7570 30953 0 11:14 pts/18 S 0:00 ssh -N -R 9000:localhost:3000 ssh.example.com
0
0
0
2014-02-05 12:43:49 +0000
/sbin/ip tunnel list # replacement for the deprecated iptunnel command
0
0
0
2014-10-21 09:16:20 +0000
#!/bin/csh -f echo SSH Tunnels Connected echo foreach 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
0
0
0
2017-06-23 10:03:19 +0000

Comme je n'aime pas lsof, je propose une méthode alternative (un autre type 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 sont omis par défaut par netstat).

Questions connexes

6
10
19
12
15