如何在不使用lsof或fuser的情况下退出OpenSSH控制主进程?

如何在不使用lsof或fuser的情况下退出OpenSSH控制主进程?

有没有更直接的退出方式开放SSH控制主进程并删除其套接字文件,而不是借助程序lsoffuser 不知道目的地主机(连接详细信息)如已接受的答案所示问题?我想到了这样的事情:

$ 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 连接的管理

相关内容