Ich möchte in der Lage sein, über ssh Signale zu senden (SIGINT ist das wichtigste).
Dieser Befehl:
ssh server "sleep 1000;echo f" > foo
wird den Schlafmodus auf dem Server starten und nach 1000 Sekunden 'f \ n' in die Datei foo auf meinem lokalen Computer einfügen. Wenn ich STRG-C drücke (dh SIGINT an ssh senden), wird ssh beendet, der Schlaf auf dem Remote-Server wird jedoch nicht beendet. Ich möchte, dass es den Schlaf auf dem Remote-Server beendet.
Also habe ich versucht:
ssh server -t "sleep 1000;echo f" > foo
Aber wenn stdin kein Terminal ist, bekomme ich diese Fehlermeldung:
Pseudo-terminal will not be allocated because stdin is not a terminal.
und dann wird SIGINT immer noch nicht weitergeleitet.
Also habe ich versucht:
ssh server -t -t "sleep 1000;echo f" > output
Aber dann ist die Ausgabe in foo nicht 'f \ n', sondern 'f \ r \ n', was in meiner Situation katastrophal ist (da es sich bei meiner Ausgabe um Binärdaten handelt).
In der obigen Beschreibung verwende ich "sleep 1000; echo f", aber in Wirklichkeit wird dies vom Benutzer bereitgestellt und kann daher alles enthalten. Wenn wir es jedoch für "sleep 1000; echo f" zum Laufen bringen können, können wir es höchstwahrscheinlich für alle realistischen Situationen zum Laufen bringen.
Es ist mir wirklich egal, ob ich ein Pseudo-Terminal am anderen Ende bekomme, aber ich konnte keinen anderen Weg finden, um ssh dazu zu bringen, mein SIGINT weiterzuleiten.
Gibt es eine andere Art und Weise?
Bearbeiten:
Der Benutzer könnte Befehle geben, die Binärdaten aus stdin lesen, wie zum Beispiel:
seq 1000 | gzip | ssh server "zcat|bzip2; sleep 1000" | bzcat > foo
Der Benutzer kann Befehle geben, die CPU-intensiv sind, wie zum Beispiel:
ssh server "timeout 1000 burnP6"
Edit2:
Die Version, die für mich zu funktionieren scheint, ist:
your_preprocessing |
uuencode a | ssh -tt -oLogLevel=quiet server "stty isig -echoctl -echo ; uudecode -o - |
your_command |
uuencode a" | uudecode -o - |
your_postprocessing
Vielen Dank an digital_infinity für den Hinweis in die richtige Richtung.
ssh
muss komplizierter sein als das, was Sie als Beispiele zeigen, weil Sie das gewünschte Verhalten durch eine einfache Neuanordnung erreichen können:sleep 1000 && ssh server "echo f" > foo
(Das muss&&
nicht;
so sein, dass das Tötensleep
diessh
Ausführung des Befehls verhindert .) Wenn ich Bitte machen Sie Ihre Beispiele repräsentativer für Ihre tatsächliche Verwendung, damit eine bessere Antwort gegeben werden kann.