有没有更直接的退出方式开放SSH控制主进程并删除其套接字文件,而不是借助程序lsof
或fuser
和不知道目的地主机(连接详细信息)如已接受的答案所示问题?我想到了这样的事情:
$ ssh -O exit -S ~/.ssh/7eb92b0827f3e8e1e8591fb3d1a5cd1b94b758cb.socket
我之所以这么问,是因为我正在寻找一种可编写脚本的方法,以便每次注销用户帐户时退出每个打开的控制主连接。不这样做会导致我的系统动力开放SUSE计算机等待两分钟超时,直到强制终止仍然打开的控制主连接,最终关闭电源。
很遗憾OpenSSH 的客户端程序ssh
需要目的地主机和ControlPath
文件名模式,以便推断套接字文件的实际文件路径。相反,我想到了更直接的方法,通过程序的-S ctl_path
选项提供具体的套接字文件。
在我的系统范围的全局部分开放SSH我配置的客户端配置文件OpenSSH 的连接复用特性如下:
ControlMaster auto
ControlPath ~/.ssh/%C.socket
ControlPersist 30m
请注意,我想保留套接字文件的文件名模式,即使用 token%l%h%p%r
对令牌字符串进行哈希处理%C
。
有任何想法吗?
答案1
这对我来说仅使用控制主机的套接字文件即可:
$ 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]
版本信息
操作系统X$ 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
我确认,在这两个版本中,都需要额外的虚假参数。
更新#1
我将此作为 OpenSSH 的潜在错误提出上游,他们回复如下:
是的——这是故意的。
ControlPath 可能包含需要主机名才能完全扩展的 % 扩展。
我们可以想象检查 ControlPath 是否确实需要这个并使主机名可选,但是 1) 使用 %h 的 ControlPaths 很常见,2) 我不想让参数解析代码变得比现在更加迷宫。
参考
答案2
我编写了一个实用程序来简化 SSH ControlMaster 连接的管理。它被称为cmc
:
TimidRobot/cmc:ControlMaster 控制器 - 简化 SSH ControlMaster 连接的管理。