ssh destinoHost &; fg - no funciona, pero ¿por qué?

ssh destinoHost &; fg - no funciona, pero ¿por qué?

Estaba probando la siguiente combinación para obtener el pid de la sesión ssh (la ejecución en segundo plano muestra el pid) y luego fg para volver a la sesión ssh e introducir la contraseña:

ssh targetHost &; fg

Obtuve el siguiente error:

-bash: syntax error near unexpected token `;'

¿Por qué el ";" ¿No funciona como se esperaba en este caso?

Mi objetivo es iniciar una sesión ssh y conocer su pid y necesito hacerlo en la menor cantidad de líneas posible. Necesito iniciar varias sesiones ssh, ponerlas en segundo plano y al final finalizarlas; por eso necesito los pids.

Respuesta1

Estás mezclando dos casos diferentes:

  • foo ; barejecutará foo, esperará a que termine y luego ejecutará bar
  • foo & bariniciará foo, lo pondrá en segundo plano e iniciará la barra inmediatamente después.

Tienes que decidir si usas uno u otro. No puedes hacer ambas cosas. ;)

Para resolver su problema, simplemente puede ejecutar todos los trabajos en segundo plano y luego usarlos jobpara enumerar los 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:~$ 

Tampoco es necesario que los pids envíen señales de muerte. Por ejemplo, kill %1eliminará el primer proceso en segundo plano.

Respuesta2

&;siempre está mal. Si desea ejecutar cosas en segundo plano en una sola línea compacta, omita el ';' uso completo y sencillo &entre comandos.

for i in ./*; do my_command "$i" & done

# verhttp://mywiki.wooledge.org/BashPitfalls

Respuesta3

Otros ya han explicado por qué &;falla. Quería señalar que el PID del último proceso en segundo plano se guarda como $!. Por lo tanto, siempre puedes acceder al PID del último comando:

ssh targetHost & echo $!; fg

En cuanto a matarlos, puedes matar todas sshlas sesiones con este comando:

pkill -x ssh

Las xcausas pkilly pgreppara que coincidan con el nombre completo del comando, esto garantiza que no matará sshdo ssh-agent. Si solo desea eliminar las conexiones a una máquina específica, también puede hacer esto:

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

información relacionada