现在我有了 autossh 隧道,停止它的正确方法是什么?
似乎没有简单的方法可以做到这一点。文档对这部分内容不甚清楚。
最简单的方法似乎是重新启动机器?这是正确的吗?
答案1
不,正确的终止方法autossh
就是终止该进程autossh
,无需进行其他操作。
原因是
# file $(which autossh)
/usr/bin/autossh: POSIX shell script, ASCII text executable
这autossh
只是一个 shell 脚本,而不是服务它在最后一行启动一个新程序,
exec /usr/lib/autossh/autossh "$@"
再次不是服务。至于exec
(您可以在Bash 黑客维基),它是一个 shell 内置命令,它用以下命令(/usr/lib/autossh/autossh "$@"
在本例中)替换当前 shell,而不启动新进程。因此,仅有的停止的方法autossh
是终止调用脚本,例如
pkill -3 autossh
(谢谢德维尔洪指出使用-3标志,见下文)。顺便说一句,终止ssh
连接将不起作用,因为调用命令(IE,即上面的那个)一旦意识到旧连接已断开,就会立即启动一个新连接。
答案2
使用以下命令运行自动 ssh:
AUTOSSH_PIDFILE=/var/run/tunnel.pid autossh
用以下方法杀死它:
kill pid
顺便提一句
pkill -9 autossh
是错误的
-9
确保进程不会正常退出,因此当进程被终止ssh
时进程仍然存在autossh
没有-9
仍然很糟糕,如果你有多个隧道正在运行,pkill
将会杀死它们
正确的方法是设置AUTOSSH_PIDFILE
环境变量,然后kill
只设置 pid
答案3
搜索进程:
ps 辅助 |删除 SSH
第二列是 PID 编号
根据PID终止进程:)
kill -9 PID号
使用须藤如果您没有root权限。
答案4
我知道这个问题已经得到解答,但与上述评论相反,使用pkill -3 autossh
并不会为我终止 sshd 子进程。
.bashrc
我在我的文件中使用了这个函数。
基本上,它就像--kill
向 autossh 添加一个参数。
if [ "$1" = "--kill" ]; then
ps aux |
grep -P "(/usr/bin/ssh|/usr/lib/autossh/autossh)\s.*$2" |
awk '{print $2}' |
xargs -r kill
else
$(which autossh) "$@"
echo "" # prevents line wrapping when you kill the ssh process
fi
您可以运行which ssh
并which autossh
检查系统上的路径。
只要第一个参数不是--kill
,它就会将参数传递给 autossh。
此脚本会终止 autossh 和 ssh 实例。如果您使用端口转发,这一点很重要,因为仅终止 autossh 实例不会终止隧道,它只会在隧道最终断开连接时阻止其重新连接。
您还可以指定搜索词(主机名)来仅终止特定的隧道。
autossh --kill dbserver1
仅终止与 dbserver1 的连接将终止
autossh --kill dbserver
dbserver1、dbserver2 等的连接。
autossh --kill dbserver
全部autossh 连接
需要澄清的是,它应该只终止由 autossh 启动的 SSH 会话。
如果在 autossh 和 ssh 会话都运行时运行ps aux | grep ssh
,您将看到 autossh 启动的会话使用完整路径(/usr/bin/ssh 和 /usr/lib/autossh/autossh)。
此脚本仅将结果与使用特定路径启动的进程进行匹配。我这样做是因为我(我认为大多数人也是)通常键入ssh
而不是完整路径,这样可以防止它终止我的正常 ssh 会话。
希望这对其他人有帮助。