SSH: Führen Sie den Befehl sudo aus

44

Ich habe ein interaktives Shell-Skript, das an einer Stelle auf eine andere Maschine (Ubuntu-basiert) ssh und etwas als root ausführen muss (der Benutzer sollte sein Passwort eingeben, aber der Remote-Befehl sollte wie im Skript angegeben ausgeführt werden):

# ...
ssh remote-machine 'sudo ls'
# ...

Ich erhalte jedoch immer diese Fehlermeldung zurück:

sudo: no tty present and no askpass program specified

OK, das ist ganz klar. Aber wie kann ich das umgehen? So etwas sollte passieren:

$ ssh remote-machine 'sudo ls /'
[sudo] password for user1:

/bin
/etc
/var
Boldewyn
quelle

Antworten:

52

Das Wundersame sshhat ein Heilmittel für alles. Der Punkt ist, das -tFlag hinzuzufügen , um ssh zu zwingen, eine Pseudotty zuzuweisen:

ssh -t remote-server 'sudo ls'
Boldewyn
quelle
1
PTYs können jedoch Probleme mit Skripten verursachen. lsDie Ausgabe enthält zum Beispiel \ r \ n Endungen.
Tobu
1
Der einfache Weg, dies zu umgehen, besteht darin, ls in den Nicht-Terminal-Modus zu zwingen. ls | catwird es tun - es wird sehen, dass stdout eine Pipe ist. Bei dieser speziellen Frage ist dies nicht relevant, da sie anscheinend von einem Terminal aus interaktiv ausgeführt werden soll. Sie möchten also wahrscheinlich die Spalten und Farben und so weiter.
Gabe
0

Diese Methode führt ein einzelnes Skript mit sudo nach ssh aus:

Nehmen wir an, wir haben einen "entfernten" Benutzer mit Sudo-Fähigkeiten und ein Skript, das als root ausgeführt werden soll.

1) Legen Sie in / etc / passwd ein Skript fest , das beim Anmelden verwendet werden soll:

remote:x:1100:1100:Some Remote User,,,:/home/remote:/home/remote/login.sh

2) In "login.sh" führen wir das Skript aus, das wir als "sudo" ausführen möchten:

#!/bin/bash
if [ "$(id -u)" != "0" ]; then
    #Not running as root, so we execute "sudo"
    sudo /usr/local/bin/script.sh
else
    #We are already rooted, so "sudo" is not required.
    /usr/local/bin/script.sh
fi
exit;

Normalerweise wird das Passwort zweimal abgefragt: ssh login + sudo. Wenn Sie es nur einmal eingeben möchten, versuchen Sie sudo ohne Passwort (nicht empfohlen). <- Bitte lesen Sie Boldewyn Kommentar.

Der Hauptvorteil ist, dass "ssh" keinen anderen Parameter (als -t) benötigt und sudo auf der Serverseite erzwungen wird. Sobald das Skript beendet ist, wird der Benutzer ebenfalls abgemeldet.

Es mag nicht so elegant sein, aber es ist einfach und funktioniert.

Lepe
quelle
Oh oh. Das Einfügen Ihres Remote-Benutzers in die sudoersDatei auf einem Server wie diesem ist eine Katastrophe, die darauf wartet, passiert zu werden. Wenn jemand als Benutzer Zugriff erhält (z. B. über den Webserver), kann er sofort root werden. Vielen Dank, aber ich habe nach Lösungen gesucht, die meine Serverkonfiguration nicht in Konflikt bringen. Wenn Sie eine Lösung hätten, die die Authentifizierung von SSH auf magische Weise für den sudoBefehl wiederverwendet , wäre ich mehr interessiert (und würde möglicherweise nach Ersatz für SSH suchen ...).
Boldewyn
@Boldewyn: Ja, das Setzen von "sudo ohne Passwort" birgt dieses Sicherheitsrisiko ... es ist ein optionaler Schritt. Ich stimme Ihnen zu, wenn SSH die Authentifizierung wiederverwenden könnte, wären solche "Lösungen" nicht erforderlich. Vielen Dank für Ihren Kommentar.
Lepe
-1

Sie können den folgenden Befehl ausführen, um Root-Zugriff ohne Interaktivität zu erhalten:

ssh server " sudo command" < sudopassword.txt
SilentGuy
quelle
1
Das funktioniert nicht, weil stdin kein Endgerät ist (es liest aus der angegebenen Datei).
Anthony G - Gerechtigkeit für Monica