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

Lijst van open SSH tunnels

Ik gebruik veel SSH tunnels naar verschillende servers op mijn linux machine (voor tunneling naar databases, web servers etc) en het zou erg handig zijn om een lijst van huidige open tunnels te bekijken via een shell script.

Ik kan lokale verbindingen identificeren via een grep op netstat in de trant van:

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

maar dit laat me niet de poort op afstand zien waarmee het verbonden is (en omvat uiteraard standaard SSH-verbindingen die niet getunneld zijn)

UPDATE : De antwoorden zijn goed, maar tonen me niet de poort op afstand waarmee ik verbonden ben. Ik heb bijvoorbeeld vaak een tunnel door naar mysql, bijvoorbeeld localhost:3308 die leidt naar :3306 op de server. Normaal gesproken kan ik het raden aan de hand van de lokale poorten die ik heb gekozen, maar het zou fijn zijn om toegang te hebben tot beide.

Iemand een idee?

Antwoorden (9)

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

als u alleen de tunnels wilt zien die door ssh zijn gemaakt:

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

(dat zou een -L 9090:localhost:80 tunnel zijn)

als je de tunnels / verbindingen gemaakt met een sshd wilt zien:

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

de ssh-daemon luistert op poort 22 (laatste regel), 2 subprocessen worden gespawned (eerste 2 regels, login van ‘user’), een -R tunnel aangemaakt op poort 5000, en een -L tunnel die een poort van mijn (lokale) machine doorstuurt naar localhost:80 (www).

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

niet precies de oplossing voor je probleem, maar soms ook handig:

Vanuit een ssh-sessie:

  1. druk op enter
  2. type ~ en dan #

laat je een lijst zien van alle open verbindingen over je tunnels voor die sessie.

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

Probeer dit commando, het kan nuttig zijn:

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: numerieke waarden

EDIT: voorbeeld voor @akira comment:

(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

Wat gelezen kan worden als: SSH (niet SSHd) luistert naar lokale TCP poort 1443.

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

Dit is het bovenste google-resultaat voor deze vraag, dus ik zal mijn antwoord hier plaatsen. Ik ben de hele nacht opgebleven om de resultaten te filteren, en kwam met een lang complex commando dat je alleen je reverse ssh tunnels in dit formaat laat zien:

publicipaddress:remoteforwardedport

Hier is de code, ik draai Ubuntu Server 12. Ik draai reverse ssh tunnels die lokale poort 5900 doorsturen naar mijn publieke ssh server, en dit handige commando toont al mijn publieke ip-adressen met de poort op afstand.

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

Voorbeeld uitgang:

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

Aangezien ik niet van lsof hou, stel ik een alternatieve methode voor (een andere kerel leerde het me :)):

$ netstat -l | grep ssh

Op deze manier laat je de ssh tunnels zien die door ssh zijn aangemaakt en in LISTEN mode zijn geopend (en standaard door netstat zijn weggelaten).