Gibt es in Linux einen Befehl, der wartet, bis er beendet wird?

Gibt es in Linux einen Befehl, der wartet, bis er beendet wird?

Ich versuche, eine Windows-Batchdatei zu erstellen, die Putty/Plink mit Portweiterleitung startet, und sonst nichts. Der Windows-Teil ist soweit fertig:

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

Da ich die Ausführung anderer Befehle nach der Authentifizierung nicht zulassen möchte, verwende ich ForceCommandeine Match UserDeklaration:

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

Das Problem besteht darin, dass Putty beim Ausführen meiner Batchdatei zwar korrekt gestartet wird, sich jedoch unmittelbar nach der Ausführung schließt und den von mir angegebenen Text wiedergibt.

Meine Idee ist, so etwas zu verwenden:

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

Auf diese Weise sollte Putty/SSH die Verbindung aufrechterhalten und meine Portweiterleitung nicht beenden.

Ich habe an Befehle wie yes, pingoder gedacht read, aber sie

  • spammen mein Terminalfenster
  • tatsächlich etwas tun / unnötige CPU-Last erzeugen
  • könnte unerwartet geschlossen werden, wenn jemand die Eingabetaste drückt

Gibt es einen Befehl, der für immer nichts tut, bis ihn jemand mit Strg+C beendet oder die SSH-Verbindung durch Schließen des Putty-Fensters beendet?

Wofür soll ich es verwenden waitTillControlC?

Antwort1

Ich verstehe nicht, warum alle anderen Antwortenden hier eine Schleife verwenden wollen, der Sleep-Modus kann für jeden praktischen Zweck lange genug warten und verbraucht dabei keine Taktzyklen.

Hier wird beispielsweise versucht, zweifelhafte hundert Jahre lang zu schlafen und dies wahrscheinlich ausreichend tun, um der Aufforderung trotzdem nachzukommen:

echo "Something"; sleep 36500d

Alternativ sollte dies auch blockiert sein, bis Sie den EnterSchlüssel eingeben:

echo "Something"; read foo

Antwort2

Probieren Sie stattdessen diese -NOption aus.plinkDokumentation:

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

Dies ist das gleiche Verhalten wie die sshOption -N, wie beschrieben in dermanpage:

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

Antwort3

Dies sollte für immer in den Ruhezustand wechseln, ohne (spürbar) viel CPU-Leistung zu verbrauchen.

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

Ich bin mir auch nicht sicher, ob Sie einen Befehl wie in der ForceCommandKlausel eingeben können. Möglicherweise müssen Sie den Befehl in ein Shell-Skript einfügen.

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

Dieses Skript sollte sich natürlich an einem Ort befinden und über solche Berechtigungen verfügen, dass kein normaler Benutzer auf dem Server darin schreiben kann.

Match User sampleUser
    ForceCommand /usr/bin/waitforever

Bearbeiten

Ich habe einen Befehl gefunden, der eleganter erscheint:

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

tail -fwartet darauf, dass eine Datei oder ein Stream Bytes zurückgibt. (Ansonsten nützlich, um Protokolle in Echtzeit zu beobachten.) /dev/nullgibt niemals Bytes zurück. Daher bleibt der Befehl für immer im Ruhezustand.

Antwort4

Sie versuchen, dies von der falschen Seite zu lösen. Sie möchten nicht, dass die Shell nicht beendet wird, Sie möchten, dass Putty das Fenster geöffnet lässt.

http://the.earth.li/~sgtatham/putty/0.60/htmldoc/Chapter4.html#config-closeonexit- beschreibt genau, was Sie ändern müssen. Wenn Sie die Option „nur bei sauberem Beenden“ verwenden möchten, fügen Sie sie einfach exit 1am Ende des ForceCommands hinzu.

Bearbeiten:Ich habe das falsch verstanden. Sie möchten nur die weitergeleiteten Ports beibehalten, nicht aber die Ausgabe des ForceCommand. In diesem Fall funktioniert das nicht.http://tartarus.org/~simon/putty-snapshots/htmldoc/Chapter4.html#config-ssh-noshellTun Sie, was Sie wollen?

verwandte Informationen