我尝试了以下组合来获取 ssh 会话的 pid(在后台运行显示 pid),然后使用 fg 返回 ssh 会话并输入密码:
ssh targetHost &; fg
我收到以下错误:
-bash: syntax error near unexpected token `;'
为什么会有“;”在这种情况下无法按预期工作?
我的目标是启动 ssh 会话并了解其 pid,我需要用尽可能少的行来完成此操作。我需要启动几个 ssh 会话,将它们放在后台,最后杀死它们 - 这就是我需要 pid 的原因。
答案1
您混淆了两种不同的情况:
foo ; bar
将运行 foo,等待它完成,然后运行 barfoo & bar
将启动 foo,将其置于后台,然后直接启动 bar。
您必须决定是使用其中一种还是另一种。你不能两者兼得。 ;)
要解决您的问题,您只需在后台运行所有作业,然后使用job
列出 pid:
michas@lenny:~$ sleep 10 &
[1] 18007
michas@lenny:~$ sleep 10 &
[2] 18011
michas@lenny:~$ sleep 10 &
[3] 18015
michas@lenny:~$ sleep 10 &
[4] 18019
michas@lenny:~$ sleep 10 &
[5] 18026
michas@lenny:~$ jobs -p
18007
18011
18015
18019
18026
michas@lenny:~$
您也不一定需要 pid 来发送终止信号。例如kill %1
将杀死第一个后台进程。
答案2
&;
总是错的。如果您想在后台以紧凑的一行方式运行某些内容,请省略“;”完全且简单地&
在命令之间使用。
for i in ./*; do my_command "$i" & done
答案3
其他人已经解释了&;
失败的原因。我想指出最后一个后台进程的 PID 保存为$!
.因此,您始终可以访问最后一个命令的 PID:
ssh targetHost & echo $!; fg
至于杀死它们,您可以ssh
使用以下命令杀死所有会话:
pkill -x ssh
原因并匹配完整的命令名称,这确保您不会x
杀死或。如果您只想终止与特定计算机的连接,您也可以这样做:pkill
pgrep
sshd
ssh-agent
pkill $(pgrep -alx ssh | grep TARGET_IP | cut -d ' ' -f 1)