ยุติเซสชัน SSH ที่ลดลง


47

ดูเหมือนว่าเซสชัน SSH ของฉันจะลดลงแม้ว่าจะไม่ใช่ปัญหาหลักของฉัน - ปัญหาสำคัญคือเซสชันก่อนหน้าของฉันยังมีชีวิตอยู่แย่ลง แต่หนึ่งในนั้นกำลังทำงานอยู่ซึ่งvisudoทำให้ฉันไม่สามารถเข้าถึงได้

who แสดงจำนวนเซสชันทั้งหมดยกเว้นเซสชันปัจจุบันที่ฉันรู้ว่าถูกตัดการเชื่อมต่อฉันจะยกเลิกเซสชันเก่าเพื่อให้ปล่อยทรัพยากรได้อย่างไร


1
หากคุณไม่เป็นไรด้วยการฆ่าทุกอย่างในเทอร์มินัลหนึ่งคุณสามารถทำสิ่งที่ชอบfuser -k /dev/pts/0หรืออะไรก็ตามที่เทอร์มินัลปรากฏในwhoเอาต์พุต แปลกเล็กน้อยทุกคนที่ไม่สนใจ SIGHUP พวกเขากำลังทำงานอยู่ในscreenเซสชั่นหรืออะไร?
Bratchley

ฉันได้รับ: ไม่สามารถฆ่ากระบวนการ 1031: ไม่มีกระบวนการดังกล่าว ไม่มีอะไรพิเศษเพียงแค่ SSH จะใช้ PuTTY - ฉันคิดว่าเราเตอร์ใหม่ของฉันก้าวร้าวในการลดการเชื่อมต่อที่ไม่ใช้งาน - แม้ว่าฉันจะคิดว่าปลายอีกด้านหนึ่งจะทำอะไรสักอย่างเมื่อคอนเน็คเตอร์ TCP สิ้นสุดลง
markmnl

1
อัปเดตคำสั่งนั้นใช้งานได้สำหรับผู้ใช้รายอื่น (0 ไม่ได้อยู่ในwhoอีกต่อไป) ขอบคุณ!
markmnl

"เซสชัน SSH ของฉันดูเหมือนจะลดลงแม้ว่า ... ปัญหาสำคัญคือเซสชันก่อนหน้าของฉันยังมีชีวิตอยู่"เป็นข้อขัดแย้งเล็กน้อย พวกเขาอาจถูกตัดการเชื่อมต่อหรือพวกเขายังคงเชื่อมต่อ บางทีคุณควรอธิบายว่าคุณได้ข้อสรุปนี้อย่างไรเมื่อคุณถูกตัดการเชื่อมต่อแล้วเชื่อมต่ออีกครั้งและตระหนักว่าการเชื่อมต่อเดิมของคุณยังคงทำงานอยู่
goldilocks

คำตอบ:


58

