Shell-Skript vom lokalen Computer, um den Befehl auf dem Remote-Computer auszuführen, und dann auf dem lokalen Computer fortzufahren

10

Das Problem ist folgendes: Ich möchte Dateien von einem Remotecomputer kopieren.

Ich suche nach einer Möglichkeit, ein Shell-Skript zu schreiben, das eine Verbindung zum Remote-Computer herstellt, den Speicherort der gespeicherten Datei abruft, sobald der Standort vom Remote-Server getrennt wird, und scp vom lokalen Computer mit dem erhaltenen Speicherort zu verwendet Kopieren Sie die Datei.

Insbesondere möchte ich wissen, wie ich über ein Skript eine Verbindung zu einem Remotecomputer herstellen und Aufgaben auf diesem Computer ausführen kann. Trennen Sie die Verbindung und setzen Sie die Ausführung lokal fort.

gnsr
quelle

Antworten:

15

Lösung 1:

remote_output="$(ssh user@host "remote command")"
scp "user@$host:$remote_output" /local/path

Dies funktioniert, indem Sie eine Verbindung zum Remote-Computer herstellen, einige Befehle ausführen und die Ausgabe in eine Variable auf Ihrem lokalen Computer kopieren. Sagen Sie, Sie geben den Dateipfad aus der Ferne wieder und erfassen ihn lokal.

Lösung 2:

ssh user@host "determine_path; cat filename" >local_filename

Dies funktioniert, indem die Datei direkt von der Fernbedienung gesucht und ausgegeben und lokal in eine Datei umgeleitet wird. Dies überspringt scp. Dies erfordert, dass die Schritte vor "cat" keine Ausgabe haben (die Sie mit &> / dev / null lösen können).

Mark Griffin
quelle
1
+1, um zu zeigen, wie das gesamte Problem mit einer Verbindung anstelle von separatem ssh + scp gelöst werden kann.
Peter Cordes
Alle Antworten sind hilfreich, aber dieser spricht mein Problem am spezifischsten an
gnsr
20

Sie können ein Skript im folgenden Format schreiben:

command1
command2
...
ssh user@machine command3
...
command4
command5

Sie müssen SSH-Schlüssel einrichten, um command3ausgeführt zu werden, ohne Sie zur Eingabe eines Kennworts aufzufordern.

Khaled
quelle
2
Es ist zu beachten, dass dies synchron erfolgt. Während ssh user@remote command3läuft, command4kann nicht starten
aaaaa sagt, Monica
3
@aaaaaa, es sei denn, Sie habenssh user@machine command3 &
Isaac
3
@Isaac ja, mein Punkt ist, dass entweder wünschenswertes Verhalten sein kann, aber es sollte eine bewusste Entscheidung sein
aaaaa sagt, Monica
2

Ich gehe davon aus, dass Sie bereits eine Vorstellung davon haben, wie Sie die Datei identifizieren, die Sie kopieren möchten, und dass Sie ein Skript oder eine Reihe von Befehlen schreiben können oder bereits geschrieben haben, die auf dem Remotecomputer ausgeführt werden, der diese Identifizierung vornimmt .

Außerdem gehe ich davon aus, dass diese Befehle in der Standardausgabe den vollständigen Pfad zur Datei oder den relativen Pfad zur Datei relativ zum Ausgangsverzeichnis des SSH-Benutzers drucken, der für die Kopie verwendet wird. In meinem Beispiel lautet der Name des Skripts "getfilepath.sh", obwohl es sich nicht um ein Shell-Skript handeln muss, sondern um eine andere ausführbare Datei oder sogar eine Reihe von Befehlen.

# Script to be executed on local machine.

# put any leading local commands here.

FILE=$(ssh user@emote getfilepath.sh);
scp user@remotehost:"$FILE" .

# put any trailing local commands here.

Im obigen Code ist die Notation "$ ()" eine Möglichkeit, die Standardausgabe eines Befehls als Shell-Variable zu erfassen. Es ist ziemlich normal, aber wenn Sie eine Shell verwenden, die es nicht versteht, können Sie den Befehl stattdessen mit "Back-Ticks" umgeben, die bei den meisten US-Tastaturen die Akzentzeichen links von der 1-Taste darstellen.

Jeremy Impson
quelle
0

Möglicherweise ist es möglich, eine geplante Aufgabe auf dem Remotecomputer auszulösen, die die gesamte Arbeit erledigt.

Dies würde verhindern, dass Sie mit dem Remotecomputer verbunden werden, während Sie den Speicherort der Dateien suchen, die Sie kopieren möchten.

Ich mache das:

Die Befehlszeile löst eine geplante Aufgabe aus, die in meinem Fall ein Batchskript ausführt.

schtasks /run /s remoteserver /u %user% /p %password% /tn "scheduledtaskname"

Freundliche Grüße

Denyo
quelle