59

Я использую множество SSH-туннелей к различным серверам на моем компьютере с Linux (для туннелирования к базам данных, веб-серверам и т.д.), И было бы очень удобно просматривать список текущих открытых туннелей с помощью сценария оболочки.

Я могу идентифицировать локальные соединения с помощью grep на netstat, например:

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

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

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

Есть идеи?

8 ответов8

64

если вы хотите перечислить только туннели, созданные 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 строки, логин 'user'), туннель -R, созданный на порте 5000, и туннель -L, который перенаправляет порт из моего ( локальный) машина для localhost:80 (www).

13

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

ps aux | grep ssh
11

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

Из сеанса SSH:

  1. нажмите Ввод
  2. введите ~ и затем #

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

6
netstat -tpln | grep ssh
  • t: TCP
  • p: показать процесс
  • л: слушая
  • n: числовые значения

РЕДАКТИРОВАТЬ: пример для комментария @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.

4

Это лучший результат 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
0
/sbin/ip tunnel list # replacement for the deprecated iptunnel command
0

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

$ netstat -l | grep ssh

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

0
#!/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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .