Liệt kê tất cả các phiên SSH được kết nối?


184

Tôi chỉ cần SSH vào root, rồi SSH lại vào root trên cùng một máy. Vì vậy, tôi có hai cửa sổ mở cả SSH'd vào root trên máy từ xa của mình.

Từ shell, làm thế nào tôi có thể thấy một danh sách của hai phiên này?

Câu trả lời:


188

whohoặc w; who -aĐể biết thêm thông tin chi tiết.

Các lệnh này chỉ hiển thị tất cả các phiên đăng nhập trên thiết bị đầu cuối. Một phiên SSH sẽ nằm trên một nô lệ đầu cuối giả ( pts) như được hiển thị trong TTYcột, nhưng không phải tất cả các kết nối pts đều là các phiên SSH. Chẳng hạn, các chương trình tạo ra một thiết bị đầu cuối giả như xtermhoặc screensẽ hiển thị dưới dạng pts. Xem Sự khác biệt giữa pts và tty để biết mô tả rõ hơn về các giá trị khác nhau được tìm thấy trong TTYcột. Hơn nữa, cách tiếp cận này sẽ không hiển thị cho bất kỳ ai đăng nhập vào phiên SFTP, vì các phiên SFTP không phải là phiên đăng nhập.

Tôi không biết cách nào để hiển thị rõ ràng tất cả các phiên SSH. Bạn có thể suy luận thông tin này bằng cách đọc thông tin đăng nhập từ utmp/ wtmpthông qua một công cụ như last, whoặc whonhư tôi vừa mô tả hoặc bằng cách sử dụng các công cụ mạng như @sebelk được mô tả trong câu trả lời của họ để tìm các kết nối tcp mở trên cổng 22 (hoặc bất cứ nơi nào SSH của bạn daemon (s) đang / đang lắng nghe).

Cách tiếp cận thứ ba bạn có thể thực hiện là phân tích đầu ra nhật ký từ trình nền SSH. Tùy thuộc vào phân phối HĐH, phân phối SSH, cấu hình, v.v., đầu ra nhật ký của bạn có thể ở một số nơi khác nhau. Trên hộp RHEL 6, tôi tìm thấy các bản ghi trong /var/log/sshd.log. Trên hộp RHEL 7 và trên hộp Arch Linux, tôi cần sử dụng journalctl -u sshdđể xem nhật ký. Một số hệ thống có thể xuất nhật ký SSH sang syslog. Nhật ký của bạn có thể ở những nơi này hoặc ở nơi khác. Đây là một ví dụ về những gì bạn có thể thấy:

