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

Tim*_*ske 8 ssh openssh

有没有更直接的方式来退出一个OpenSSH的控制主进程并删除其套接字文件不是与程序的帮助lsoffuser 不知道目的地本的接受的答案建议主机(连接方式)的问题?我想到了这样的事情:

$ ssh -O exit -S ~/.ssh/7eb92b0827f3e8e1e8591fb3d1a5cd1b94b758cb.socket
Run Code Online (Sandbox Code Playgroud)

我之所以这么问,是因为我正在寻找一种可编写脚本的方式来在每次注销我的用户帐户时退出每个打开的控制主连接。不这样做会导致我的sytemd -Powered openSUSE的计算机等待两分钟超时,直到它强行终止依然敞开控制主站连接关闭最终供电。

不幸的是,OpenSSH 的客户端程序ssh需要目标主机和ControlPath文件名模式才能推断出套接字文件的实际文件路径。相反,我想到了通过程序-S ctl_path选项提供具体套接字文件的更直接方法。

在系统范围的OpenSSH客户端配置文件的全局部分,我配置了OpenSSH 的连接多路复用功能,如下所示:

ControlMaster auto      
ControlPath ~/.ssh/%C.socket
ControlPersist 30m
Run Code Online (Sandbox Code Playgroud)

请注意,我想保持套接字文件的文件名模式,即哈希令牌字符串%l%h%p%r与令牌%C

有任何想法吗?

slm*_*slm 9

这对我来说只使用控制主机的套接字文件:

$ ssh -o ControlPath=~/.ssh/<controlfile> -O check <bogus arg>
Run Code Online (Sandbox Code Playgroud)

注意:您也可以使用ssh -S ~/.ssh/<controlfile> ...,它是上述形式的一个更短的形式。

例子

这是我已经建立到远程服务器的连接的示例:

$ ssh -S ~/.ssh/master-57db26a0499dfd881986e23a2e4dd5c5c63e26c2 -O check blah
Master running (pid=89228)
$
Run Code Online (Sandbox Code Playgroud)

并断开连接:

$ ssh -S ~/.ssh/master-66496a62823573e4760469df70e57ce4c15afd74 -O check blah
Control socket connect(/Users/user1/.ssh/master-66496a62823573e4760469df70e57ce4c15afd74): No such file or directory
$
Run Code Online (Sandbox Code Playgroud)

如果它仍然连接,这将迫使它立即退出:

$ ssh -S ~/.ssh/master-66496a62823573e4760469df70e57ce4c15afd74 -O exit blah
Exit request sent.
$
Run Code Online (Sandbox Code Playgroud)

我不清楚,但它似乎可能是一个错误,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]
Run Code Online (Sandbox Code Playgroud)

版本信息

操作系统
$ ssh -V
OpenSSH_6.9p1, LibreSSL 2.1.8
Run Code Online (Sandbox Code Playgroud) CentOS 7.x
$ ssh -V
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips  26 Jan 2017
Run Code Online (Sandbox Code Playgroud)

我确认在这两个版本中,都需要额外的虚假参数。

更新 #1

将此作为 OpenSSH上游的潜在错误提出,他们回复如下:

是的 - 这是故意的。

ControlPath 可能包含需要主机名才能完全扩展的 %-expansions。

我们可以想象,检查 ControlPath 是否真的需要这个,并使主机名可选,但 1) 使用 %h 的 ControlPath 很常见,2) 我不想让参数解析代码比现在更像一个迷宫。

参考