Esiste un comando in Linux che attende che venga terminato?


11

Sto cercando di creare un file batch di Windows, che avvia putty / plink con il port forwarding e nient'altro. Finora la parte di Windows è pronta:

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

Dato che non voglio consentire l'esecuzione di altri comandi dopo l'autenticazione, sto usando ForceCommanduna Match Userdichiarazione:

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

Il problema è che l'esecuzione del mio file batch avvia correttamente putty, ma si chiude immediatamente dopo aver eseguito l'eco del testo specificato.

La mia idea è di usare qualcosa del genere:

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

In questo modo, putty / SSH dovrebbe mantenere attiva la connessione e non uscire dal mio port forwarding.

Ho pensato a comandi come yes, pingo read, ma loro

  • stanno inviando spam al mio terminale
  • stanno effettivamente facendo cose / generando un carico inutile della CPU
  • potrebbe chiudersi inaspettatamente, se qualcuno preme invio

Esiste un comando che non farà nulla, per sempre, finché qualcuno non lo termina con Ctrl + C o chiude la connessione SSH chiudendo la finestra dello stucco?

Per cosa dovrei usare waitTillControlC?


Ho trovato domande come superuser.com/questions/587629/… , ma avrebbero lasciato l'utente con una shell pronta.
stuXnet,

Risposte:


13

Non capisco perché tutte le altre risposte vogliono usare un ciclo qui, il sonno è in grado di aspettare abbastanza a lungo per qualsiasi scopo pratico e non utilizzerà alcun ciclo di clock per farlo.

Ad esempio, proverà qui a dormire per un dubbio di cento anni e probabilmente lo farà abbastanza per soddisfare comunque la richiesta:

echo "Something"; sleep 36500d

In alternativa, anche questo dovrebbe bloccarsi finché non si digita la Enterchiave:

echo "Something"; read foo

9

Prova -Ninvece l' opzione. Dalla plinkdocumentazione :

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

Questo è lo stesso comportamento sshdell'opzione -N, come descritto nella pagina man :

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

2
Questa dovrebbe essere la risposta accettata. Gli altri dicono come risolvere il problema, ma questo dice come farlo nel modo giusto .
Moshe Katz,

Grazie per la modifica; non avendo una scatola di Windows da controllare, non pensavo di cercare documenti di plink online.
Chepner,

Questa risposta non soddisfa i miei bisogni, perché I don't want to allow to execute other commands after authentication. -Ncompirebbe questo sul lato client, quindi potresti semplicemente rimuovere -N per eseguire altri comandi dopo l'autenticazione.
stuXnet,

8

Questo dovrebbe dormire per sempre senza consumare alcuna quantità (evidente) di potenza della CPU.

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

Inoltre, non sono sicuro che tu possa dare un comando come nella ForceCommandclausola. Potrebbe essere necessario inserire il comando in uno script di shell.

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

Questo script dovrebbe ovviamente trovarsi in una posizione e avere autorizzazioni tali che nessun utente ordinario sul server può scrivergli.

Match User sampleUser
    ForceCommand /usr/bin/waitforever

modificare

Ho trovato un comando che sembra più elegante:

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

tail -fattende che un file o un flusso restituisca byte. (Altrimenti utile per la visione dei registri in tempo reale.) /dev/nullNon restituirà mai byte. E così il comando dormirà per sempre.


In questo momento, stavo provando un ciclo del sonno per me stesso - sì, funziona sicuramente! Anche direttamente con ForceCommand:ForceCommand echo 'congrats' && while true; do sleep 9999; done
stuXnet il

tail -f /dev/nullè tecnicamente peggiore del loop 9999. Il processo si sveglia ogni secondo anziché ogni 2 ore e 56 minuti.
jlliagre,

L'ho trovato qui: unix.stackexchange.com/questions/42901/… La persona che risponde a quella domanda afferma "(supponendo che questo usi inotifichi internamente, non dovrebbero esserci sondaggi o riattivazioni, quindi oltre ad essere strano, dovrebbe essere sufficiente) "Questa affermazione o il presupposto che la coda usi in inotifymodo errato?
nitro2k01,

L'assunto è corretto, tailè ottimizzato per sfruttare inotifyquando disponibile. Questo dovrebbe essere il caso predefinito con la maggior parte se non tutte le distribuzioni abbastanza recenti. Tuttavia, ho appena testato su un laptop Linux e ho osservato attività spurie con il tailmonitoraggio, /dev/nullquindi è sicuramente peggio che dormire in termini di cicli di clock.
jlliagre,

Non credo che tailsi sveglierà sempre ogni secondo. Una possibile ragione del risultato è che lo si sta eseguendo in un terminale che può comunicare con tailqualsiasi motivo, mentre sleepnon lo sarà. Non vi è alcun motivo per cui si taildebba svegliare falsamente solo il monitoraggio /dev/null.
nitro2k01

0

Puoi semplicemente provare quanto segue:

echo "your commands" && while :; do sleep 1; done

1
Per i futuri visitatori, è necessario fornire un riepilogo di come funziona. Molti possono saperlo, ma non puoi presumere che tutto lo farà.
nerdwaller,

Un sleepperiodo più lungo sarà più facile sulla CPU, anche se sleep 1dovrebbe essere abbastanza sicuro su tutto ciò che è stato costruito negli ultimi due decenni ...
Shadur,

:è una scorciatoia per true. Preferirei anche un sleepperiodo più lungo per principio.
nitro2k01

0

Stai cercando di risolverlo dalla parte sbagliata. Non vuoi che la shell non esca, vuoi che lo stucco lasci la finestra aperta.

http://the.earth.li/~sgtatham/putty/0.60/htmldoc/Chapter4.html#config-closeonexit - descrive esattamente cosa è necessario modificare. Se si desidera utilizzare l'opzione "solo all'uscita pulita", è sufficiente aggiungere exit 1alla fine di ForceCommand.

Modifica: ho frainteso; vuoi solo mantenere le porte inoltrate, non vuoi mantenere l'output del ForceCommand. In tal caso, http://tartarus.org/~simon/putty-snapshots/htmldoc/Chapter4.html#config-ssh-noshell non fa quello che vuoi?


Il problema non è che la finestra si chiuda ma che il tunnel ssh sia chiuso. Dire a PuTTY di lasciare la finestra aperta mantiene anche il tunnel SSH?
Adrian Pronk,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.