เพื่อแก้ปัญหาเฉพาะหน้าว่าไฟล์ sudoers ถูกล็อคคุณสามารถลบไฟล์ล็อคได้ โดยปกติจะเป็น `/etc/sudoers.tmp"; ตรวจสอบหน้า man สำหรับ visudo เพื่อตรวจสอบหากคุณลบไฟล์ล็อคคุณสามารถเรียกใช้ visudo อีกครั้ง

หากต้องการลบเซสชันทั้งหมดที่ยังคงค้างอยู่อันดับแรกให้ค้นหา pid ของเซสชันปัจจุบันของคุณเอง จากนั้นถ้า pid ของคุณคือ 12345 ให้ทำ

ps -ef | grep sshd | grep -v root | grep -v 12345 | grep -v grep | awk '{print "sudo kill -9", $2}' |sh 

คุณอาจต้องการทำสิ่งนี้โดยไม่มีการ| shตรวจสอบครั้งสุดท้ายก่อนเพื่อตรวจสอบ PID ที่คุณวางแผนจะฆ่า

หากคุณใช้ Linux คุณสามารถใช้แทน

pkill -o -u YOURUSERNAME sshd

เพื่อฆ่าเซสชัน SSH ที่เก่าแก่ที่สุดของคุณ ทำต่อไปเรื่อย ๆ จนกว่าเซสชันปัจจุบันของคุณจะเหลือเซสชันเดียว

นอกจากนี้คุณยังอาจต้องการชุดServerAliveInterval 15ของคุณใน.ssh/configการส่งข้อความ keepalive ทุก 15 วินาทีเมื่อไม่มีข้อมูลที่ถูกส่งไปแล้ว man ssh_configสำหรับข้อมูลเพิ่มเติม.


1
บน CentOS - หากคุณเป็น SSH ไปยังบัญชีรูทคำตอบนี้จะไม่ทำงานลองใช้สิ่งต่อไปนี้: ps aux | grep ssh | grep -v / usr / sbin | awk '{พิมพ์ $ 2}' | xargs kill
Ali Nadalizadeh

ขอบคุณ วิธีนี้ใช้ได้ผล ฉันไม่ชัดเจนเกี่ยวกับวัตถุประสงค์grep -v 12345ส่วนหนึ่งของไวยากรณ์ที่ให้บริการคืออะไร? ผ่านทุกสิ่งที่ไม่มี12345?
ลอร์ดโลห์

grep -v 12345หมายถึง "ลบการจับคู่สายใด ๆ12345จากการจับคู่" ดังนั้นคุณควรระบุ PID ของเซสชั่นของคุณเองและการใช้งานที่ PID 12345แทน
Jenny D

หลังจากที่ฆ่าเซสชันทั้งหมดและลาออกคำสั่งwhoหรือtopยังคงแสดงจำนวนผู้ใช้ที่เซ็นชื่อแล้วถึงแม้ว่าจะแสดงเพียง 1 นั้นจะบังคับให้รีเฟรชอย่างไร
Ωmega

2

หากคุณทำรายการกระบวนการเพื่อให้คุณเห็นคำสั่งและอาร์กิวเมนต์ (เช่นps -fจาก procps ทำ) คุณควรเห็นกระบวนการ sshd ที่เรียกว่าเช่น:

sshd: user@pts/7

เทอร์มินัล ( pts/7) เป็นส่วนสำคัญที่นี่ - หากคุณเปรียบเทียบกับเทอร์มินัลปัจจุบันของคุณ ( tty) คุณจะเห็นว่าเซสชันใดที่คุณใช้งานอยู่ มีวิธีอื่นที่แน่นอนในการทำเช่นนั้น (เช่นดูที่ PID ของเชลล์ที่กำลังทำงานอยู่ในขณะนั้นและหาตำแหน่งนั้นในแผนผังกระบวนการ) แต่อาจเป็นวิธีที่ง่ายที่สุด จากนั้นคุณสามารถใช้บางสิ่งบางอย่างตามบรรทัดเหล่านี้:

# current tty name
TTY=$(tty | cut -f3- -d/)
# PIDs of other sshd processes
ps -o pid= -o command= -C sshd \
    | grep sshd:.*@ \
    | grep -v "@$TTY" \
    | sed "s/ sshd.*//"

จากนั้นคุณสามารถเลี้ยง PIDs ที่จะฆ่ามีxargsแต่เสมอให้แน่ใจว่าคุณไม่ฆ่าหลักsshdกระบวนการที่จัดการการเชื่อมต่อใหม่

ในหมายเหตุที่เกี่ยวข้องโปรดทราบว่าโดยทั่วไปการแยกวิเคราะห์psเอาต์พุตจะเกิดข้อผิดพลาดได้ง่าย (โดยเฉพาะในระบบต่าง ๆ ) เนื่องจากความแปรปรวนของรูปแบบเอาท์พุทของ-o pid= -o command=มัน


1

นี่จะฆ่าเซสชันที่ค้างไว้นานกว่า 2 วัน มันสามารถใส่เป็น cron ได้

for i in `w|awk '{print $2,$5}'|grep days|cut -d' ' -f1`; do fuser -k /dev/$i; done

สิ่งนี้จะฆ่าทั้งหมดยกเว้นเซสชันที่ใช้งานล่าสุดของคุณ เรียกใช้จากเทอร์มินัล

for i in `w|tail -n+3|awk '{print $2,$5}'|grep -v 0.00s|cut -d' ' -f1`; do fuser -k /dev/$i; done
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.