ssh ControlMaster接続を手動で閉じる(kill)方法


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引数が解釈され、マスター・プロセスに渡されます。有効なコマンドはcheckforward(マスタープロセスが実行されていることを確認する)、(コマンドを実行せずに転送を要求する)、(転送を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
エリオッタブル

5
OS Xではfuser信号を送信できませんが、これは同様に機能します。lsof -Fp /tmp/ssh_mux_* | cut -c 2- | xargs kill -HUP
Ori

11

cmcControlMasterセッションを管理するためのオープンソースユーティリティ、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.