1436 Stimmen

Wie kann man SSH verwenden, um ein lokales Shell-Skript auf einem entfernten Rechner auszuführen?

Ich muss ein lokales Shell-Skript (Windows/Linux) auf einem entfernten Rechner ausführen.

Ich habe SSH sowohl auf Rechner A als auch auf Rechner B konfiguriert. Mein Skript befindet sich auf Rechner A, der einen Teil meines Codes auf einem entfernten Rechner, Rechner B, ausführen wird.

Die lokalen und entfernten Computer können entweder Windows- oder Unix-basierte Systeme sein.

Gibt es eine Möglichkeit, dies mit plink/ssh zu tun?

7 Stimmen

Die gleiche Frage wurde bereits auf serverfault gestellt: serverfault.com/questions/215756/ Es hat also wahrscheinlich keinen Sinn, diese Frage zu migrieren.

9 Stimmen

Auf die Frage zu Server Fault gibt es allerdings nicht so viele Antworten. Vielleicht sollte diese Frage diese ersetzen.

5 Stimmen

Mir persönlich gefällt diese Antwort: unix.stackexchange.com/questions/87405/

2voto

Jinmiao Luo Punkte 137

Wenn Sie einen Befehl wie diesen ausführen wollen temp=`ls -a` echo $temp Befehl in `` wird Fehler verursachen.

Der folgende Befehl wird dieses Problem lösen ssh user@host ''' temp=`ls -a` echo $temp '''

1voto

Abhishek Punkte 533

Wenn es sich um ein Skript handelt, ist die obige Lösung in Ordnung.

Ich würde einrichten Ansible um den Job zu erledigen. Es funktioniert auf die gleiche Weise (Ansible verwendet ssh, um die Skripte auf dem entfernten Rechner sowohl unter Unix als auch unter Windows auszuführen).

Sie wird besser strukturiert und wartbar sein.

1voto

alpha_989 Punkte 4371

Die Antwort hier ( https://stackoverflow.com/a/2732991/4752883 ) funktioniert hervorragend, wenn Sie versuchen, ein Skript auf einem entfernten Linux-Rechner auszuführen, indem Sie plink o ssh . Es funktioniert, wenn das Skript mehrere Zeilen auf linux .

**Wenn Sie jedoch versuchen, ein Batch-Skript auszuführen, das sich auf einem lokalen linux/windows Rechner und Ihr entfernter Rechner ist Windows und es besteht aus aus mehreren Zeilen mit **

plink root@MachineB -m local_script.bat

wird nicht funktionieren.

Nur die erste Zeile des Skripts wird ausgeführt. Dies ist wahrscheinlich eine Einschränkung von plink .

Lösung 1:

Um ein mehrzeiliges Batch-Skript auszuführen (vor allem, wenn es relativ einfach ist, bestehend aus ein paar Zeilen):

Wenn Ihr ursprüngliches Batch-Skript folgendermaßen aussieht

cd C:\Users\ipython_user\Desktop 
python filename.py

können Sie die Zeilen mit dem Trennzeichen "&&" wie folgt in Ihrem local_script.bat Datei: https://stackoverflow.com/a/8055390/4752883 :

cd C:\Users\ipython_user\Desktop && python filename.py

Nach dieser Änderung können Sie dann das Skript ausführen, wie es hier von @JasonR.Coombs: https://stackoverflow.com/a/2732991/4752883 mit:

`plink root@MachineB -m local_script.bat`

Lösung 2:

Wenn Ihr Batch-Skript relativ kompliziert ist, ist es vielleicht besser, ein Batch-Skript zu verwenden Skript zu verwenden, das auch den Plink-Befehl kapselt, wie es hier von @Martin https://stackoverflow.com/a/32196999/4752883 :

rem Open tunnel in the background
start plink.exe -ssh [username]@[hostname] -L 3307:127.0.0.1:3306 -i "[SSH
key]" -N

rem Wait a second to let Plink establish the tunnel 
timeout /t 1

rem Run the task using the tunnel
"C:\Program Files\R\R-3.2.1\bin\x64\R.exe" CMD BATCH qidash.R

rem Kill the tunnel
taskkill /im plink.exe

1voto

Ole Tange Punkte 29091

Es ist unklar, ob das lokale Skript lokal gesetzte Variablen, Funktionen oder Aliase verwendet.

Wenn ja, sollte dies funktionieren:

myscript.sh:

#!/bin/bash

myalias $myvar
myfunction $myvar

Sie verwendet $myvar , myfunction y myalias . Gehen wir davon aus, dass sie lokal und nicht auf dem entfernten Rechner eingestellt sind.

Erstellen Sie eine Bash-Funktion, die das Skript enthält:

eval "myfun() { `cat myscript.sh`; }"

Variable, Funktion und Alias festlegen:

myvar=works
alias myalias='echo This alias'
myfunction() { echo This function "$@"; }

Und "exportieren" myfun , myfunction , myvar y myalias a server mit env_parallel von GNU Parallel:

env_parallel -S server -N0  --nonall myfun ::: dummy

-21voto

Baishampayan Ghose Punkte 18730

Kopieren Sie das Skript zunächst mit scp auf Maschine B

[user@machineA]$ scp /pfad/zu/script user@machineB:/home/user/path

Führen Sie dann einfach das Skript

[user@machineA]$ ssh user@machineB "/home/user/path/script"

Dies funktioniert, wenn Sie dem Skript die Berechtigung zur Ausführung erteilt haben.

0 Stimmen

Hallo, ich habe den empfohlenen Vorschlag angewandt, aber ich erhalte folgende Fehlermeldung [oracle@node1 ~]$ ssh oracle@node2:./home/oracle/au/fs/conn.sh ssh: node2:./home/oracle/au/fs/conn.sh: Name oder Dienst nicht bekannt [oracle@node1 ~]$

0 Stimmen

Ssh oracle@node2:./home/oracle/au/fs/conn.sh'? Falsche Befehlszeile, der Befehlsname sollte vom user@host-Teil durch ein Leerzeichen getrennt werden, nicht durch einen Doppelpunkt.

9 Stimmen

Ich stimme ab, weil die primäre Behauptung, dass es nicht ausgeführt werden kann, ohne es zu kopieren, nicht stimmt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X