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

Перечислить открытые туннели SSH

Я использую много SSH туннелей к различным серверам на моей linux машине (для туннелирования к базам данных, веб серверам и т.д.), и было бы очень удобно просмотреть список текущих открытых туннелей с помощью скрипта оболочки (shell script).

я могу определить локальные соединения через grep на netstat по аналогии:

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

, но это не покажет мне удаленный порт, к которому он подключен (и, очевидно, включает в себя стандартные SSH-соединения, которые не тюнингуются)

UPDATE : Ответы в порядке, но не показывают мне удаленный порт, к которому я подключен. Например, у меня часто есть туннель до mysql, скажем localhost:3308, отображающий :3306 на сервере. Обычно я могу догадаться по выбранным локальным портам, но было бы неплохо иметь доступ к обоим.

Есть идеи?

Ответы (9)

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

если вы хотите перечислить только туннели, созданные 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)

(это будет туннель -L 9090:localhost:80)

, если вы хотите увидеть туннели / соединения, созданные с 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 прослушивает порт 22 (последняя строка), порождаются 2 подпроцесса (первые 2 строки, логин ‘пользователя’), -R туннель, созданный на порту 5000, и -L туннель, который пересылает порт с моей (локальной) машины на localhost:80 (www).

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

не совсем решение вашей проблемы, но иногда и удобное:

Из сессии ssh:

  1. нажмите enter
  2. type ~ и затем #

покажет вам список всех открытых соединений через ваши туннели для этой сессии.

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

Попробуйте эту команду, она может быть полезной:

ps aux | grep ssh
7
7
7
2011-02-21 12:07:47 +0000
netstat -tpln | grep ssh
  • т: TCP
  • p: показать процесс
  • l: прослушивание
  • n: числовые значения

EDIT: пример для комментария @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

Который можно прочитать как: SSH (не SSHd) прослушивает локальный TCP-порт 1443.

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

Это лучший результат Google для этого вопроса, поэтому я поставлю свой ответ здесь. Я не спал всю ночь, фильтруя результаты, и придумал длинную сложную команду, которая показывает вам только ваши туннели обратного ssh в этом формате:

publicipaddress:remoteforwardedport

Вот код, я запускаю Ubuntu Server 12. Я запускаю обратные туннели ssh, которые перенаправляют локальный порт 5900 на мой публичный ssh сервер, и эта отличная команда показывает все мои публичные ip адреса с удаленным портом.

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

Вывод образца:

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

Так как я не люблю lsof, я предлагаю альтернативный метод (другой парень научил меня :)):

$ netstat -l | grep ssh

Таким образом, вы показываете туннели ssh, созданные ssh, которые открываются в режиме LISTEN (и опускаются по умолчанию netstat).

Похожие вопросы

6
10
19
12
6