จะหยุด / ฆ่าอุโมงค์ที่เก็บไว้ได้อย่างไร?


17

ตอนนี้ฉันมีอุโมงค์อัตโนมัติแล้ววิธีที่ถูกต้องในการหยุดมันคืออะไร?

ดูเหมือนจะไม่มีวิธีที่ง่ายในการทำเช่นนี้ เอกสารไม่ชัดเจนในส่วนนี้

วิธีที่ง่ายดูเหมือนว่าจะรีบูตเครื่อง? ถูกต้องหรือไม่

คำตอบ:


21

ไม่มีวิธีการที่เหมาะสมในการฆ่า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เชื่อมต่อจะไม่ทำงานเพราะคำสั่งการโทร ( เช่นคำสั่งด้านบน) จะเริ่มการเชื่อมต่อใหม่ทันทีที่มันรู้ตัวว่าการเชื่อมต่อเก่าถูกทิ้ง


1
ที่จริงคุณควรจะฆ่า autossh โดยไม่มี -9 หากการเชื่อมต่อได้ถูกสร้างขึ้นผ่านอุโมงค์มันจะมีกระบวนการลูก sshd ที่จะจัดการกับมัน การฆ่าผู้ปกครองอัตโนมัติด้วย -9 จะทำให้กระบวนการ sshd ไม่ทำงาน อุโมงค์จะยังคงทำงานจนกว่ากระบวนการ sshd จะหมดเวลา หากคุณใช้สัญญาณเริ่มต้น (-3) ในการฆ่ามันจะปิดอย่างสง่างามและใช้กระบวนการ sshd ที่เกิดใหม่ด้วย
dviljoen

สวัสดีเนื่องจาก -3 คือสัญญาณฆ่าเริ่มต้นคุณไม่จำเป็นต้องผ่านอย่างชัดเจน -3 คุณสามารถละเว้นได้
Andrés Alcarraz

@ AndrésAlcarrazคุณจริงๆแน่ใจเกี่ยวกับมันได้หรือไม่ เป็นค่าเริ่มต้นและที่หนึ่งSIGTERM คือดูsuperuser.com/questions/352147/what-does-kill-3-meanและen.wikipedia.org/wiki/Kill_(command) - นอกจากนี้ FWIW ฉันเพิ่งตรวจสอบและไม่ปิดตัวลง ดังนั้นจึงไม่สามารถใช้งานได้ 15SIGQUIT3-15SIGTERM
Daniel F

และการใช้งานที่pkillไม่มีสัญญาณ (= the default) ก็ไม่ได้ยุติลงautosshเช่นกัน
Daniel F

@DanielF คุณพูดถูกฉันสับสน "สัญญาณเริ่มต้น (-3)" จากความคิดเห็น dvijoen
Andrés Alcarraz

5

เรียกใช้ ssh อัตโนมัติด้วย:

AUTOSSH_PIDFILE=/var/run/tunnel.pid autossh

ฆ่ามันด้วย:

kill pid

BTW

pkill -9 autossh เป็นสิ่งที่ผิด

-9ทำให้แน่ใจว่ากระบวนการไม่ออกอย่างสง่างามดังนั้นsshกระบวนการยังคงอยู่ที่นั่นเมื่อautosshกระบวนการถูกฆ่า

โดยไม่-9ยังคงไม่ดีถ้าคุณมีหลายอุโมงค์ทำงานpkillจะฆ่าพวกเขาทั้งหมด

วิธีที่ถูกต้องคือการตั้งAUTOSSH_PIDFILEenv var แล้วkillpid นั้นเท่านั้น


ยินดีต้อนรับสู่ Super User มันจะปรากฏขึ้นย่อหน้าสุดท้ายของคุณคือคำตอบที่แท้จริงของคุณในขณะที่เหลือของคำถามของคุณเป็นความคิดเห็นในคำตอบอื่น เนื่องจากลักษณะของคำถาม & คำตอบของเว็บไซต์นี้จะเป็นประโยชน์ในการเพิ่มรายละเอียดให้กับคำตอบของคุณเพื่อให้สามารถยืนได้ด้วยตัวเอง ขอขอบคุณที่ร่วมและไม่ลืมที่จะตรวจสอบเกี่ยวกับการท่องเที่ยว
ฉันพูดว่า Reinstate Monica

4

ค้นหากระบวนการ:

ps aux | grep ssh

คอลัมน์ secon คือ PIDnumber

ฆ่ากระบวนการด้วย PID :)

kill -9 PIDnumber

ใช้sudoถ้าคุณไม่มีสิทธิ์รูท


1

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