如何停止/终止 autossh 隧道?

如何停止/终止 autossh 隧道?

现在我有了 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 sshwhich autossh检查系统上的路径。

只要第一个参数不是--kill,它就会将参数传递给 autossh。

此脚本会终止 autossh 和 ssh 实例。如果您使用端口转发,这一点很重要,因为仅终止 autossh 实例不会终止隧道,它只会在隧道最终断开连接时阻止其重新连接。

您还可以指定搜索词(主机名)来仅终止特定的隧道。

autossh --kill dbserver1仅终止与 dbserver1 的连接将终止
autossh --kill dbserverdbserver1、dbserver2 等的连接。
autossh --kill dbserver全部autossh 连接

需要澄清的是,它应该只终止由 autossh 启动的 SSH 会话。

如果在 autossh 和 ssh 会话都运行时运行ps aux | grep ssh,您将看到 autossh 启动的会话使用完整路径(/usr/bin/ssh 和 /usr/lib/autossh/autossh)。
此脚本仅将结果与使用特定路径启动的进程进行匹配。我这样做是因为我(我认为大多数人也是)通常键入ssh而不是完整路径,这样可以防止它终止我的正常 ssh 会话。

希望这对其他人有帮助。

相关内容