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

Offene SSH-Tunnel auflisten

Ich verwende eine Menge SSH-Tunnel zu verschiedenen Servern auf meinem Linux-Rechner (zum Tunneln zu Datenbanken, Webservern usw.), und es wäre wirklich praktisch, eine Liste der aktuellen offenen Tunnel über ein Shell-Skript anzuzeigen.

Ich kann lokale Verbindungen über einen Grep in netstat identifizieren, und zwar nach folgendem Muster:

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

, aber das zeigt mir nicht den entfernten Port an, mit dem er verbunden ist (und beinhaltet offensichtlich Standard-SSH-Verbindungen, die nicht getunnelt sind)

UPDATE : Die Antworten sind in Ordnung, zeigen mir aber nicht den entfernten Port an, mit dem ich verbunden bin. Ich habe z.B. oft einen Tunnel zu mysql, sagen wir localhost:3308, der auf :3306 auf dem Server abgebildet wird. Normalerweise kann ich anhand der lokalen Ports, die ich gewählt habe, raten, aber es wäre schön, Zugriff auf beide zu haben.

Irgendwelche Ideen?

Antworten (9)

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

wenn Sie nur die Tunnel auflisten wollen, die von ssh erstellt wurden:

% 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)

(das wäre ein -L 9090:localhost:80-Tunnel)

wenn Sie die Tunnel/Verbindungen sehen wollen, die von einem sshd erstellt wurden:

% 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)

Der ssh-Daemon lauscht auf Port 22 (letzte Zeile), 2 Unterprozesse werden gespawnt (erste 2 Zeilen, Login von ‘user’), ein -R-Tunnel wird auf Port 5000 erstellt, und ein -L-Tunnel, der einen Port von meinem (lokalen) Rechner an localhost:80 (www) weiterleitet.

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

nicht genau die Lösung für Ihr Problem, aber manchmal auch praktisch:

Aus einer ssh-Sitzung heraus:

  1. drücken Sie die Eingabetaste
  2. geben Sie ~ und dann #

zeigt Ihnen eine Liste aller offenen Verbindungen über Ihre Tunnel für diese Sitzung.

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

Versuchen Sie diesen Befehl, er könnte nützlich sein:

ps aux | grep ssh
7
7
7
2011-02-21 12:07:47 +0000
netstat -tpln | grep ssh
  • t: TCP
  • p: show process
  • l: listening
  • n: numerische Werte

EDIT: Beispiel für @akira Kommentar:

(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

Was gelesen werden kann als: SSH (nicht SSHd) lauscht auf dem lokalen TCP-Port 1443.

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

Dies ist das Top-Google-Ergebnis für diese Frage, also werde ich meine Antwort hier einfügen. Ich bin die ganze Nacht aufgeblieben, um die Ergebnisse zu filtern, und kam mit einem langen, komplexen Befehl heraus, der nur Ihre umgekehrten ssh-Tunnel in diesem Format anzeigt:

publicipaddress:remoteforwardedport

Hier ist der Code, ich verwende Ubuntu Server 12. Ich verwende Reverse-SH-Tunnel, die den lokalen Port 5900 an meinen öffentlichen SSH-Server weiterleiten, und dieser raffinierte Befehl zeigt alle meine öffentlichen IP-Adressen mit dem Remote-Port an.

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

Musterausgang:

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

Da ich lsof nicht mag, schlage ich eine alternative Methode vor (hat mir ein anderer beigebracht :)):

$ netstat -l | grep ssh

Auf diese Weise zeigen Sie die von ssh erstellten ssh-Tunnel an, die im LISTEN-Modus geöffnet sind (und von netstat standardmäßig ausgelassen werden).

Verwandte Fragen

6
10
19
12
2