[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

Nhật ký hiển thị khi phiên mở và đóng, phiên thuộc về ai, nơi người dùng đang kết nối và hơn thế nữa. Tuy nhiên, bạn sẽ phải thực hiện nhiều phân tích cú pháp nếu bạn muốn lấy điều này từ nhật ký sự kiện đơn giản, dễ đọc của con người sang danh sách các phiên hiện đang hoạt động và có lẽ nó vẫn không phải là một danh sách chính xác khi bạn đã hoàn thành phân tích cú pháp, vì nhật ký không thực sự chứa đủ thông tin để xác định phiên nào vẫn hoạt động - về cơ bản bạn chỉ đang đoán. Lợi thế duy nhất bạn có được bằng cách sử dụng các nhật ký này là thông tin đến trực tiếp từ SSHD thay vì thông qua nguồn cũ như các phương pháp khác.

Tôi khuyên bạn chỉ nên sử dụng w. Hầu hết thời gian, điều này sẽ giúp bạn có được thông tin bạn muốn.



Tìm thấy điều này trong khi tìm kiếm một vấn đề liên quan tiếp tuyến. Không quan trọng. Đây là một trong những câu trả lời hay nhất tôi từng thấy trên bất kỳ trang web Stack nào! Bây giờ tôi biết nhiều hơn về lĩnh vực cụ thể này (vì thiếu một từ tốt hơn). EDIT: Cảm ơn bạn!
jscharf

107

Bạn có thể thấy mọi phiên ssh với lệnh sau:

[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

Có lẽ điều này có thể hữu ích:

[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:

4
Cảm ơn bạn; câu trả lời này tốt hơn nhiều so với câu trả lời hàng đầu, chỉ liệt kê những người dùng đã đăng nhập vào trình bao. Giải pháp này cũng tìm thấy người dùng SFTP.
Hayden Schiff

1
trên hầu hết các hộp hiện nay bạn có thể sử dụngpgrep -ai sshd
ccpizza

@ccpizza: pgrep: invalid option -- 'i'trên Ubuntu 14.04.
Martin Schröder

2
@ MartinSchröder: -ichỉ có sẵn trên các hương vị mac / bsd. trên Ubuntu bạn có thể sử dụng pgrep -af ssd. Xem serverfault.com/a/883270/116777 để biết chi tiết
ccpizza

Tương tự như @HaydenSchiff, tôi cũng phải tìm những người dùng chỉ mở Đường hầm SSH để chuyển tiếp cổng, không có vỏ. Điều này đã giúp!
Tobias K.


7

Thêm vào để tham khảo đơn giản.

Nếu bạn đang ở trong vỏ giả (ví dụ: / dev / pts / 0), một trong những cách đơn giản nhất sẽ là:

[user1@host ~]$ echo $SSH_CONNECTION

Nó sẽ trả về: ip và cổng của bạn và ip mà bạn đã kết nối và cổng

192.168.0.13 50473 192.168.0.22 22

Bạn cũng có thể nhận được một số thông tin từ việc sử dụng ttyhoặc who( w): (chỉnh sửa: Tôi thấy bây giờ danh sách này ở trên trong một bài đăng khác)

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

Để mở rộng các câu trả lời trước liên quan đến Bash toàn cầu. Tôi có thể đề nghị tham khảo SECONDStoàn cầu. Bạn có thể sử dụng thông qua này echo $SECONDS, sau đó nó sẽ hiển thị lượng thời gian, kể từ khi kết nối được nhận biết
NerdOfCode

Điều này sẽ hiển thị thông tin cho phiên hiện đang hoạt động - phiên bạn đang nhập vào. Nhưng câu hỏi hỏi làm thế nào để liệt kê tất cả các phiên hiện đang kết nối .
G-Man

6

Mở rộng câu trả lời của @ sebelk:

Giải pháp sử dụng netstatlà một giải pháp tốt nhưng đòi hỏi quyền root. Ngoài ra, net-toolsgói (cung cấp netstat) không được dùng trong một số bản phân phối Linux mới hơn ( https://dougvitale.wordpress.com/2011/12/21/deprecated-linux-networking-commands-and-their-replacements/ ).

Một giải pháp thay thế là sau đó sử dụng thay thế cho netstat, ss. Ví dụ: (lưu ý bạn không còn cần 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

2

Bạn có thể dùng

last | head

Tôi đã sử dụng điều này trong tập lệnh .login của mình trong nhiều năm để xem ai mới đăng nhập vào hệ thống. Đó là một thiết bị bảo mật kém để xem ai đó có trên hệ thống bằng thông tin đăng nhập của bạn hay không.


1
... nhưng nó không nhất thiết phải là một danh sách các phiên hoạt động (câu hỏi này là về cái gì). Tùy thuộc vào hoạt động đăng nhập, ngay cả phiên bạn đã chạy lastcó thể không được liệt kê.
muru

1
"Last -p now" liệt kê tất cả các phiên ssh hiện tại.
JO Williams

@JOWilliams Phiên bản lasthỗ trợ -pnào? Nó làm gì?
mwfearnley

Phiên bản @mwfearnley "last from util-linux 2.31.1"có nó chắc chắn.
V.7
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.