รายการเซสชัน SSH ที่เชื่อมต่อทั้งหมดหรือไม่


184

ฉันเพิ่งจะรูท SSH และจากนั้น SSH ก็จะรูทบนเครื่องเดียวกันอีกครั้ง ดังนั้นฉันจึงเปิดหน้าต่างสองบานทั้งสอง SSH ลงในรูทเครื่องของฉัน

จากเปลือกฉันจะดูรายการของสองช่วงนี้ได้อย่างไร?

คำตอบ:


188

whoหรือw; who -aสำหรับข้อมูลเพิ่มเติม

คำสั่งเหล่านี้จะแสดงเซสชันการล็อกอินทั้งหมดบนอุปกรณ์เทอร์มินัล เซสชัน SSH จะอยู่ใน pseudo-terminal slave ( pts) ดังที่แสดงในTTYคอลัมน์ แต่ไม่ใช่ทุกการเชื่อมต่อ pts ที่เป็นเซสชัน SSH ยกตัวอย่างเช่นโปรแกรมที่สร้างอุปกรณ์หลอกขั้วเช่นxtermหรือจะแสดงเป็นscreen ptsดูความแตกต่างระหว่าง pts และ ttyสำหรับคำอธิบายที่ดีขึ้นของค่าต่าง ๆ ที่พบในTTYคอลัมน์ นอกจากนี้วิธีการนี้จะไม่แสดงใครที่เข้าสู่เซสชัน SFTP เนื่องจากเซสชัน SFTP ไม่ใช่เซสชันการเข้าสู่ระบบเชลล์

ฉันไม่รู้วิธีใดที่จะแสดงเซสชัน SSH ทั้งหมดอย่างชัดเจน คุณสามารถอนุมานข้อมูลนี้ได้โดยการอ่านข้อมูลเข้าสู่ระบบจากutmp/ wtmpผ่านเครื่องมือเช่นlast, wหรือwhoเช่นที่ฉันเพิ่งอธิบายหรือใช้เครื่องมือเครือข่ายเช่น @sebelk ที่อธิบายไว้ในคำตอบของพวกเขาเพื่อค้นหาการเชื่อมต่อ tcp ที่เปิดบนพอร์ต 22 daemon เป็น / กำลังฟังอยู่

วิธีที่สามที่คุณสามารถทำได้คือการแยกวิเคราะห์บันทึกจาก SSH daemon ขึ้นอยู่กับการกระจาย OS ของคุณการกระจาย SSH การกำหนดค่าและอื่น ๆ เอาต์พุตบันทึกของคุณอาจอยู่ในสถานที่ต่าง ๆ บน RHEL 6 /var/log/sshd.logกล่องผมพบบันทึกใน ในกล่อง RHEL 7 และในกล่อง Arch Linux ฉันต้องใช้journalctl -u sshdเพื่อดูบันทึก ระบบบางระบบอาจส่งออกบันทึก SSH ไปยัง syslog บันทึกของคุณอาจอยู่ในสถานที่เหล่านี้หรือที่อื่น ๆ นี่คือตัวอย่างของสิ่งที่คุณอาจเห็น:

