¿Hay un comando en Linux que espere hasta que se termine?

11

Estoy tratando de construir un archivo por lotes de Windows, que comienza masilla / plink con reenvío de puertos, y nada más. La parte de Windows está lista hasta ahora:

start plink.exe -ssh -i key.ppk -L 1234:localhost:80 sampleUser@192.168.0.1

Como no quiero permitir ejecutar otros comandos después de la autenticación, estoy usando ForceCommanduna Match Userdeclaración:

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

El problema es que la ejecución de mi archivo por lotes inicia la masilla correctamente, pero se cierra inmediatamente después de ejecutar el eco de mi 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 viva la conexión y no cerrar mi 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 carga innecesaria de CPU
  • podría cerrarse inesperadamente, si alguien presiona enter

¿Hay un comando que no hará nada, para siempre, hasta que alguien lo termine con Ctrl + C o cierre la conexión SSH al cerrar la ventana de masilla?

¿Para qué debo usar waitTillControlC?

stuXnet
fuente
Encontré preguntas como superuser.com/questions/587629/… , pero dejarían al usuario con un shell listo.
stuXnet

Respuestas:

13

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

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

echo "Something"; sleep 36500d

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

echo "Something"; read foo
jlliagre
fuente
9

Prueba la -Nopción en su lugar. De la plinkdocumentació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 la página del manual :

-N      Do not execute a remote command.  This is useful for just for-
         warding ports (protocol version 2 only).
chepner
fuente
2
Esta debería ser la respuesta aceptada. Los otros dicen cómo hacer una solución, pero este dice cómo hacerlo bien .
Moshe Katz
Gracias por la edición; sin tener una caja de Windows para verificar, no pensé en buscar documentos de plink en línea.
chepner
Esta respuesta no se ajusta a mis necesidades, porque I don't want to allow to execute other commands after authentication. -Nlograría esto en el lado del cliente, por lo que podría eliminar -N para ejecutar otros comandos después de la autenticación.
stuXnet
8

Esto debería dormir 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 puede dar un comando como en la ForceCommandcláusula. Es posible que deba 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

Este script, por supuesto, debe estar en un lugar y tener permisos para que ningún usuario ordinario en el servidor pueda escribirle.

Match User sampleUser
    ForceCommand /usr/bin/waitforever

Editar

He encontrado 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.

nitro2k01
fuente
En este momento, estaba probando un ciclo de sueño para mí, sí, ¡esto funciona definitivamente! Incluso directamente con ForceCommand:ForceCommand echo 'congrats' && while true; do sleep 9999; done
stuXnet
tail -f /dev/nulles técnicamente peor que el bucle 9999. El proceso se activará cada segundo en lugar de cada 2 horas y 56 minutos.
jlliagre
Lo encontré aquí: unix.stackexchange.com/questions/42901/… La persona que responde esa pregunta dice "(suponiendo que este uso inotifique internamente, no debería haber sondeos ni alertas, por lo que aparte de tener un aspecto extraño, debería ser suficiente) "¿Es esta declaración o la suposición de que la cola usa inotifyincorrecto?
nitro2k01
El supuesto es correcto, tailestá optimizado para aprovechar inotifycuando esté disponible. Este debería ser el caso predeterminado con la mayoría, si no todas, las distribuciones lo suficientemente recientes. Sin embargo, acabo de probar en una computadora portátil Linux y observé una actividad espuria con el tailmonitoreo, /dev/nullpor lo que ciertamente es peor que dormir en términos de ciclos de reloj.
jlliagre
No creo que taileso siempre se despierte cada segundo. Una posible razón para el resultado es que lo está ejecutando en un terminal con el que se puede comunicar tailpor cualquier razón, sleeppero no lo hará. No hay ninguna razón por la cual se taildeba despertar espuriamente solo con el monitoreo /dev/null.
nitro2k01
0

Simplemente puede intentar lo siguiente:

echo "your commands" && while :; do sleep 1; done
usuario2783132
fuente
1
Para futuros visitantes, debe proporcionar un resumen de cómo funciona esto. Muchos pueden saberlo, pero no puedes asumir que todo lo hará.
nerdwaller
Un sleepperíodo más largo será más fácil para la CPU, aunque incluso sleep 1debería ser lo suficientemente seguro en cualquier cosa construida en las últimas dos décadas ...
Shadur
:es una abreviatura de true. También preferiría un sleepperíodo más largo solo por principio.
nitro2k01
0

Estás tratando de resolver esto desde el extremo equivocado. No desea que el shell no salga, desea que la masilla 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 agregue exit 1al final de ForceCommand.

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

Gabe
fuente
El problema no es que la ventana se cierre sino que el túnel ssh se cierre. ¿Decirle a PuTTY que deje la ventana abierta también mantiene el túnel ssh?
Adrian Pronk