วิธีปิด (ฆ่า) ssh เชื่อมต่อ ControlMaster ด้วยตนเอง


63

ด้วยการ.ssh/configกำหนดค่าต่อไปนี้:

ControlMaster auto
ControlPath /tmp/ssh_mux_%h_%p_%r
ControlPersist 4h

จะปิดการเชื่อมต่อที่มีอยู่ก่อน 4 ชั่วโมงได้อย่างไร?

ฉันรู้ว่าคุณสามารถเชื่อมต่อใหม่ได้ แต่จะปิดได้อย่างไร (ทั้งหมด)

อาจมีวิธีแสดงการเชื่อมต่อที่มีอยู่ทั้งหมดและจัดการเป็นเอกเทศ แต่ฉันไม่พบมัน


4
ไม่ฆ่ามัน แต่คุณไม่สามารถใช้การเชื่อมต่อที่มีอยู่ผ่านทางssh -S none(อาจช่วยคุณได้แล้ว)
sr_

ไม่ฉันพยายามลบผู้ใช้บนเซิร์ฟเวอร์ระยะไกล แต่การเชื่อมต่อที่หยุดทำงานทำให้ฉันไม่สามารถทำได้
เปาโล

คำตอบ:


81

จากคู่มือ :

-O ctl_cmd
ควบคุมกระบวนการหลักมัลติเพล็กซิ่งการเชื่อมต่อที่ใช้งานอยู่ เมื่อระบุ-Oตัวเลือกctl_cmdอาร์กิวเมนต์จะถูกตีความและส่งผ่านไปยังกระบวนการหลัก คำสั่งที่ถูกต้องคือ: check (ตรวจสอบว่ากระบวนการหลักกำลังทำงานอยู่), forward(ส่งต่อคำร้องขอโดยไม่มีการดำเนินการคำสั่ง), cancel(ยกเลิกการส่งต่อ), exit(ร้องขอให้ต้นแบบออก) และstop (ขอให้เจ้านายหยุดรับคำขอมัลติเพล็กซ์เพิ่มเติม)

รุ่นที่เก่ากว่ามีcheckและexitเท่านั้น แต่ก็เพียงพอสำหรับวัตถุประสงค์ของคุณ

ssh -O check host.example.com

หากคุณต้องการที่จะลบการเชื่อมต่อทั้งหมด (ไม่เพียง แต่การเชื่อมต่อไปยังโฮสต์ที่เฉพาะเจาะจง) ในหนึ่งก้มลงแล้วfuser /tmp/ssh_mux_*หรือlsof /tmp/ssh_mux_*จะแสดงรายการลูกค้า ssh ที่มีการควบคุมแต่ละซ็อกเก็ต ใช้fuser -HUP -k tmp/ssh_mux_*เพื่อฆ่าพวกเขาทั้งหมดอย่างหมดจด (ใช้ SIGHUP เนื่องจากสัญญาณดีที่สุดเพราะจะช่วยให้ลูกค้าถอดซ็อกเก็ตได้อย่างถูกต้อง)


นี่คือคำตอบที่ยอดเยี่ยม นี่คือสิ่งที่สมบูรณ์แบบสำหรับสิ่งที่ฉันพยายามที่จะบรรลุ checkมีประโยชน์มากกว่าสิ่งที่ฉันกำลังมองหาซึ่งเป็นสิ่งที่exitจะทำต่อไป! : D
ELLIOTTCABLE

5
ใน OS X fuserไม่สามารถส่งสัญญาณ แต่งานนี้ก็เช่นกัน:lsof -Fp /tmp/ssh_mux_* | cut -c 2- | xargs kill -HUP
Ori

11

ฉันเขียนโปรแกรมอรรถประโยชน์โอเพนซอร์สcmcเพื่อจัดการเซสชัน ControlMaster: ClockworkNet / cmc :

