ตอนนี้ฉันมีอุโมงค์อัตโนมัติแล้ววิธีที่ถูกต้องในการหยุดมันคืออะไร?
ดูเหมือนจะไม่มีวิธีที่ง่ายในการทำเช่นนี้ เอกสารไม่ชัดเจนในส่วนนี้
วิธีที่ง่ายดูเหมือนว่าจะรีบูตเครื่อง? ถูกต้องหรือไม่
ตอนนี้ฉันมีอุโมงค์อัตโนมัติแล้ววิธีที่ถูกต้องในการหยุดมันคืออะไร?
ดูเหมือนจะไม่มีวิธีที่ง่ายในการทำเช่นนี้ เอกสารไม่ชัดเจนในส่วนนี้
วิธีที่ง่ายดูเหมือนว่าจะรีบูตเครื่อง? ถูกต้องหรือไม่
คำตอบ:
ไม่มีวิธีการที่เหมาะสมในการฆ่าautossh
เป็นเพียงการฆ่ากระบวนการautossh
ไม่มีอะไรอื่น
เหตุผลคือ
# file $(which autossh)
/usr/bin/autossh: POSIX shell script, ASCII text executable
ว่าautossh
เป็นเพียงเชลล์สคริปต์ไม่บริการ มันเริ่มโปรแกรมใหม่ในบรรทัดสุดท้าย
exec /usr/lib/autossh/autossh "$@"
อีกครั้งไม่ใช่บริการ สำหรับexec
(คุณสามารถตรวจสอบซ้ำได้ในวิกิของ Bash แฮกเกอร์ ) มันเป็นคำสั่ง shell-builtin ซึ่งแทนที่เชลล์ปัจจุบันด้วยคำสั่งต่อไปนี้ ( /usr/lib/autossh/autossh "$@"
ในกรณีนี้) โดยไม่ต้องเริ่มกระบวนการใหม่ ดังนั้นวิธีเดียวที่จะหยุดautossh
คือฆ่าสคริปต์การโทรเช่น
pkill -3 autossh
(ขอบคุณdviljoen ที่ชี้ให้เห็นถึงความสำคัญของการใช้ธง-3ดูด้านล่าง) อนึ่งการฆ่าการssh
เชื่อมต่อจะไม่ทำงานเพราะคำสั่งการโทร ( เช่นคำสั่งด้านบน) จะเริ่มการเชื่อมต่อใหม่ทันทีที่มันรู้ตัวว่าการเชื่อมต่อเก่าถูกทิ้ง
SIGTERM
คือดูsuperuser.com/questions/352147/what-does-kill-3-meanและen.wikipedia.org/wiki/Kill_(command) - นอกจากนี้ FWIW ฉันเพิ่งตรวจสอบและไม่ปิดตัวลง ดังนั้นจึงไม่สามารถใช้งานได้ 15
SIGQUIT
3
-15
SIGTERM
pkill
ไม่มีสัญญาณ (= the default
) ก็ไม่ได้ยุติลงautossh
เช่นกัน
เรียกใช้ ssh อัตโนมัติด้วย:
AUTOSSH_PIDFILE=/var/run/tunnel.pid autossh
ฆ่ามันด้วย:
kill pid
BTW
pkill -9 autossh
เป็นสิ่งที่ผิด
-9
ทำให้แน่ใจว่ากระบวนการไม่ออกอย่างสง่างามดังนั้นssh
กระบวนการยังคงอยู่ที่นั่นเมื่อautossh
กระบวนการถูกฆ่า
โดยไม่-9
ยังคงไม่ดีถ้าคุณมีหลายอุโมงค์ทำงานpkill
จะฆ่าพวกเขาทั้งหมด
วิธีที่ถูกต้องคือการตั้งAUTOSSH_PIDFILE
env var แล้วkill
pid นั้นเท่านั้น
ค้นหากระบวนการ:
ps aux | grep ssh
คอลัมน์ secon คือ PIDnumber
ฆ่ากระบวนการด้วย PID :)
kill -9 PIDnumber
ใช้sudoถ้าคุณไม่มีสิทธิ์รูท
ฉันรู้ว่าสิ่งนี้ได้รับคำตอบแล้ว แต่ตรงกันข้ามกับความคิดเห็นข้างต้นการใช้pkill -3 autossh
ไม่ได้ฆ่ากระบวนการลูก sshd สำหรับฉัน
ฉันใช้ฟังก์ชั่นนี้ใน.bashrc
ไฟล์ของฉัน
โดยพื้นฐานแล้วมันเหมือนกับการเพิ่ม--kill
อาร์กิวเมนต์ให้กับการจัดการอัตโนมัติ
if [ "$1" = "--kill" ]; then
ps aux |
grep -P "(/usr/bin/ssh|/usr/lib/autossh/autossh)\s.*$2" |
awk '{print $2}' |
xargs -r kill
else
$(which autossh) "$@"
echo "" # prevents line wrapping when you kill the ssh process
fi
คุณสามารถเรียกใช้which ssh
และwhich autossh
ตรวจสอบเส้นทางในระบบของคุณ
ตราบใดที่อาร์กิวเมนต์แรกไม่ได้--kill
เป็นเพียงแค่ส่ง args ไปยัง autossh
สคริปต์นี้ฆ่าอินสแตนซ์ Autossh & ssh นี่เป็นสิ่งสำคัญหากคุณกำลังใช้การส่งต่อพอร์ตเนื่องจากการฆ่าอินสแตนซ์ Autossh เท่านั้นที่ไม่ได้ฆ่าอุโมงค์ แต่จะป้องกันไม่ให้ทำการเชื่อมต่ออีกครั้งหาก / เมื่อมันถูกตัดการเชื่อมต่อในที่สุด
คุณยังสามารถระบุคำค้นหา (ชื่อโฮสต์) เพื่อฆ่าเฉพาะอุโมงค์ที่ระบุ
autossh --kill dbserver1
ฆ่าเพียงแค่การเชื่อมต่อกับ dbserver1
autossh --kill dbserver
จะฆ่า dbserver1, dbserver2 และอื่น ๆ
autossh --kill dbserver
จะฆ่าการเชื่อมต่อ autossh ทั้งหมด
หากต้องการอธิบายให้ชัดเจนควรฆ่าเฉพาะเซสชัน SSH ที่เริ่มโดย autossh
หากคุณเรียกใช้ps aux | grep ssh
ในขณะที่คุณมีทั้งเซสชัน autossh และ ssh คุณจะเห็นว่ารายการที่เริ่มต้นโดย autossh ใช้เส้นทางแบบเต็ม (/ usr / bin / ssh และ / usr / lib / autossh / autossh)
สคริปต์นี้จับคู่ผลลัพธ์กับกระบวนการที่เริ่มต้นด้วยเส้นทาง speicifc เท่านั้น ฉันทำสิ่งนี้เพราะฉัน (และฉันคิดว่าคนส่วนใหญ่) มักจะพิมพ์ssh
และไม่ใช่เส้นทางที่เต็มรูปแบบซึ่งช่วยให้มันจากการฆ่าเซสชันปกติของฉัน
หวังว่าสิ่งนี้จะช่วยผู้อื่น
$(which autossh)
แทนที่จะเป็นเพียงแค่autossh
?