it-swarm.com.de

Wie führe ich ein lokales Bash-Skript auf Remotecomputern über ssh aus?

Ich suche nach einer Möglichkeit, die Konfiguration von einem zentralen Computer auf mehrere Remotecomputer zu übertragen, ohne dass etwas auf den Remotecomputern installiert werden muss.

Das Ziel ist es, etwas zu tun, wie Sie es mit Tools wie cfengine finden würden, aber auf einer Reihe von Maschinen, auf denen keine Agenten eingerichtet sind. Dies könnte tatsächlich eine gute Technik zum Einrichten von cfagent auf einer Reihe vorhandener Remotecomputer sein.

51
tremoloqui

Sie können ein Skript übergeben und es vorübergehend ausführen lassen, indem Sie es einleiten und eine Shell ausführen.

z.B.

echo "ls -l; echo 'Hello World'" | ssh [email protected] /bin/bash

Natürlich ist die "ls -l; echo 'Hello World'" Teil könnte durch ein Bash-Skript ersetzt werden, das in einer Datei auf dem lokalen Computer gespeichert ist.

z.B.

cat script.sh | ssh [email protected] /bin/bash

Prost!

55
tremoloqui

Es gibt verschiedene Möglichkeiten, dies zu tun.

1:

ssh [email protected]_server 'bash -s' < localfile

2:

cat localfile  | ssh [email protected]_server

3:

ssh [email protected]_server "$(< localfile)"

nummer 3 ist meine bevorzugte Methode. Sie ermöglicht interaktive Befehle, z. su -S service nginx restart

