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

11

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 sampleUser@192.168.0.1

Da ich nicht zulassen möchte, dass andere Befehle nach der Authentifizierung ausgeführt werden, verwende ich ForceCommandeine Match UserDeklaration:

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

Das Problem ist, dass das Ausführen meiner Batch-Datei Putty korrekt startet, aber sofort nach dem Ausführen des Echo meines angegebenen Textes geschlossen wird.

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 aufrecht erhalten und meine Portweiterleitung nicht beenden.

Ich habe wie von Befehlen gedacht yes, pingoder readaber sie

  • spammen mein Terminalfenster
  • machen tatsächlich Sachen / erzeugen unnötige CPU-Last
  • könnte unerwartet schließen, wenn jemand die Eingabetaste drückt

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

Wofür soll ich verwenden waitTillControlC?

stuXnet
quelle
Ich habe Fragen wie superuser.com/questions/587629/… gefunden , aber sie würden dem Benutzer eine fertige Shell hinterlassen.
stuXnet

Antworten:

13

Ich verstehe nicht, warum alle anderen Antworten hier eine Schleife verwenden möchten, der Schlaf kann lange genug auf einen praktischen Zweck warten und verwendet dabei keine Taktzyklen.

Zum Beispiel wird es hier versuchen, zweifelhafte hundert Jahre zu schlafen, und es wird wahrscheinlich genug tun, um der Bitte trotzdem nachzukommen:

echo "Something"; sleep 36500d

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

echo "Something"; read foo
jlliagre
quelle
9

Versuchen Sie -Nstattdessen die Option. Aus der plinkDokumentation :

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

Dies ist das gleiche Verhalten wie bei der sshOption -N, wie in der Manpage beschrieben :

-N      Do not execute a remote command.  This is useful for just for-
         warding ports (protocol version 2 only).
chepner
quelle
2
Dies sollte die akzeptierte Antwort sein. Die anderen sagen, wie man eine Problemumgehung macht, aber diese sagt, wie man es richtig macht .
Moshe Katz
Danke für die Bearbeitung; Da ich kein Windows-Kontrollkästchen hatte, dachte ich nicht daran, online nach Plink-Dokumenten zu suchen.
Chepner
Diese Antwort passt nicht zu meinen Bedürfnissen, weil I don't want to allow to execute other commands after authentication. -Nwürde dies auf der Clientseite erreichen, so dass Sie einfach -N entfernen könnten, um andere Befehle nach der Authentifizierung auszuführen.
stuXnet
8

Dies sollte für immer schlafen, ohne (spürbare) Menge an 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 geben 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 Berechtigungen verfügen, sodass kein gewöhnlicher Benutzer auf dem Server darauf 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. (Andernfalls nützlich, um Protokolle in Echtzeit zu überwachen.) /dev/nullGibt niemals Bytes zurück. Und so wird der Befehl für immer schlafen.

nitro2k01
quelle
In diesem Moment habe ich selbst eine Schlafschleife ausprobiert - ja, das funktioniert definitiv! Auch direkt mit ForceCommand:ForceCommand echo 'congrats' && while true; do sleep 9999; done
stuXnet
tail -f /dev/nullist technisch schlechter als die 9999-Schleife. Der Vorgang wird jede Sekunde statt alle 2 Stunden und 56 Minuten aktiviert.
Jlliagre
Ich habe es hier gefunden: unix.stackexchange.com/questions/42901/… Die Person, die diese Frage beantwortet, behauptet: " "Ist diese Aussage oder die Annahme, dass Schwanz inotifyfalsch verwendet?
Nitro2k01
Die Annahme ist richtig und tailwird optimiert, um sie zu nutzen, inotifywenn sie verfügbar ist. Dies sollte der Standardfall bei den meisten, wenn nicht allen aktuellen Distributionen sein. Ich habe jedoch gerade auf einem Linux-Laptop getestet und beim tailÜberwachen falsche Aktivitäten beobachtet, /dev/nullso dass es sicherlich schlimmer ist, in Bezug auf Taktzyklen zu schlafen.
Jlliagre
Ich glaube nicht, dass taildas immer jede Sekunde aufwachen wird. Ein möglicher Grund für das Ergebnis ist, dass Sie es in einem Terminal ausführen, mit dem möglicherweise tailaus irgendeinem Grund kommuniziert wird , während dies sleepnicht der Fall ist . Es gibt keinen Grund, warum tailman nur die Überwachung fälschlicherweise aufwachen sollte /dev/null.
Nitro2k01
0

Sie können einfach Folgendes ausprobieren:

echo "your commands" && while :; do sleep 1; done
user2783132
quelle
1
Für zukünftige Besucher sollten Sie eine Zusammenfassung der Funktionsweise bereitstellen. Viele mögen es wissen, aber Sie können nicht jeden Willen annehmen.
Nerdwaller
Ein längerer sleepZeitraum wird die CPU sleep 1
entlasten
:ist eine Abkürzung für true. Ich würde auch sleepaus Prinzip eine längere Zeit bevorzugen .
Nitro2k01
0

Sie versuchen, dies vom falschen Ende aus zu lösen. Sie möchten nicht, dass die Shell nicht beendet wird, Sie möchten, dass Kitt das Fenster offen 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 ForceCommand hinzu.

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

Gabe
quelle
Das Problem ist nicht, dass das Fenster geschlossen wird, sondern dass der SSH-Tunnel heruntergefahren wird. Wird der SSH-Tunnel auch beibehalten, wenn PuTTY angewiesen wird, das Fenster offen zu lassen?
Adrian Pronk