Linux
如何判斷 ssh ControlMaster 連接是否正在使用中
我想使用ControlMaster
ssh
的功能來共享連接以提高速度。我正在嘗試編寫腳本,以便可以啟動/重新啟動/停止與不同主機的多個連接。如何確定這些連接中的任何一個是否正在使用中?如果我在 ssh 會話打開時殺死它們,它就會關閉
理想情況下,我的重啟腳本看起來像(偽腳本) - 停止腳本在底部沒有 ssh 命令的情況下是等效的:
for HOST in $HOST_LIST do MASTER_PID=`find_master_pid $HOST` if $MASTER_PID then if `find_child_pid` echo Connection to $HOST in use: not terminating else kill -SIGHUP $MASTER_PID fi ssh -TMNf $HOST
你可以簡單地使用
ssh -o ControlPath=$socket -O check
對於您打開的每個 $socket (如果將它們保存在單個目錄中很容易)。
如果檢查失敗(連接不再活動),則返回 255,如果通過,則返回另一個值。您可能還需要指定主機名,但 $socket 上的 awk 不會給您任何東西:)
@Renik 的回答對我不起作用。請參閱下面的內容。
這對我來說只使用控制主機的套接字文件:
$ ssh -o ControlPath=~/.ssh/<controlfile> -O check <bogus arg>
**注意:**您也可以使用
ssh -S ~/.ssh/<controlfile> ...
,它是上述形式的較短形式。例子
這是一個我已經建立到遠端伺服器的連接的範例:
$ ssh -S ~/.ssh/master-57db26a0499dfd881986e23a2e4dd5c5c63e26c2 -O check blah Master running (pid=89228) $
並且斷開連接:
$ ssh -S ~/.ssh/master-66496a62823573e4760469df70e57ce4c15afd74 -O check blah Control socket connect(/Users/user1/.ssh/master-66496a62823573e4760469df70e57ce4c15afd74): No such file or directory $
如果它仍然連接,這將迫使它立即退出:
$ ssh -S ~/.ssh/master-66496a62823573e4760469df70e57ce4c15afd74 -O exit blah Exit request sent. $
我不清楚,但它似乎可能是一個錯誤,
ssh
因為它最後需要一個額外的參數,即使blah
在我使用的開關的上下文中沒有意義。沒有它給我這個:
$ ssh -S ~/.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]
版本資訊
作業系統
$ 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
我確認在這兩個版本中,都需要額外的虛假參數。
參考