Wie führe ich Änderungen auf dem Remote-Server als Root aus?

8

Ich frage mich, ob es eine Möglichkeit gibt, ein Skript / Befehle vom lokalen Computer auszuführen, ohne Änderungen als root auf dem Remotecomputer vorzunehmen.

Einige Hintergrundinformationen

Ich versuche, einige Aufgaben über Capistrano einzurichten, und benötige sudoZugriff. Es gibt mehr als 30 Server, und das manuelle Aktualisieren ist für mich /etc/sudoersschmerzhaft. Ich habe mich gefragt, ob es eine Methode gibt, um diese Datei remote zu aktualisieren.

kaizenCoder
quelle
Sie können Fabric mit Remote-Interaktion verwenden. Sie können dasselbe ohne parallele Interaktion mit der fabric.contrib.files.sedMethode tun .
lcipriani
Wenn Sie 30 Server haben, die Sie verwalten, empfehle ich SaltStack
Wayne Werner

Antworten:

18

Sie können lokale Skripte remote ausführen, indem Sie sie bashauf dem Remote-System ausführen und Ihrem Skript zuführen

$ ssh user@host 'bash -s' < script.sh

Bearbeiten

Um Befehle auszuführen, die die Verwendung sudoauf einem Remotecomputer erfordern, verwenden Sie die ssh's -tOption und übergeben Sie die Befehle an ssh. Die -tOption weist eine Pseudo-Nummer zu und ermöglicht die Benutzerinteraktion mit den von ausgeführten Befehlen ssh, z. B. der Eingabe eines Kennworts fürsudo

$ ssh user@host -t 'sudo foo'

Das Ändern einer Datei mit dieser Methode sedwird über eine Umleitung empfohlen, >da die Shell-Umleitung das Schreiben von Dateien bei Verwendung nicht zulässt sudo. Darüber hinaus müssen alle Variablen im sedBefehl maskiert werden, wenn sie an übergeben werden ssh.

$ ssh user@host -t 'sudo sed -i "\$a text to insert" /path/to/file'

So automatisieren Sie das Ganze:

#!/bin/bash
SERVERS=( server1 server2 server3 )

for HOST in ${SERVERS[@]}; do 
    ssh user@${HOST} -t 'sudo sed -i "\$a text to insert" /path/to/file'

    if [[ $? -ne 0 ]]; then
        echo "ERROR: $HOST did not complete"
     else   
        echo "$HOST complete"
    fi   
done
Bach
quelle
Vielen Dank für das Skript und alles, aber es beantwortet meine Frage nicht wirklich. Wenn ich die /etc/sudoersDatei aufgrund von Root-Berechtigungen ändern möchte, schlägt dies fehl.
KaizenCoder
@aspiringCodeArtisan siehe Änderungen an der Antwort
Creek
Hallo, auch das fordert zur Eingabe eines sudoPassworts auf, das nach /etc/sudoers
meinem
1
@aspiringCodeArtisan Wenn Ihr Konto keine sudoRechte auf diesen Computern hat, müssen Sie sich zum Ändern /etc/sudoersüber ssh as anmelden , um Änderungen vorzunehmen root. Der Befehl wäre alsossh root@host -t 'sed -i "\$a text to insert" /path/to/file'
Creek
Die Root-SSH-Anmeldung ist standardmäßig deaktiviert, daher ist dies keine Option. Ich glaube, ich frage nach dem Unmöglichen.
KaizenCoder
1

Ich fand den teeBefehl hilfreich, um die Sudo-Beschränkung bei der Dateiumleitung zu vermeiden. Die Verwendung von sed erwies sich aufgrund der Anforderungen an das Entkommen von Charakteren als frustrierend.

Dies ist der Befehl, mit dem ich die Hosts für alle Computer in meinem Cluster remote an / etc / hosts angehängt habe:

for i in {1..10}; do ssh [email protected].$i -t "echo '10.1.1.1 dev-1    
10.1.1.4 dev-4
10.1.1.3 dev-3
10.1.1.2 dev-2
10.1.1.6 dev-6
10.1.1.8 dev-8
10.1.1.5 dev-5
10.1.1.10 dev-10
10.1.1.9 dev-9
10.1.1.7 dev-7' | sudo tee -a /etc/hosts >/dev/null"

Die Ausgabe für jede Iteration sieht folgendermaßen aus:

0+1 records in
0+1 records out
255 bytes (255 B) copied, 4.1338e-05 s, 6.2 MB/s

Diese SU-Antwort war ausschlaggebend für die Erstellung meiner endgültigen Lösung: https://superuser.com/a/1026359/587485

Garren
quelle
1

Wenn Sie mehrere Befehle oder Weiterleitungen ausführen müssen, sollten Sie die folgende Syntax verwenden:

ssh server.com "sudo sh -c 'ps aux | grep jav > /root/1.txt'"
Flussfall
quelle
0

Sie müssen bereits über eine Art Root-Zugriff verfügen, entweder über das direkte Root-Passwort oder über die Einrichtung der Sudo-Regel für Ihre Benutzer-ID, bevor Sie versuchen, die Sudoers-Datei zu ändern.

jag4701
quelle