วิธีฆ่าเซสชัน SSH ที่เริ่มต้นด้วยตัวเลือก -f (ทำงานในพื้นหลัง)


49

ฉันหลงทางไปแล้ว จากหน้าคน:

 -f      Requests ssh to go to background just before command execution.

หลังจากเริ่ม SSH ด้วย-fตัวเลือกฉันมีอุโมงค์ทำงาน แต่หลังจากใช้เสร็จฉันก็ไม่รู้จะโต้ตอบกับมันอย่างไร ตัวอย่างเช่นฉันไม่สามารถปิดอุโมงค์ SSHเมื่อฉันทำเสร็จแล้ว

วิธีปกติฉันรู้ว่าไม่ทำงาน ตัวอย่างเช่นjobsคืนค่าอะไร ~คำสั่งไม่รับรู้ (และผมไม่ทราบว่าวิธีการที่จะใช้มันต่อไป)

อย่างไรก็ตามpgrepบอกฉันว่าอุโมงค์ SSH ยังคงทำงานอยู่ (หลังจากฉันปิดเทอร์มินัล ฯลฯ ) ฉันจะโต้ตอบกับมันได้อย่างไร ฉันจะปิดมันได้อย่างไร

คำตอบ:


64

ทางออกที่ดีโดยเฉพาะอย่างยิ่งสำหรับการเขียนสคริปต์คือการใช้master modeซ็อกเก็ตสำหรับคำสั่งควบคุม:

ssh -f -N -M -S <path-to-socket> -L <port>:<host>:<port> <server>

วิธีปิดอีกครั้ง:

ssh -S <path-to-socket> -O exit <server>

สิ่งนี้จะหลีกเลี่ยงทั้งการ grepping สำหรับรหัสกระบวนการและปัญหาเรื่องเวลาที่อาจเกี่ยวข้องกับวิธีการอื่น


10
เพียงเพื่อขยายเล็กน้อยสำหรับผู้เริ่มต้น<path-to-socket>เป็นพา ธ ไปยังไฟล์ที่อินสแตนซ์หลักของไคลเอ็นต์ ssh จะสร้างขึ้นสำหรับการสื่อสารระหว่างกระบวนการกับอินสแตนซ์ของไคลเอ็นต์ ssh อื่นที่ต้องการแบ่งปันการเชื่อมต่อของอินสแตนซ์ต้นแบบ ไฟล์ที่สร้างขึ้นจะแสดงถึงซ็อกเก็ตโดเมน unix มันสามารถตั้งชื่อและตั้งอยู่ที่ใดก็ได้และทุกที่ที่คุณต้องการเช่น/tmp/session1(แนะนำให้ตั้งชื่อโดยใช้รูปแบบ% - ดูคำอธิบายControlPathในman ssh_config)
golem

1
นอกจากนี้ดูเหมือนว่าส่วน<server>ของssh -S <path-to-socket> -O exit <server>คำสั่งสามารถเป็นสตริงใด ๆ แต่ต้องมีอยู่ นั่นเป็นเรื่องที่ซุ่มซ่าม
golem

1
คำตอบและคำถามนี้ค่อนข้างเก่า แต่ฉันต้องการรับรองว่าอาจเป็นวิธีที่ถูกต้องที่สุดในการจัดการกับปัญหาที่ฉันเคยเห็น ขอบคุณครับ!
zentechinc

41

ฉันพบวิธีแก้ปัญหาที่นี่: http://www.g-loaded.eu/2006/11/24/auto-closing-ssh-tunnels/

วิธีที่ดีที่สุด - อุโมงค์ที่ปิดอัตโนมัติ

ตามที่ได้รับการกล่าวถึงก่อนหน้านี้แทนที่จะใช้การรวมสวิตช์ -f -N เราสามารถใช้ -f เพียงอย่างเดียว แต่ยังรันคำสั่งบนเครื่องระยะไกล แต่คำสั่งใดที่ควรดำเนินการเนื่องจากเราต้องเริ่มต้นช่องสัญญาณเท่านั้น

นี่คือเมื่อการนอนหลับสามารถเป็นคำสั่งที่มีประโยชน์ที่สุดของทั้งหมด! ในสถานการณ์พิเศษนี้การนอนหลับมีข้อดีสองประการ:

  • มันไม่ทำอะไรเลยดังนั้นจึงไม่มีการใช้ทรัพยากร
  • ผู้ใช้สามารถระบุระยะเวลาที่จะดำเนินการ

ความช่วยเหลือเหล่านี้ในการปิดอุโมงค์ ssh อัตโนมัติได้อธิบายไว้ด้านล่างนี้อย่างไร

เราเริ่มต้นเซสชัน ssh ในพื้นหลังขณะดำเนินการคำสั่ง sleep เป็นเวลา 10 วินาทีบนเครื่องระยะไกล จำนวนวินาทีไม่สำคัญ ในเวลาเดียวกันเรารัน vncviewer เหมือนก่อนหน้านี้:

[me@local]$ ssh -f -L 25901:127.0.0.1:5901 me@remote.example.org sleep 10; \
          vncviewer 127.0.0.1:25901:1

ในกรณีนี้ไคลเอนต์ ssh ได้รับคำสั่งให้แยกเซสชั่น ssh ไปที่พื้นหลัง (-f) สร้างอุโมงค์ (-L 25901: 127.0.0.1: 5901) และดำเนินการคำสั่ง sleep บนเซิร์ฟเวอร์ระยะไกลเป็นเวลา 10 วินาที (sleep 10)

