ฉันจะลบพอร์ตที่ส่งต่อ SSH ได้อย่างไร


52

ฉันเคยssh -L 10002:192.168.0.30:10002 192.168.1.135สร้างการส่งต่อพอร์ต แต่ตอนนี้ฉันต้องลบมันออก

ฉันจะทำสิ่งนี้ได้อย่างไร


เรามักจะรู้ว่าพอร์ตยังคงถูกส่งต่อเมื่อเราเริ่มเซสชัน ssh ใหม่ที่รันคำสั่งเดียวกันอีกครั้งและรับWarning: remote port forwarding failed for listen portข้อความ
GabLeRoux

คำตอบ:


56

หากคุณใช้ Linux คุณสามารถฆ่ากระบวนการได้โดย:

ps aux | grep ssh

จากนั้นใช้

kill <id>

เพื่อฆ่ากระบวนการ

หากคำสั่ง kill ไม่สำเร็จคุณสามารถลองใช้ได้

kill -9 <id>

31
ไม่ไม่ไม่กรุณาได้โปรดอย่าใช้kill -9จนกว่าคุณจะได้ลองkillแล้ว กระบวนการจำนวนมากจะมีตัวจัดการสัญญาณซึ่งจะทำความสะอาดการใช้ทรัพยากรของพวกเขาปิดการเชื่อมต่อที่สะอาดและงานก่อนปิดอื่น ๆ หากคุณฆ่าด้วย -9 กระบวนการจะตายทันทีโดยไม่ต้องล้างข้อมูล การฆ่าที่ไม่มี -9 จะใช้เวลาส่วนใหญ่
Doug Harris

17
kill -9ไม่มีเหตุผลเหมือนการใช้ปืนลูกซองเพื่อฆ่ายุง :)
Darren Hall

2
pgrep ssh | xargs killฉันมักจะทำซับหนึ่ง อย่าใช้-9เพื่ออะไรแน่นอน
GabLeRoux

2
@GabLeRoux ที่ถือว่าคุณมีเพียงsshคำสั่งเดียวหรือว่าsshคำสั่งทั้งหมดที่คุณกำลังใช้อยู่นั้นดีในการฆ่า นี่เป็นข้อสันนิษฐานทั่วไปที่ไม่ค่อยดีนัก
tripleee

2
@Avamander ฉันเชื่อมต่อกับsshอินสแตนซ์หลาย ๆ ตัวบนเซิร์ฟเวอร์ระยะไกลหลายตัวตลอดเวลาโดยบางคนไม่มีการมีส่วนร่วมโดยตรงของฉัน ตัวอย่างเช่นโหมด Emacs Tramp เปิดการsshเชื่อมต่อที่อยู่เบื้องหลังเมื่อฉันไปที่บัฟเฟอร์ระยะไกล บางคนใช้ระบบไฟล์ userspace ซึ่งทำสิ่งที่คล้ายกัน มันไม่ใช่เรื่องแปลกเลย ในความเป็นจริงฉันจะถือว่าผู้ใช้คนเดียวsshกรณีเดียวที่จะเป็นกรณีการใช้งานของชนกลุ่มน้อย ถ้ามันเหมาะกับคุณก็ดีสำหรับคุณ แต่มันก็ไม่ได้เป็นคำแนะนำทั่วไปที่ดี
tripleee

19

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

ssh -O cancel -L 10002:192.168.0.30:10002 192.168.1.135

วิธีนี้จะปิดใช้งานการส่งต่อพอร์ตนี้โดยไม่ยกเลิกเซสชัน อีกครั้งนี้จะทำงานเฉพาะในกรณีที่ SSH มัลติมีการใช้งานสำหรับการเชื่อมต่อ 192.168.1.135


ฉันดีใจที่มันมีอยู่และฉันพบว่ามันขอบคุณมาก!
galva

2
นี่เป็นทางออกที่ดีที่สุด ssh -O exit 192.168.1.135ที่จะโทฆ่าทำงานเพียง
โอเรียนท์

ถ้าคุณไม่ได้ทำมัลติเพล็กดูคำตอบที่ยอดเยี่ยมของ exhuma! (ขอบคุณ a3nm สำหรับการจับตัวพิมพ์ของฉัน)
Alan De Smet

! น่ากลัว นี่ควรเป็นคำตอบที่เลือก!
Truong Nguyen

12

คุณสามารถใช้ "escape-key" (โดยปกติ ~) ตามด้วย C เพื่อรับ cli กับการเชื่อมต่อของคุณ คุณสามารถลบอุโมงค์ได้โดยไม่ต้องเชื่อมต่อของคุณ


1
ฉันต้องการทราบรายละเอียดเฉพาะของสิ่งนี้ ฉันรู้ว่าคุณสามารถเพิ่มอุโมงค์ได้หลังจากที่คุณได้เข้า SSH แล้ว แต่ยังไม่สามารถหาวิธีที่จะทำได้
carestad

9
เมื่อคุณอยู่ในโหมด CLI คุณสามารถช่วยได้ -KL เป็นฝั่งตรงข้ามของ -L -KR เป็นฝั่งตรงข้ามของ -R และ -KD เป็นฝั่งตรงข้ามของ -D การทำ "escape-key" (~) ตามด้วย # จะแสดงอุโมงค์ของคุณ
Jimmy Hedman

1
@JimmyHedman คุณอาจต้องการแก้ไขคำตอบเพิ่มเติมเพื่อเพิ่มความคิดเห็น มันทำให้ทุกอย่างอ่านง่ายขึ้น และบางครั้งความคิดเห็นจะถูกซ่อน (ในกรณีที่มีมากเกินไป)
exhuma

12

วิธียกเลิกพอร์ตที่ส่งต่อในเซสชัน SSH ที่รันอยู่แล้ว:

  1. กด~+ C(tilde + capital C)
  2. ชนิด -KL port
  3. กดปุ่มตกลง

คุณควรเห็นสิ่งนี้:

ssh> -KL 10002
Canceled forwarding.

7

คุณสามารถเข้าสู่คอนโซลแบบโต้ตอบได้โดยพิมพ์~C(ตัวใหญ่ "C") สิ่งนี้ช่วยให้คุณสามารถเพิ่มและลบการส่งต่อพอร์ตแบบไดนามิก (ในจำนวนอื่น ๆ )

ลำดับนี้จะต้องมาทันทีหลังจากขึ้นบรรทัดใหม่ / ขึ้นบรรทัดใหม่ ดังนั้นสงสัยเพียงพิมพ์Enter~C(ตามลำดับ)

หากคุณไม่เห็นอักขระปรากฏบนคอนโซลแสดงว่าคุณทำถูกแล้ว :)

ตอนนี้คุณควรเห็นssh>ข้อความแจ้ง

หากต้องการลบพอร์ตให้ป้อน-KL 10002ตามด้วยEnter( 10002พอร์ตที่ส่งต่อของคุณอยู่ที่ไหน)

ตรงกันข้าม - เพิ่มไปข้างหน้าใหม่ - สามารถทำได้เช่นนี้ (ตั้งแต่ต้นจนจบ):

Enter~C

ssh> -L 10002:192.168.0.30:10002

Enter


นี่คือคำตอบที่ถูกต้องหากคุณไม่ได้เชื่อมต่อแบบมัลติเพล็กซ์ ~C escape not available to multiplexed sessionsหากคุณเป็นคุณจะถูกเด้งด้วย หากเป็นกรณีนี้ดูคำตอบที่ยอดเยี่ยมของ a3nm
Alan De Smet
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.