¿Existe algún comando en Linux que espere hasta que finalice?

¿Existe algún comando en Linux que espere hasta que finalice?

Estoy intentando crear un archivo por lotes de Windows, que inicia PuTTY/plink con reenvío de puertos y nada más. La parte de Windows está lista hasta el momento:

start plink.exe -ssh -i key.ppk -L 1234:localhost:80 [email protected]

Como no quiero permitir la ejecución de otros comandos después de la autenticación, lo estoy usando ForceCommandcon una Match Userdeclaración:

Match User sampleUser
    ForceCommand echo 'Success! Close this window to log out.'

El problema es que al ejecutar mi archivo por lotes se inicia PuTTY correctamente, pero se cierra inmediatamente después de ejecutarlo haciendo eco del texto especificado.

Mi idea es usar algo como esto:

ForceCommand echo 'Success! Close this window to log out.' && waitTillControlC

De esta manera, PuTTY/SSH debería mantener activa la conexión y no abandonar el reenvío de puertos.

He pensado en comandos como yes, pingo read, pero

  • están enviando spam a mi ventana de terminal
  • en realidad están haciendo cosas/generando una carga de CPU innecesaria
  • podría cerrarse inesperadamente, si alguien presiona enter

¿Existe algún comando que no hará nada, para siempre, hasta que alguien lo finalice con Ctrl+C o cierre la conexión SSH cerrando la ventana de PuTTY?

¿Para qué debo utilizar waitTillControlC?

Respuesta1

No entiendo por qué todas las demás respuestas quieren usar un bucle aquí, el sueño puede esperar el tiempo suficiente para cualquier propósito práctico y no utilizará ciclos de reloj para hacerlo.

Por ejemplo, intentará dormir aquí durante cien años dudosos y probablemente lo hará lo suficiente para cumplir con la solicitud de todos modos:

echo "Something"; sleep 36500d

Alternativamente, esto también debería bloquearse hasta que escribas la Enterclave:

echo "Something"; read foo

Respuesta2

Pruebe la -Nopción en su lugar. Desde elplinkdocumentación:

-N        don't start a shell/command (SSH-2 only)

Este es el mismo comportamiento que la sshopción -N, como se describe en lapágina de manual:

-N      Do not execute a remote command.  This is useful for just for-
         warding ports (protocol version 2 only).

Respuesta3

Esto debería suspenderse para siempre sin consumir ninguna cantidad (notable) de energía de la CPU.

echo "Something" && while true; do sleep 9999; done

Tampoco estoy seguro de si puedes dar una orden como en la ForceCommandcláusula. Es posible que necesites poner el comando en un script de shell.

#!/usr/bin/env bash
echo "Success! Close this window to log out." && while true; do sleep 9999; done

Por supuesto, este script debería estar en un lugar y tener permisos tales que ningún usuario normal del servidor pueda escribir en él.

Match User sampleUser
    ForceCommand /usr/bin/waitforever

Editar

Encontré un comando que parece más elegante:

echo "Something" && tail -f /dev/null

tail -fespera a que un archivo o secuencia devuelva bytes. (De lo contrario, es útil para ver registros en tiempo real). /dev/nullnunca devolverá bytes. Y así el comando dormirá para siempre.

Respuesta4

Estás intentando resolver esto desde el lado equivocado. No desea que el shell no se cierre, desea que PuTTY deje la ventana abierta.

http://the.earth.li/~sgtatham/putty/0.60/htmldoc/Chapter4.html#config-closeonexit- describe exactamente lo que necesita cambiar. Si desea utilizar la opción "solo en salida limpia", simplemente agréguela exit 1al final de ForceCommand.

Editar:Entendí mal; solo desea mantener los puertos reenviados, no desea conservar la salida de ForceCommand. En ese caso, ¿nohttp://tartarus.org/~simon/putty-snapshots/htmldoc/Chapter4.html#config-ssh-noshell¿Haz lo que quieras?

información relacionada