(# 1 verwendet den Rest des Skripts als Eingabe für die Kennwortfrage, wenn Sie su -S Verwenden.)

21
Paul Verschoor

Ich würde Python's Fabric für diesen Zweck empfehlen:

#!/usr/bin/python
# ~/fabfile.py

from fabric_api import *

env.hosts = ['Host1', 'Host2']
def deploy_script():
    put('your_script.sh', 'your_script.sh', mode=0755)
    Sudo('./your_script.sh')

# from Shell
$ fab deploy_script

Sie sollten in der Lage sein, die oben genannten zu verwenden, um loszulegen. Wenden Sie sich an Fabric's ausgezeichnete Dokumentation , um den Rest zu erledigen. Als Ergänzung ist es durchaus möglich, Ihr Skript vollständig in Fabric zu schreiben - es ist kein Kopieren erforderlich. Es sollte jedoch beachtet werden, dass Sie zum Ändern des Skripts auf allen Computern nur die lokale Kopie bearbeiten und erneut bereitstellen müssen. Darüber hinaus können Sie mit etwas mehr als der grundlegenden Verwendung der API das Skript basierend auf dem Host, auf dem es derzeit ausgeführt wird, und/oder anderen Variablen ändern. Es ist eine Art pythonische Erwartung.

13
Sam Halicke

Genau dafür wird Ansible verwendet. Es gibt keinen Agenten, Sie müssen nur eine Textdatei mit dem Namen erstellen:

/etc/ansible/hosts

mit Inhalten, die ungefähr so ​​aussehen:

[webhosts]
web[1-8]

Dies würde angeben, dass sich die Maschinen "web1, web2 ... web8" in der Gruppe "webhosts" befinden. Dann können Sie Dinge tun wie:

ansible webhosts -m service -a "name=Apache2 state=restarted" --Sudo

um den Apache2-Dienst auf allen Ihren Computern mit Sudo neu zu starten.

Sie können im laufenden Betrieb Befehle ausführen wie:

ansible webhosts -m Shell -a "df -h"

oder Sie können ein lokales Skript auf dem Remotecomputer ausführen:

ansible webhosts -m script -a "./script.sh"

sie können auch ein Playbook mit einer vollständigen Konfiguration erstellen (Details finden Sie in der Dokumentation), an die Ihre Server angepasst werden sollen, und Folgendes bereitstellen:

ansible-playbook webplaybook.yml

Grundsätzlich können Sie es als Befehlszeilentool zum Ausführen von Befehlen auf mehreren Servern verwenden und seine Verwendung nach Belieben zu einem vollständigen Konfigurationstool erweitern.

5
seumasmac

Wie in diese Antwort erklärt, können Sie heredoc verwenden:

ssh [email protected] <<'ENDSSH'
#commands to run on remote Host
ENDSSH

Sie müssen mit heredoc vorsichtig sein, da es nur Text sendet, aber nicht wirklich auf die Antwort wartet. Das heißt, es wird nicht darauf warten, dass Ihre Befehle ausgeführt werden.

3
BЈовић

Die Antwort hier ( https://stackoverflow.com/a/2732991/475288 ) funktioniert hervorragend, wenn Sie versuchen, ein Skript auf einem Remote-Linux-Computer mit plink oder ssh. Es funktioniert, wenn das Skript mehrere Zeilen in linux enthält.

** Wenn Sie jedoch versuchen, ein Batch-Skript auf einem lokalen linux/windows - Computer auszuführen, und Ihr Remote-Computer Windows ist und aus mehreren Zeilen besteht, die ** verwenden

plink [email protected] -m local_script.bat

es wird nicht funktionieren.

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

Lösung 1:

So führen Sie ein mehrzeiliges Batch-Skript aus (insbesondere wenn es relativ einfach ist und aus wenigen Zeilen besteht):

Wenn Ihr ursprüngliches Batch-Skript wie folgt lautet

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

sie können die Zeilen mit dem Trennzeichen "&&" wie folgt in Ihrer local_script.bat - Datei wie folgt kombinieren https://stackoverflow.com/a/8055390/475288 :

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

Nach dieser Änderung können Sie das Skript wie hier von @ JasonR.Coombs ausgeführt ausführen: https://stackoverflow.com/a/2732991/475288

Lösung 2:

Wenn Ihr Batch-Skript relativ kompliziert ist, ist es möglicherweise besser, ein Batch-Skript zu verwenden, das den Befehl plink sowie die folgenden Punkte kapselt, wie hier von @Martin https://stackoverflow.com/a/32196999/4752883) ausgeführt :

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
1
alpha_989

Schreiben Sie das Skript so um, dass jedem darin enthaltenen Befehl bereits is mit dem Präfix ssh vorangestellt wird und ein Hostname/eine IP-Adresse oder eine Liste davon als Argument an das Skript übergeben wird (vorausgesetzt, Sie haben einen kennwortlosen/ssh-Agentenschlüssel Authentifizierung eingerichtet). Möglicherweise sind einige Arbeiten erforderlich, um Fehler-/Rückkehrcodes korrekt von den Remote-Befehlen zurückzugeben.

0
rackandboneman

Warum nicht einfach zuerst das Skript kopieren und dann ausführen?

scp your_script.sh the_server:
ssh the_server "chmod +x your_script.sh; ./your_script.sh"

Natürlich sollten Sie darauf achten, dass Sie es nicht an einen weltweit beschreibbaren Ort hochladen, damit niemand anderes damit herumspielen kann, bevor Sie es ausführen (möglicherweise als Root).

0
Dave Vogt

Wenn das Skript nicht zu groß ist und Sie bash oder ksh verwenden ...

ssh vm24 -t bash -c "$(printf "%q" "$(< Shell-test.sh )")"

Sowohl stdin als auch stdout funktionieren korrekt, aber das Skript ist auf die Argumentgröße beschränkt (normalerweise ca. 100 KB). Argumente für das Skript funktionieren möglicherweise am Ende der Zeile und folgen möglicherweise einem zusätzlichen "-" - Argument. Das "-t" zum Zuweisen einer Pty ist optional.

Achtung: Dies verwirrt die Bash-Vervollständigung. Drücken Sie nicht die Tabulatortaste.

0
user3710044