Usage:  cmc [ -c HOST | -o HOST | -x HOST ]
        cmc [ -L | -l | -O | -X ]
        cmc -h

ControlMaster Controller - Eases management of SSH ControlMaster connections

Options:
    -h      show this help message and exit
    -c HOST check HOST ControlMaster connection status (maybe specified more
            than once)
    -L      list ControlMasters defined in SSH_CONFIG
    -l      list ControlMaster connection sockets in ~/.ssh/ and check their
            connection status
    -O      open all ControlMasters defined in SSH_CONFIG
    -o HOST open a ControlMaster session (maybe specified more than once)
    -x HOST close ControlMaster session (maybe specified more than once)
    -X      exit all ControlMaster connections with sockets in ~/.ssh/

Notes:
    * Any unopened sockets in ~/.ssh/ are removed with -l and -X

3

คุณสามารถเรียกใช้fuser /tmp/ssh_mux_blablabla(ต้องการได้sudo) และฆ่า PID ที่ส่งคืน fuserแสดงกระบวนการที่กำลังใช้ไฟล์ (และอื่น ๆ ลองดูman fuser)

อัปเดต: ดูคำตอบของ Gilles; มันมีรายละเอียดมากขึ้น


3

สิ่งนี้ใช้ได้กับฉันโดยใช้เพียงไฟล์ซ็อกเก็ตสำหรับตัวควบคุมหลัก:

$ ssh -o ControlPath=~/.ssh/<controlfile> -O check <bogus arg>

ตัวอย่าง

นี่คือตัวอย่างที่ฉันได้สร้างการเชื่อมต่อกับเซิร์ฟเวอร์ระยะไกลแล้ว:

$ ssh -o ControlPath=~/.ssh/master-57db26a0499dfd881986e23a2e4dd5c5c63e26c2 -O check blah
Master running (pid=89228)
$

และด้วยการตัดการเชื่อมต่อ:

$ ssh -o ControlPath=~/.ssh/master-66496a62823573e4760469df70e57ce4c15afd74 -O check blah
Control socket connect(/Users/user1/.ssh/master-66496a62823573e4760469df70e57ce4c15afd74): No such file or directory
$

หากยังคงเชื่อมต่ออยู่สิ่งนี้จะบังคับให้ออกทันที:

$ ssh -o ControlPath=~/.ssh/master-66496a62823573e4760469df70e57ce4c15afd74 -O exit blah
Exit request sent.
$

มันไม่ชัดเจนสำหรับฉัน แต่ดูเหมือนว่ามันอาจเป็นข้อบกพร่องในการssh ที่มันต้องมีการโต้แย้งเพิ่มเติมในตอนท้ายแม้ว่าblahจะไม่มีความหมายในบริบทของสวิตช์ที่ฉันใช้

หากปราศจากมันก็ให้สิ่งนี้กับฉัน:

$ ssh -o ControlPath=~/.ssh/master-57db26a0499dfd881986e23a2e4dd5c5c63e26c2 -O check
usage: ssh [-1246AaCfGgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec]
           [-D [bind_address:]port] [-E log_file] [-e escape_char]
           [-F configfile] [-I pkcs11] [-i identity_file]
           [-L [bind_address:]port:host:hostport] [-l login_name] [-m mac_spec]
           [-O ctl_cmd] [-o option] [-p port]
           [-Q cipher | cipher-auth | mac | kex | key]
           [-R [bind_address:]port:host:hostport] [-S ctl_path] [-W host:port]
           [-w local_tun[:remote_tun]] [user@]hostname [command]

ข้อมูลรุ่น

OSX
$ ssh -V
OpenSSH_6.9p1, LibreSSL 2.1.8
CentOS 7.x
$ ssh -V
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips  26 Jan 2017

ฉันยืนยันว่าในทั้งสองเวอร์ชันนี้จำเป็นต้องมีอาร์กิวเมนต์ปลอมเพิ่มเติม

อ้างอิง

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