
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 ForceCommand
con una Match User
declaració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
, ping
o 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 -N
opción en su lugar. Desde elplink
documentación:
-N don't start a shell/command (SSH-2 only)
Este es el mismo comportamiento que la ssh
opció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 ForceCommand
clá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 -f
espera a que un archivo o secuencia devuelva bytes. (De lo contrario, es útil para ver registros en tiempo real). /dev/null
nunca 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 1
al 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?