เซสชัน SSH หยุดทำงานเมื่อปิด / รีบูต


13

ฉันมีเซิร์ฟเวอร์ที่รัน Debian และ sshd อยู่และในกรณีที่ฉันต้องรีบูตเซิร์ฟเวอร์ SSH ของฉันจะค้างที่ฝั่งไคลเอ็นต์จนกระทั่ง TCP หมดเวลา ฉันคิดว่านี่เป็นเพราะเมื่อsshdถูกยกเลิกมันไม่ได้ปิดเซสชัน SSH เปิดอย่างชัดเจนไปยังโฮสต์ ฉันควรทำอย่างไรเพื่อsshdยกเลิกการเชื่อมต่อกับทุกคนก่อนจากนั้นจึงยกเลิกตัวเองตามปกติ จนถึงตอนนี้ฉันไม่เห็นพารามิเตอร์man sshd_configที่เกี่ยวข้องกับพฤติกรรมการปิดระบบ


1
เมื่อทุกอย่างล้มเหลวคุณสามารถฆ่าไคลเอ็นต์ SSH ได้ตลอดเวลาโดยกด [Enter] [~] [.] คำอธิบายเกี่ยวกับวิธีแก้ปัญหาของคุณเช่นกัน
n.st

คำตอบ:


32

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

ความคิดแรกของคุณอาจเป็นเพียงการฆ่ากระบวนการ SSH ทั้งหมดเป็นขั้นตอนแรกในระหว่างการปิดระบบและมีเซอร์วิสไฟล์ systemd เพียงไม่กี่รายการที่ทำเช่นนั้น

แต่มีแน่นอนการแก้ปัญหา neater (วิธีการที่จะ "ควร" systemd-logindจะต้องทำ):
systemd-logindติดตามเซสชันผู้ใช้ที่ใช้งานอยู่ (โลคอลและ SSH) และกำหนดกระบวนการทั้งหมดที่เกิดขึ้นภายในพวกเขาให้เรียกว่า "สไลซ์" ด้วยวิธีนี้เมื่อระบบปิดระบบ systemd สามารถเพียงแค่ SIGTERM ทุกอย่างภายในชิ้นส่วนของผู้ใช้ (ซึ่งรวมถึงกระบวนการ SSH แบบแยกส่วนที่ส่งเซสชันเฉพาะ) แล้วจึงปิดบริการและเครือข่ายต่อไป

systemd-logindต้องการโมดูล PAM เพื่อรับการแจ้งเตือนเกี่ยวกับเซสชันผู้ใช้ใหม่และคุณจะต้องdbusใช้loginctlเพื่อตรวจสอบสถานะดังนั้นจึงควรติดตั้งทั้งสองอย่าง:

apt-get install libpam-systemd dbus

ให้แน่ใจว่าคุณเป็นจริงจะใช้โมดูลที่มี/etc/ssh/sshd_configUsePAM yes


โอเคบรรลุเป้าหมายและขอบคุณสำหรับคำอธิบาย (แม้ว่าฉันต้องการวิธีการควบคุมการพึ่งพาสำหรับวิธีการปิดบางอย่างเพื่อให้ทุกอย่างเป็นครั้งแรกที่ SIGTERM จะสามารถทำงานให้เสร็จได้ แต่มันก็เป็นวิธีการแก้ปัญหาแบบเลเยอร์)
Vesper

ด้วยเหตุผลบางอย่างฉันไม่ได้รับแจ้งเกี่ยวกับคำตอบในขณะที่เข้าชม StackOverflow เท่านั้น แปลก.
เวสเปอร์

1
ดังนั้นในระยะสั้นเพียงเพื่อโกนหนวดไม่กี่วินาทีเมื่อปิดระบบเราต้องติดตั้งอึทั้งหมดเพื่อให้การเชื่อมต่อของเราสิ้นสุดลงอย่างถูกต้องหรือไม่ อย่างจริงจัง ? นี่กำลังจะเบี้ยว พวกเราถึงวาระแล้ว
leucos

