在充分尊重 , , 等的用户的情况下pgrep
,pkill
有ps | awk
一个更好的方法。
考虑一下,如果您依赖于ps -aux | grep ...
查找进程,您将面临发生冲突的风险。您可能有一个不太可能的用例,但作为一般规则,这不是要走的路。
SSH 提供了一种管理和控制后台进程的机制。但就像许多 SSH 的东西一样,它是一个“高级”功能,许多人(似乎,从这里的其他答案看来)并不知道它的存在。
在我自己的用例中,我在家中有一个工作站,我想在其上留下一条隧道,该隧道连接到我办公室内部网络上的 HTTP 代理,另一个让我可以快速访问位于同一位置的服务器上的管理界面. 这就是您可以创建从家里启动的基本隧道的方式:
$ ssh -fNT -L8888:proxyhost:8888 -R22222:localhost:22 officefirewall
$ ssh -fNT -L4431:www1:443 -L4432:www2:443 colocatedserver
这些会导致 ssh 自己后台运行,从而使隧道保持打开状态。但是如果隧道消失了,我就卡住了,如果我想找到它,我必须解析我的进程列表和 home 我有“正确”的 ssh(以防我不小心启动了多个看起来相似的)。
相反,如果我想管理多个连接,我会使用 SSH 的ControlMaster
配置选项以及-O
用于控制的命令行选项。例如,在我的~/.ssh/config
文件中有以下内容,
host officefirewall colocatedserver
ControlMaster auto
ControlPath ~/.ssh/cm_sockets/%r@%h:%p
上面的 ssh 命令在运行时将离开 spoor,~/.ssh/cm_sockets/
然后可以在其中提供控制访问权限,例如:
$ ssh -O check officefirewall
Master running (pid=23980)
$ ssh -O exit officefirewall
Exit request sent.
$ ssh -O check officefirewall
Control socket connect(/home/ghoti/.ssh/cm_socket/ghoti@192.0.2.5:22): No such file or directory
此时,隧道(和控制 SSH 会话)消失了,无需使用锤子(kill
、killall
、pkill
等)。
将其带回您的用例...
您正在建立要在 TCP 端口 12345 上与之通信的隧道。syngergyc
为此syngergys
,我将执行以下操作。
~/.ssh/config
在您的文件中添加一个条目:
Host otherHosttunnel
HostName otherHost
User otherUser
LocalForward 12345 otherHost:12345
RequestTTY no
ExitOnForwardFailure yes
ControlMaster auto
ControlPath ~/.ssh/cm_sockets/%r@%h:%p
请注意,命令行-L
选项是使用关键字处理的LocalForward
,并且包含 Control{Master,Path} 行以确保您在建立隧道后拥有控制权。
然后,您可以将 bash 脚本修改为以下内容:
#!/bin/bash
if ! ssh -f -N otherHosttunnel; then
echo "ERROR: couldn't start tunnel." >&2
exit 1
else
synergyc localhost
ssh -O exit otherHosttunnel
fi
该-f
选项使隧道成为背景,在您的 ControlPath 上留下一个套接字,以便稍后关闭隧道。如果 ssh 失败(可能是由于网络错误或ExitOnForwardFailure
),则无需退出隧道,但如果它没有失败(else
),则启动 synergyc 并在退出后关闭隧道。
您可能还想查看是否LocalCommand
可以使用SSH 选项synergyc
从您的 ssh 配置文件中直接启动。