ssh 目標主機 &; fg - 不起作用,但為什麼呢?

ssh 目標主機 &; fg - 不起作用,但為什麼呢?

我嘗試使用以下組合來獲取 ssh 會話的 pid(在後台運行顯示 pid),然後使用 fg 返回 ssh 會話並引入密碼:

ssh targetHost &; fg

我收到以下錯誤:

-bash: syntax error near unexpected token `;'

為什麼會有“;”在這種情況下無法如預期般工作?

我的目標是啟動 ssh 會話並了解其 pid,我需要用盡可能少的行來完成此操作。我需要啟動幾個 ssh 會話,將它們放在後台,最後殺死它們 - 這就是我需要 pid 的原因。

答案1

您混淆了兩種不同的情況:

  • foo ; bar將運行 foo,等待它完成,然後運行 bar
  • foo & 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

# 看http://mywiki.wooledge.org/BashPitfalls

答案3

其他人已經解釋了&;失敗的原因。我想指出最後一個後台進程的 PID 保存為$!.因此,您始終可以存取最後一個命令的 PID:

ssh targetHost & echo $!; fg

至於殺死它們,您可以ssh使用以下命令殺死所有會話:

pkill -x ssh

原因並匹配完整的命令名稱,這確保您不會x殺死或。如果您只想終止與特定電腦的連接,您也可以這樣做:pkillpgrepsshdssh-agent

pkill $(pgrep -alx ssh | grep TARGET_IP | cut -d ' ' -f 1)

相關內容