[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

บันทึกจะแสดงเมื่อเปิดและปิดเซสชันซึ่งเป็นของเซสชันที่ผู้ใช้เชื่อมต่อจากและอื่น ๆ อย่างไรก็ตามคุณจะต้องแยกวิเคราะห์จำนวนมากหากคุณต้องการรับสิ่งนี้จากบันทึกเหตุการณ์ที่เรียบง่ายและมนุษย์อ่านได้ไปยังรายการของเซสชันที่ใช้งานอยู่ในปัจจุบันและอาจยังคงไม่ถูกต้องเมื่อ คุณแยกวิเคราะห์เสร็จแล้วเนื่องจากบันทึกไม่ได้มีข้อมูลเพียงพอที่จะพิจารณาว่าเซสชันใดที่ยังใช้งานอยู่ - คุณเพียงแค่คาดเดา ข้อได้เปรียบเดียวที่คุณได้รับจากการใช้บันทึกเหล่านี้คือข้อมูลมาจาก SSHD โดยตรงแทนที่จะผ่านแหล่งข้อมูลมือสองเช่นวิธีอื่น

wผมขอแนะนำให้เพียงแค่ใช้ ส่วนใหญ่แล้วคุณจะได้รับข้อมูลที่คุณต้องการ



พบสิ่งนี้ในขณะที่ค้นหาปัญหาที่เกี่ยวข้องเป็นรูปธรรม ไม่เป็นไร นี่เป็นหนึ่งในคำตอบที่ดีที่สุดที่ฉันเคยเห็นในเว็บไซต์สแต็คใด ๆ ! ตอนนี้ฉันรู้มากขึ้นเกี่ยวกับพื้นที่นี้โดยเฉพาะ (เพราะขาดคำที่ดีกว่า) แก้ไข: ขอบคุณ!
jscharf

107

คุณสามารถเห็นทุกเซสชัน ssh ด้วยคำสั่งต่อไปนี้:

[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

บางทีนี่อาจเป็นประโยชน์:

[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
ขอขอบคุณ; คำตอบนี้ดีกว่าคำตอบยอดนิยมซึ่งแสดงเฉพาะผู้ใช้ที่เข้าสู่ระบบเชลล์ วิธีนี้ยังค้นหาผู้ใช้ SFTP
Hayden Schiff

1
ในกล่องส่วนใหญ่ทุกวันนี้คุณสามารถใช้pgrep -ai sshd
ccpizza

@ccpizza: pgrep: invalid option -- 'i'บน Ubuntu 14.04
Martin Schröder

2
@ MartinSchröder: -iมีเฉพาะในรสชาติ mac / bsd เท่านั้น บน Ubuntu pgrep -af ssdคุณสามารถใช้ ดูรายละเอียดเพิ่มเติมได้ที่serverfault.com/a/883270/116777
ccpizza

คล้ายกับ @HaydenSchiff ฉันต้องหาผู้ใช้ที่เปิดอุโมงค์ SSH สำหรับส่งต่อพอร์ตโดยไม่มีเชลล์ด้วย สิ่งนี้ช่วย!
Tobias K.


7

เพิ่มเพื่อการอ้างอิงอย่างง่าย

หากคุณอยู่ในเชลล์หลอก (ตัวอย่าง: / dev / pts / 0) หนึ่งในวิธีที่ง่ายที่สุดคือ:

[user1@host ~]$ echo $SSH_CONNECTION

มันควรจะกลับมา: IP และพอร์ตของคุณและ IP ของคุณเชื่อมต่อกับและพอร์ต

192.168.0.13 50473 192.168.0.22 22

นอกจากนี้คุณยังสามารถรับข้อมูลบางอย่างจากการใช้ttyหรือwho( w): (แก้ไข: ฉันเห็นว่าตอนนี้เป็นรายการด้านบนในโพสต์อื่น)

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

หากต้องการขยายคำตอบก่อนหน้านี้ที่เกี่ยวข้องกับ Bash globals ฉันขอแนะนำให้อ้างอิงSECONDSทั่วโลก คุณสามารถใช้สิ่งนี้ผ่านทางecho $SECONDSซึ่งมันจะแสดงระยะเวลาตั้งแต่การเชื่อมต่อที่รับรู้
NerdOfCode

สิ่งนี้จะแสดงข้อมูลสำหรับเซสชันที่ใช้งานอยู่ในปัจจุบันซึ่งเป็นข้อมูลที่คุณพิมพ์ แต่คำถามที่ถามถึงวิธีการที่จะแสดงรายการทั้งหมดในปัจจุบันการเชื่อมต่อการประชุม
G-Man

6

ขยายคำตอบของ @ sebelk:

โซลูชันที่ใช้netstatนั้นดี แต่ต้องมีสิทธิ์ใช้งานรูต นอกจากนี้net-toolsแพคเกจ (ซึ่งจัดให้มีnetstat) ถูกคัดค้านใน Linux distro รุ่นใหม่ ( https://dougvitale.wordpress.com/2011/12/21/deprecated-linux-networking-commands-and-their-replacements/ )

วิธีการแก้ปัญหาที่เป็นทางเลือกแล้วที่จะใช้ทดแทน,netstat ssตัวอย่างเช่น (โปรดทราบว่าคุณไม่ต้องการรูทอีกต่อไป):

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

คุณสามารถใช้ได้

last | head

ฉันใช้สิ่งนี้ในสคริปต์ .login ของฉันเป็นเวลาหลายปีเพื่อดูว่าใครเพิ่งล็อกอินเข้าสู่ระบบ เป็นอุปกรณ์รักษาความปลอดภัยที่ไม่ดีเพื่อดูว่ามีใครบางคนอยู่ในระบบโดยใช้ข้อมูลเข้าสู่ระบบของคุณ


1
... แต่ไม่จำเป็นต้องเป็นรายการของเซสชันที่ใช้งานอยู่ (คำถามนี้เกี่ยวกับอะไร) ขึ้นอยู่กับกิจกรรมการเข้าสู่ระบบแม้แต่เซสชันที่คุณใช้lastอาจไม่ปรากฏ
muru

1
"last -p now" แสดงรายการเซสชัน ssh ปัจจุบันทั้งหมด
โจวิลเลียมส์

@JOWilliams lastสนับสนุนรุ่น-pไหน? มันทำอะไร?
mwfearnley

รุ่น @mwfearnley ของ"last from util-linux 2.31.1"มันแน่นอน
V.7
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.