Cara menutup (membunuh) koneksi ssh ControlMaster secara manual


63

Dengan .ssh/configkonfigurasi berikut :

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

Bagaimana cara menutup koneksi yang ada sebelum 4 jam?

Saya tahu Anda dapat membuat koneksi baru, tetapi bagaimana cara menutupnya (semua)?

Mungkin ada cara untuk menunjukkan semua koneksi yang ada dan menanganinya secara individual tetapi saya tidak dapat menemukannya.


4
Tidak membunuhnya, tetapi Anda tidak bisa menggunakan koneksi yang ada melalui ssh -S none(mungkin ini sudah membantu Anda).
sr_

Tidak, saya mencoba untuk menghapus pengguna di server jauh, tetapi koneksi yang menggantung mencegah saya melakukannya.
Paolo

Jawaban:


81

Dari manual :

-O ctl_cmd
Mengontrol proses master koneksi multiplexing yang aktif. Ketika -Oopsi ditentukan, ctl_cmdargumen ditafsirkan dan diteruskan ke proses master. Perintah yang valid adalah: check (periksa apakah proses master sedang berjalan), forward(permintaan penerusan tanpa eksekusi perintah), cancel(batalkan penerusan), exit(minta master untuk keluar), dan stop (minta master untuk berhenti menerima permintaan multiplexing lebih lanjut).

Versi yang lebih lama hanya memiliki checkdan exit, tetapi itu cukup untuk tujuan Anda.

ssh -O check host.example.com

Jika Anda ingin menghapus semua koneksi (bukan hanya koneksi ke host tertentu) dalam satu gerakan, maka fuser /tmp/ssh_mux_*atau lsof /tmp/ssh_mux_*akan daftar klien ssh yang mengendalikan setiap soket. Gunakan fuser -HUP -k tmp/ssh_mux_*untuk membunuh mereka semua dengan bersih (menggunakan SIGHUP sebagai sinyalnya terbaik karena memungkinkan klien melepas soketnya dengan benar).


Ini jawaban yang sangat bagus. Ini sempurna untuk apa yang saya coba capai. checkbahkan lebih berguna daripada apa yang saya cari, yang exitmemang penting! : D
ELLIOTTCABLE

5
Dalam OS X fusertidak dapat mengirim sinyal, tetapi ini berfungsi dengan baik:lsof -Fp /tmp/ssh_mux_* | cut -c 2- | xargs kill -HUP
Ori

11

Saya menulis sebuah utilitas open source cmc,, untuk mengelola sesi 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

Anda dapat menjalankan fuser /tmp/ssh_mux_blablabla(mungkin perlu sudo) dan membunuh PID yang dikembalikan. fusermenunjukkan proses mana yang menggunakan file. (Dan banyak lagi, lihat man fuser.)

Pembaruan: periksa jawaban Gilles; itu jauh lebih rinci.


3

Ini berfungsi untuk saya hanya menggunakan file socket untuk master kontrol:

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

Contoh

Berikut adalah contoh di mana saya telah membuat koneksi ke server jauh:

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

Dan dengan itu terputus:

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

Jika masih terhubung, ini akan memaksanya untuk segera keluar:

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

Tidak jelas bagi saya, tetapi tampaknya berpotensi menjadi bug ssh karena membutuhkan argumen tambahan pada akhirnya, meskipun blahtidak ada artinya dalam konteks switch yang saya gunakan.

Tanpa itu memberi saya ini:

$ 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]

Informasi versi

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

Saya mengkonfirmasi bahwa pada kedua versi ini, kebutuhan akan argumen palsu tambahan diperlukan.

Referensi

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.