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 ForceCommand
eine Match User
Deklaration:
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
, ping
oder 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 -N
Option aus.plink
Dokumentation:
-N don't start a shell/command (SSH-2 only)
Dies ist das gleiche Verhalten wie die ssh
Option -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 ForceCommand
Klausel 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 -f
wartet darauf, dass eine Datei oder ein Stream Bytes zurückgibt. (Ansonsten nützlich, um Protokolle in Echtzeit zu beobachten.) /dev/null
gibt 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 1
am 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?