Daftar semua sesi SSH yang terhubung?

184

Saya baru saja SSH menjadi root, dan kemudian SSH lagi menjadi root pada mesin yang sama. Jadi saya punya dua jendela yang membuka kedua SSH menjadi root pada mesin remote saya.

Dari shell, bagaimana saya bisa melihat daftar dua sesi ini?

kaca
sumber

Jawaban:

188

whoatau w; who -auntuk informasi tambahan.

Perintah-perintah ini hanya menunjukkan semua sesi login pada perangkat terminal. Sesi SSH akan berada pada slave pseudo-terminal ( pts) seperti yang ditunjukkan pada TTYkolom, tetapi tidak semua koneksi Poin adalah sesi SSH. Misalnya, program yang membuat perangkat terminal semu seperti xtermatau screenakan ditampilkan sebagai pts. Lihat Perbedaan antara Poin dan tty untuk deskripsi yang lebih baik dari nilai yang berbeda yang ditemukan di TTYkolom. Selain itu, pendekatan ini tidak akan menunjukkan siapa pun yang masuk ke sesi SFTP, karena sesi SFTP bukan sesi masuk shell.

Saya tidak tahu cara untuk secara eksplisit menunjukkan semua sesi SSH. Anda dapat menyimpulkan informasi ini dengan membaca informasi masuk dari utmp/ wtmpmelalui alat seperti last,, watau whoseperti yang baru saja saya jelaskan, atau dengan menggunakan alat jaringan seperti @sebelk yang dijelaskan dalam jawaban mereka untuk menemukan koneksi tcp terbuka pada port 22 (atau di mana pun SSH Anda daemon sedang mendengarkan.

Pendekatan ketiga yang bisa Anda ambil adalah mengurai output log dari daemon SSH. Bergantung pada distribusi OS Anda, distribusi SSH, konfigurasi, dan sebagainya, output log Anda mungkin ada di sejumlah tempat berbeda. Pada kotak RHEL 6, saya menemukan log /var/log/sshd.log. Pada kotak RHEL 7, dan juga pada kotak Arch Linux, saya perlu menggunakan journalctl -u sshduntuk melihat log. Beberapa sistem mungkin menampilkan log SSH ke syslog. Log Anda mungkin ada di tempat-tempat ini atau di tempat lain. Berikut contoh apa yang mungkin Anda lihat:

[myhost ~]% cat /var/log/sshd.log | grep hendrenj | grep session
May  1 15:57:11 myhost sshd[34427]: pam_unix(sshd:session): session opened for user hendrenj by (uid=0)
May  1 16:16:13 myhost sshd[34427]: pam_unix(sshd:session): session closed for user hendrenj
May  5 14:27:09 myhost sshd[43553]: pam_unix(sshd:session): session opened for user hendrenj by (uid=0)
May  5 18:23:41 myhost sshd[43553]: pam_unix(sshd:session): session closed for user hendrenj

Log menunjukkan kapan sesi dibuka dan ditutup, dari siapa sesi itu berasal, dari mana pengguna terhubung, dan banyak lagi. Namun, Anda harus melakukan banyak penguraian jika Anda ingin mendapatkan ini dari log peristiwa sederhana yang dapat dibaca manusia ke daftar sesi aktif saat ini, dan itu masih mungkin tidak akan menjadi daftar yang akurat ketika Anda sudah selesai melakukan parsing, karena log sebenarnya tidak mengandung informasi yang cukup untuk menentukan sesi mana yang masih aktif - Anda pada dasarnya hanya menebak. Satu-satunya keuntungan yang Anda peroleh dengan menggunakan log ini adalah bahwa informasi tersebut datang langsung dari SSHD daripada melalui sumber bekas seperti metode lainnya.

Saya sarankan hanya menggunakan w. Sebagian besar waktu, ini akan memberi Anda informasi yang Anda inginkan.

jayhendren
sumber
2
Terkait: Memahami output dari who -aperintah
Serge Stroobandt
Menemukan ini saat mencari masalah terkait tangensial. Tidak masalah. Ini adalah salah satu jawaban terbaik yang pernah saya lihat di situs Stack! Saya sekarang tahu lebih banyak tentang bidang ini (karena tidak ada kata yang lebih baik). EDIT: Terima kasih!
jscharf
107

Anda dapat melihat setiap sesi ssh dengan perintah berikut:

[root@router ~]# netstat -tnpa | grep 'ESTABLISHED.*sshd'
tcp        0      0 192.168.1.136:22            192.168.1.147:45852         ESTABLISHED 1341/sshd           
tcp        0      0 192.168.1.136:22            192.168.1.147:45858         ESTABLISHED 1360/sshd

O mungkin ini mungkin berguna:

[root@router ~]# ps auxwww | grep sshd:
root      1341  0.0  0.4  97940  3952 ?        Ss   20:31   0:00 sshd: root@pts/0 
root      1360  0.0  0.5  97940  4056 ?        Ss   20:32   0:00 sshd: root@pts/1 
root      1397  0.0  0.1 105300   888 pts/0    S+   20:37   0:00 grep sshd:
sebelk
sumber
4
Terima kasih; jawaban ini jauh lebih baik daripada jawaban teratas, yang hanya mencantumkan pengguna yang masuk ke shell. Solusi ini juga menemukan pengguna SFTP.
Hayden Schiff
1
pada sebagian besar kotak saat ini dapat Anda gunakanpgrep -ai sshd
ccpizza
@ccpizza: pgrep: invalid option -- 'i'di Ubuntu 14.04.
Martin Schröder
2
@ MartinSchröder: -ihanya tersedia untuk citarasa mac / bsd. di ubuntu bisa Anda gunakan pgrep -af ssd. Lihat serverfault.com/a/883270/116777 untuk detail
ccpizza
Mirip dengan @HaydenSchiff saya juga harus menemukan pengguna yang hanya memiliki SSH Tunnel terbuka untuk penerusan porta, tanpa shell. Ini membantu!
Tobias K.
14

Anda juga bisa menggunakan

ps ax | grep sshd
Joel Inglao
sumber
7

Ditambahkan untuk referensi sederhana.

Jika Anda menggunakan shell semu (contoh: / dev / pts / 0) salah satu cara paling sederhana adalah:

[user1@host ~]$ echo $SSH_CONNECTION

Seharusnya kembali: ip dan port Anda dan ip Anda terhubung ke dan port

192.168.0.13 50473 192.168.0.22 22

Anda juga dapat memperoleh beberapa informasi dari menggunakan ttyatau who( w): (edit: Saya melihat sekarang daftar di atas di pos lain)

[user1@host ~]$ who
user1 tty1          2018-01-03 18:43
user2 pts/0        2018-01-03 18:44 (192.168.0.13)

sumber
Untuk memperluas jawaban sebelumnya yang berhubungan dengan Bash global. Mungkin saya menyarankan referensi SECONDSglobal. Anda dapat menggunakan ini via echo $SECONDS, yang kemudian menampilkan jumlah waktu, sejak koneksi yang dirasakan
NerdOfCode
Ini akan menampilkan informasi untuk sesi yang sedang aktif - yang Anda ketikkan. Tetapi pertanyaannya adalah bagaimana cara membuat daftar semua sesi yang terhubung saat ini .
G-Man
6

Memperluas jawaban @ sebelk:

Solusi yang digunakan netstatadalah solusi yang bagus tetapi membutuhkan hak akses root. Selain itu, net-toolspaket (yang menyediakan netstat) sudah tidak digunakan lagi di beberapa distro Linux yang lebih baru ( https://dougvitale.wordpress.com/2011/12/21/deprecated-linux-networking-commands-and-their-replacements/ ).

Sebuah solusi alternatif adalah kemudian untuk menggunakan pengganti netstat, ss. Misalnya (perhatikan bahwa Anda tidak lagi memerlukan root):

user@router:~# ss | grep ssh
tcp    ESTAB      0      0      192.168.1.136:ssh                  192.168.1.147:37620                
tcp    ESTAB      0      0      192.168.1.136:ssh                  192.168.1.147:37628
A. Meijer
sumber
2

Anda dapat gunakan

last | head

Saya menggunakan ini dalam skrip .login saya selama bertahun-tahun untuk melihat siapa yang baru saja masuk ke sistem. Itu adalah perangkat keamanan yang buruk untuk melihat apakah seseorang berada di sistem menggunakan login Anda.

JO Williams
sumber
1
... tetapi itu tidak harus menjadi daftar sesi aktif (tentang apa pertanyaan ini). Bergantung pada aktivitas login, bahkan sesi yang Anda jalankan lastmungkin tidak terdaftar.
muru
1
"last -p now" mendaftar semua sesi ssh saat ini.
JO Williams
@ JOWilliams Versi lastdukungan apa -p? Apa fungsinya?
mwfearnley
Versi @ mwfearnley "last from util-linux 2.31.1"sudah pasti.
V.7