Daftar terowongan SSH terbuka

68

Saya menggunakan banyak terowongan SSH ke berbagai server di mesin linux saya (untuk tunneling ke database, server web, dll) dan akan sangat berguna untuk melihat daftar terowongan terbuka saat ini melalui skrip shell.

Saya dapat mengidentifikasi koneksi lokal melalui grep di netstat di sepanjang baris:

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

tapi ini tidak akan menunjukkan port remote yang terhubung (dan jelas termasuk koneksi SSH standar yang tidak disetel)

PEMBARUAN : Jawabannya baik-baik saja tetapi tidak menunjukkan port jarak jauh yang terhubung dengan saya. Misalnya saya sering memiliki terowongan ke mysql, katakan localhost: 3308 mapping ke: 3306 pada server. Biasanya saya bisa menebak dengan port lokal yang saya pilih tetapi akan lebih baik untuk memiliki akses ke keduanya.

Ada ide?

James Frost
sumber
4
Saya telah melihat beberapa pertanyaan seperti ini baru-baru ini (tidak secara spesifik apa yang Anda tanyakan), tetapi terkait dengan ssh yang memberikan informasi tentang koneksi. Sekeren ssh, itu payah menyediakan beberapa informasi dasar yang berguna seperti itu. Ada beberapa perintah internal klien yang dapat Anda jalankan seperti <ret> <ret> ~ # dan variabel lingkungan $ SSH_CONNECTION, tetapi mereka jarang detail. Daftar terowongan yang berjalan akan menyenangkan. Mungkin sudah waktunya untuk permintaan fitur.
deltaray

Jawaban:

73

jika Anda hanya ingin membuat daftar terowongan yang dibuat oleh 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)

(itu akan menjadi -L 9090: localhost: 80 tunnel)

jika Anda ingin melihat terowongan / koneksi dibuat ke 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 mendengarkan pada port 22 (baris terakhir), 2 subproses muncul (2 baris pertama, login 'user'), sebuah -R tunnel dibuat pada port 5000, dan -L tunnel yang meneruskan port dari saya ( lokal) mesin ke localhost: 80 (www).

akira
sumber
Baris ke-3 hanya ada karena soket TCP sedang digunakan. Ia hanya mengatakan sesuatu melalui ssh tunnel telah mengenai server web lokal Anda, bukan berarti port 33999 diteruskan ke yang 80.
shellholic
itulah inti dari -L terowongan ...
akira
Tidak apa-apa, ini menunjukkan alamat IP jarak jauh dan daftar port yang disetel. Idealnya saya ingin tahu adalah apa port jarak jauh dengan terowongannya. Sebagai contoh, jika saya punya terowongan terbuka dari 3308 lokal ke 3306 di server saya ingin melihat keduanya.
James Frost
untuk itu Anda harus masuk ke server dan mengeksekusi sshd-terkait lsof sana (dapat diandalkan) atau mengurai output dari / proc / PID / cmdline untuk semua perintah ssh Anda .. yang mungkin memberi Anda hasil yang menyesatkan karena Anda dapat menentukan terowongan melalui .ssh / config juga.
akira
Ya, masuk akal. Perlu sedikit lebih pintar dengan skrip kemudian untuk mengurai hasilnya, dapatkan daftar server jauh dan jalankan perintah yang sama pada masing-masing untuk mengambil port jarak jauh. Pasti bisa dilakukan. Akan mendapatkannya!
James Frost
16

Coba perintah ini, mungkin bermanfaat:

ps aux | grep ssh
Rajesh
sumber
saran saya adalah: ps aux | grep [s] shd
CousinCocaine
16

bukan solusi tepat untuk masalah Anda, tetapi terkadang juga berguna:

Dari dalam sesi ssh:

  1. tekan enter
  2. ketik ~ dan kemudian #

menampilkan daftar semua koneksi terbuka melalui terowongan Anda untuk sesi itu.

reto
sumber
2
Itu hanya berfungsi untuk terowongan interaktif (tanpa -N dan -f, ...), tetapi menarik untuk diketahui.
erik
6
netstat -tpln | grep ssh
  • t: TCP
  • p: tampilkan proses
  • l: mendengarkan
  • n: nilai numerik

EDIT: contoh untuk komentar @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        

Yang dapat dibaca sebagai: SSH (bukan SSHd) sedang mendengarkan port TCP lokal 1443.

shellholic
sumber
Perhatikan juga bahwa -phanya menunjukkan proses Anda sendiri (semua proses oleh root). Juga, perintah itu sshdjuga terlihat .
Olli
untuk terowongan -R yang harus Anda hindari-l
akira
Anda tidak dapat melihat -Rterowongan secara lokal jika tidak digunakan. Tapi benar, jika sedang digunakan, Anda dapat menangkapnya tanpa-l
shellholic
5

Ini adalah hasil teratas Google untuk pertanyaan ini, jadi saya akan memberikan jawaban saya di sini. Saya begadang semalaman memfilter hasilnya, dan muncul dengan perintah kompleks panjang yang menunjukkan Anda hanya terowongan ssh terbalik Anda dalam format ini:

publicipaddress: remoteforwardedport

Berikut adalah kode, saya menjalankan Ubuntu Server 12. Saya menjalankan terowongan ssh terbalik yang meneruskan port lokal 5900 ke server ssh publik saya, dan perintah yang bagus ini menunjukkan semua alamat ip publik saya dengan port jarak jauh.

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
Brandon
sumber
2
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

Output sampel:

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
Robin A. Meade
sumber
0
/sbin/ip tunnel list # replacement for the deprecated iptunnel command
Lucas Cimon
sumber
0
#! / bin / csh -f
gema SSH Tunnels Connected
gema
foreach f (`netstat -an -p | grep tcp | grep sshd | grep -v :: | grep -v 0:22 | grep DENGARKAN | cut -d" "-f45- | cut -d" / "-f1` )
atur 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"
gema `netstat -an -p | grep tcp | grep sshd | grep -v :: | grep -v 0:22 | grep DENGARKAN | grep $ f | cut -d ":" -f2 | cut -d "" -f1`
#echo "$ h"
akhir
Richard
sumber
0

Karena saya tidak suka lsof, saya menyarankan metode alternatif (orang lain mengajari saya :)):

$ netstat -l | grep ssh

Dengan cara ini Anda menunjukkan terowongan ssh yang dibuat oleh sshyang dibuka dalam mode LISTEN (dan dihilangkan secara default oleh netstat).

FSp
sumber