Ich möchte im Wesentlichen ein Skript auf Maschine A ausführen, das SSH in Maschine B ausführt, Befehle auf B ausführt und die Ausgabe an Maschine A zurückgibt.
Also erstelle ich ein csh-Skript, um dies zu tun, hoffentlich, wenn es möglich ist.
Diese Lösung aus dieser Antwort funktioniert beispielsweise über die Befehlszeile:
ssh user@host << 'ENDSSH'
ls -l
ENDSSH
Ich kann überprüfen, ob das ls auf der Fernbedienung und nicht lokal ausgeführt wird.
Ich möchte dies jedoch innerhalb der Backticks in meinem lokal ausgeführten csh-Skript tun können. Wird das möglich sein?
Ich weiß, dass es möglich ist, SSH in ein Skript auf der Fernbedienung einzubinden und auszuführen, aber das ist nicht mein Fall.
Ich habe auch gehört, dass es möglich ist, ein zweites lokal über SSH gespeichertes Skript zu senden (was ich auch nicht herausgefunden habe), aber ich mag die Idee, alle Befehle im ursprünglichen Skript zu haben, daher das HEREDOC.
Ich weiß, dass es eine ziemlich spezielle Frage ist, aber wenn es einen Weg gibt, wäre es sehr cool zu wissen, wie.
Dinge, die nicht funktionieren
1)
`ssh user@host<<'ENDSSH'`
`echo "ls -l"`
`echo "ENDSSH"`
Dies gibt den Fehler:
stty: standard input: Invalid argument.
stty: standard input: Invalid argument.
Warning: Command not found
Und dann wird es ls -l
lokal ausgeführt, und dann hat es versucht, ENDSSH
lokal ausgeführt zu werden, und schlägt natürlich fehl, wenn der Befehl nicht gefunden wurde.
2)
`ssh user@host<<'ENDSSH'`
echo "ls -l"
echo "ENDSSH"
Das gleiche Problem wie oben, außer es wird nur angezeigt , ls -l
und ENDSSH
als Text. Sinnvoll ... da der HEREDOC-Teil fehlgeschlagen ist.
3) 3-5 sind nicht genau das, wonach ich gefragt habe, aber ich versuche immer noch, auch nur den Grundfall zum Laufen zu bringen.
`ssh user@host ls-l`
Das kehrt zurück total: Command not found.
Ja, ich habe keine Ahnung, woher das kommt.
4)
`cat ./test.csh | ssh user@host`
Gibt auch das gleiche wie Versuch 1 zurück
5)
`cat ./test.csh | ssh -t user@host`
Gleich wie Nr. 1 und 4.
Ich fange an, andere Lösungen von Stackoverflow / Ubuntu / Serverfault ... usw. Zu erschöpfen. Die meisten Leute fragen, wie ihr Skript auf einer Fernbedienung über die Befehlszeile ausgeführt werden soll, nicht wie Befehle auf einer Fernbedienung über ein lokal ausgeführtes Skript ausgeführt werden sollen.
Bearbeiten
Nun, ich glaube, ich habe einen Teil des Problems herausgefunden. In Fall 3 von oben wird beispielsweise ls -l
lokal ausgeführt, und der erste Teil der Ausgabe wird dann als Befehl über SSH gesendet.
Ich habe das bemerkt, weil ich es versucht habe ssh user@host $CMD
, mit $CMD
eingestellt auf "whoami"
. Die Ausgabe war username: Command not found
, und dann wurde mir klar, dass die total
Ausgabe von ls stammt. Ich bin mir jedoch immer noch nicht sicher, wie ich das lösen soll
ssh user@host ls -l
, was wiederum ls -l
auf dem Remote-Host ausgeführt wird. Die resultierende Ausgabe wird von den Backticks erfasst und lokal ausgewertet. Da diese Ausgabe nicht erfasst werden kann, wird sie als lokaler Befehl ausgeführt.
ls -l
remote ausgeführt wird und die Ausgabe lokal im Gegensatz zu ls -l
lokal und die Ausgabe remote?