3
โปรดทราบว่าการรีบูตครั้งแรกหลังจากติดตั้ง libpam-systemd และ dbus จะยังคงทำให้เซสชัน SSH ของคุณหยุดทำงาน เพื่อหลีกเลี่ยงปัญหาดังกล่าวแทนที่จะrebootทำสิ่งshutdown -rใดค่าเริ่มต้นจะล่าช้า 1 นาทีทำให้คุณมีเวลาปิดเซสชัน SSH
mivk

9

นี่คือสิ่งที่คุณต้องตั้งค่าบนฝั่งไคลเอ็นต์ไม่ใช่ฝั่งเซิร์ฟเวอร์ แก้ไขของคุณที่~/.ssh/configจะมี

ServerAliveInterval 15
ServerAliveCountMax 5

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


2
สิ่งนี้จะส่งผลให้เกิดความล่าช้า 75 วินาทีก่อนที่ไคลเอ็นต์ ssh จะรายงานว่าเซิร์ฟเวอร์ตาย ขวา?
เวสเปอร์

1
ใช่และคุณสามารถปรับพารามิเตอร์เพื่อให้ได้เวลาที่สั้นลง
Tero Kilkanen

วิธีนี้แก้ไขปัญหาให้ฉันได้ ปัญหาดังกล่าวน่ารำคาญ
Justin Andrusk

5

มีการรายงานพฤติกรรมนี้ในDebian Bugนี้คุณเพียงแค่ต้องติดตั้งสคริปต์การปิดระบบที่มาพร้อมกับแพคเกจอย่างถูกต้องเพราะโดยอัตโนมัติจะไม่ถูกคัดลอกโดยค่าเริ่มต้น:

cp /usr/share/doc/openssh-client/examples/ssh-session-cleanup.service /etc/systemd/system/
systemctl  enable ssh-session-cleanup.service

1

คุณสามารถระบุตัวเลือกที่ Jenny D พูดถึงในคำตอบของเธอสำหรับคำสั่ง ssh หนึ่งคำเช่น

ssh -t -o ServerAliveInterval=1 -o ServerAliveCountMax=1 user@host sudo poweroff

หากคุณทำเช่นนั้นบ่อยครั้งคุณสามารถเขียนสคริปต์ได้



0

เซิร์ฟเวอร์ผิดพลาดที่น่าเศร้าไม่ให้ฉันตอบด้วยสาเหตุของเธรดโดยมีคะแนนน้อยเกินไปตั้งแต่ปี แต่ฉันไม่ต้องการสแปมในบล็อกอื่นเพื่อปลดล็อค ^^ ... เพื่อเป็นคำตอบเฉพาะ:

ดังที่ Rfraile ได้กล่าวไว้

cp /usr/share/doc/openssh-client/examples/ssh-session-cleanup.service /etc/systemd/system/
systemctl  enable ssh-session-cleanup.service

โรงงาน หากต้องการใช้งานโดยไม่ต้องรีบูตอินสแตนซ์ / เซิร์ฟเวอร์คุณควรทำงานเพิ่มเติม:

systemctl daemon-reload
systemctl start ssh-session-cleanup.service

ดังนั้นเซอร์วิสจะถูกลงทะเบียนและเริ่มทำงานและ systemd จำเป็นต้องหยุดทำงานเพื่อการรีบูต / ปิดเครื่อง


คุณแค่ทำซ้ำอีกคำตอบ?
RalfFriedl

ไม่มี? ฉันใช้ 2 บรรทัดเป็นข้อมูลอ้างอิงสำหรับการตอบกลับส่วนบนเท่านั้นเนื่องจากฉันยังไม่สามารถตอบได้ตามที่เขียนไว้ ฉันเพิ่มขั้นตอนที่จำเป็นในการใช้โดยไม่ต้องรีบูต สิ่งนี้อาจได้รับในกระทู้คำถามอื่น แต่ฉันยังไม่ได้เช็คเอาท์
Reiner030
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.