ssh targetHost &; fg - не работает, но почему?

ssh targetHost &; fg - не работает, но почему?

Я пробовал следующую комбинацию, чтобы получить pid сеанса ssh (запуск в фоновом режиме отображает 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. Например, 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)

Связанный контент