ความแตกต่างระหว่างวิธีนี้และวิธีก่อนหน้านี้ (สวิตช์ -N) โดยทั่วไปคือในกรณีนี้เป้าหมายหลักของไคลเอ็นต์ ssh ไม่ได้สร้างอุโมงค์ แต่ให้ดำเนินการคำสั่ง sleep เป็นเวลา 10 วินาที การสร้างอุโมงค์เป็นเป้าหมายรองข้างเคียง หากไม่ได้ใช้ vncviewer ไคลเอ็นต์ ssh จะออกหลังจากระยะเวลา 10 วินาทีเนื่องจากไม่มีงานทำอีกต่อไปทำลายอุโมงค์ในเวลาเดียวกัน

ในระหว่างการดำเนินการคำสั่ง sleep หากกระบวนการอื่น vncviewer ในกรณีนี้เริ่มใช้ tunnel นั้นและทำให้มันครอบครองเกินระยะเวลา 10 วินาทีดังนั้นแม้ว่าไคลเอ็นต์ ssh จะทำงานระยะไกล (การดำเนินการ sleep) จะไม่สามารถทำได้ ออกเนื่องจากกระบวนการอื่นตรงบริเวณอุโมงค์ กล่าวอีกนัยหนึ่งไคลเอ็นต์ ssh ไม่สามารถทำลายอุโมงค์ได้เนื่องจากจะต้องฆ่า vncviewer ด้วยเช่นกัน เมื่อ vncviewer หยุดใช้อุโมงค์ดังนั้นไคลเอ็นต์ ssh ก็ออกไปเช่นกันเนื่องจากบรรลุเป้าหมายแล้ว

ด้วยวิธีนี้ไม่มีกระบวนการ ssh ถูกปล่อยให้ทำงานในพื้นหลัง


4
คำพูดสั้น ๆ / การแก้ไข: เท่าที่ฉันรู้ว่าคุณต้องระบุvncviewer 127.0.0.1::25091ว่าคุณกำลังใช้ไวยากรณ์พอร์ตและไม่ใช่ไวยากรณ์การแสดงผล
Christian Wolf

นี่เป็นแนวคิดที่ยอดเยี่ยมและทำตามขั้นตอนอย่างเป็นปัญหาที่ฉันพบบน Windows Windows รุ่นล่าสุดมาพร้อมกับไคลเอนต์ ssh และรองรับตัวเลือก -S ตามทฤษฎี แต่ดูเหมือนจะไม่เหมาะกับฉัน
Keeely

9

หากต้องการฆ่าอุโมงค์ให้ใช้ps -C sshหรือps | grep sshหรือตัวแปรอื่น ๆ เพื่อพิจารณาว่ากระบวนการ ssh ใดกำลังเรียกใช้อุโมงค์ของคุณ จากนั้นฆ่ามัน

หรือคุณสามารถค้นหากระบวนการโดยพิจารณาว่าพอร์ตใดเปิดพอร์ตนี้:

netstat -lnpt | awk '$4 ~ /:1234$/ {sub(/\/.*/, "", $7); print $7}'

หากคุณต้องการฆ่าไคลเอ็นต์ ssh ทั้งหมดที่ทำงานบนเครื่องของคุณ (ในฐานะผู้ใช้ของคุณ) pkill sshจะทำเช่นนั้น


6

ตอบโดยคนอื่นที่นี่pkill sshฆ่ามัน

หากต้องการสร้างอุโมงค์ที่สามารถนำกลับมาได้ฉันจะเริ่มต้นscreenโดยไม่มี-fตัวเลือกจากนั้นแยกหน้าจอCtrl-A Dออก screen -rเพื่อนำกลับไปอุโมงค์โทร


กำลังดุร้าย แต่มีประสิทธิภาพ
mafrosis

1
ระวังหากคุณกำลังเชื่อมต่อจากระยะไกล pkill ssh จะฆ่าการเชื่อมต่อปัจจุบันของคุณ
kennyut

@kennyut screenแต่อีกเหตุผลหนึ่งที่จะใช้
Haotian Yang

0

เมื่อฉันเริ่มอุโมงค์ด้วย:

ssh -fN -D 8080 SOME_IP_HERE -l LOGIN_NAME_HERE
  • -f ร้องขอ ssh เพื่อไปยังพื้นหลังก่อนการดำเนินการคำสั่ง
  • -Nอย่าดำเนินการคำสั่งระยะไกล สิ่งนี้มีประโยชน์สำหรับการส่งต่อพอร์ต
  • -D ระบุการส่งต่อพอร์ตระดับแอปพลิเคชัน "ไดนามิก" ในเครื่อง
  • -l ระบุผู้ใช้ที่เข้าสู่ระบบเช่นเดียวกับบนเครื่องระยะไกล

ฉันสามารถปิดด้วย:

ps -lef | grep ssh | grep "8080" | awk "{print \$2}" | xargs kill

-1

ทางออกที่ดีที่สุดที่ฉันพบเพื่อฆ่าอุโมงค์ทั้งหมดในบรรทัดคำสั่งเดียวคือ

ps -lef|grep ssh|grep "\-L"|awk '{print $4}'|xargs kill

สำหรับเซสชัน ssh เพียงลบตัวเลือกอุโมงค์

ps -lef|grep ssh|awk '{print $4}'|xargs kill

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