richtiger weg zu sudo über ssh

150

Ich habe ein Skript, das ein anderes Skript über SSH auf einem Remote-Server mit sudo ausführt. Wenn ich das Passwort eingebe, wird es jedoch auf dem Terminal angezeigt. (Sonst funktioniert es gut)

ssh user@server "sudo script"

Was ist der richtige Weg, um das Passwort für sudo über SSH einzugeben, ohne dass das Passwort während der Eingabe angezeigt wird?

Darkfeline
quelle
2
Was mich betrifft, war der Grund, nach einer Möglichkeit zu suchen, durch ssh zu sudoen, dass es nicht funktionierte, wenn ssh <user@server> sudo <script>ich so etwas versuchte , da ich den Fehler bekamsudo: no tty present and no askpass program specified
knocte

Antworten:

244

Eine andere Möglichkeit besteht darin, den -tSchalter zu verwenden , um ssh:

ssh -t user@server "sudo script"

Siehe man ssh:

 -t      Force pseudo-tty allocation.  This can be used to execute arbi-
         trary screen-based programs on a remote machine, which can be
         very useful, e.g., when implementing menu services.  Multiple -t
         options force tty allocation, even if ssh has no local tty.
dave4420
quelle
2
Schön, ich wusste von der Option -t, wusste nur nicht, dass sie für Sudo-Eingabeaufforderungen funktioniert.
3
Wofür ist die Option -t?
Vince
@Vince siehe go2linux.garron.me/linux/2010/11/…
Givemesnacks
3
Hier funktioniert es nicht: ssh -t localhost <<< "sudo touch file;"BEARBEITEN Anscheinend ist es wichtig, dass Sie den Befehl tatsächlich als Parameter angeben, nicht über Standard in (was im Nachhinein Sinn macht).
Begrenzte Versöhnung
Die -tMethode zeigt auch die farbige Ausgabe von Befehlen an, die dies normalerweise tun.
Karmakaze
23

Ich konnte es mit dem folgenden Befehl vollständig automatisieren:

echo pass | ssh -tt user@server "sudo script"

Vorteile:

  • Keine Passwortabfrage
  • Das Kennwort wird im Bash-Verlauf des Remotecomputers nicht angezeigt

In Bezug auf die Sicherheit: Wie Kurt sagte, zeigt das Ausführen dieses Befehls Ihr Passwort in Ihrem lokalen Bash-Verlauf an. Es ist besser, das Passwort in einer anderen Datei zu speichern oder den Befehl all in einer .sh-Datei zu speichern und auszuführen. HINWEIS: Die Datei muss über die richtigen Berechtigungen verfügen, damit nur die zulässigen Benutzer darauf zugreifen können.

ofirule
quelle
6
Es wird im Bash-Verlauf des lokalen Systems einschließlich des Kennworts angezeigt. Besser das Passwort in einer Datei speichern und die Datei cat.
Kurt Fitzner
4
Mann, ich wusste davon -t, aber ich hatte das Handbuch nicht sorgfältig genug gelesen, um zu sehen, dass man es zweimal bestehen konnte! Das ist es, wonach ich seit Monaten gesucht habe ! Als Sicherheitszusatz habe ich einfach eine Kennwortvariable festgelegt, bevor ich mit ausgeführt read -s -p "Password: " pwhabe echo "$pw" | ..... Ich habe dies jetzt in ein handliches Skript für mich selbst gerollt :).
Kael
Hat wie ein Zauber für mich funktioniert!
MiKr13
Warum richten Sie nicht einfach passwortloses sudo für bestimmte Benutzer und Befehle ein, die Sie ausführen müssen? Dies ist kein SSH-Problem ...
Nomen
@nomen Ihre Lösung ist ebenfalls gültig, erfordert jedoch zusätzliche Schritte. Wenn ich viele Geräte ohne einen kennwortlosen sudo-Benutzer habe, kann ich mit dieser Lösung ein Automatisierungsskript erstellen. Manchmal arbeiten Sie an einem System, das Sie nicht besitzen und das Sie nicht ändern möchten oder können, manchmal gibt es andere Überlegungen.
ofirule
6

Angenommen, Sie möchten keine Passwortabfrage :

ssh $HOST 'echo $PASSWORD | sudo -S $COMMMAND'

Beispiel

ssh me@localhost 'echo secret | sudo -S echo hi' # outputs 'hi'
Leathan
quelle
13
Dies ist / sehr / gefährlich, da das Klartext-Passwort in der Befehlszeile landet. Befehlszeilen sind öffentlich und können von jedem anderen Benutzer und Prozess auf dem System gesehen werden. Beispielsweise zeigt "ps auxwwwww" eines nicht privilegierten Benutzers jeden ausgeführten Prozess und die Befehlszeilen an, in denen er ausgeführt wurde.
Kurt Fitzner
3
Ganz zu schweigen davon, dass Sie Ihr Passwort (im Klartext) in die Datei bash_history einfügen.
Layne Bernardo
4

Sudo über SSH übergibt ein Passwort, keine tty erforderlich:

Sie können sudo über ssh verwenden, ohne ssh zu einer Pseudo-tty zu zwingen (ohne die Verwendung des ssh "-t" -Schalters), indem Sie sudo anweisen, kein interaktives Passwort zu benötigen und das Passwort einfach von stdin abzurufen. Verwenden Sie dazu den Schalter "-S" am sudo. Dadurch wartet sudo auf stdin auf das Passwort und hört auf zu hören, wenn eine neue Zeile angezeigt wird.

Beispiel 1 - Einfacher Fernbefehl

In diesem Beispiel senden wir einen einfachen whoamiBefehl:

$ ssh user@server cat \| sudo --prompt="" -S -- whoami << EOF
> <remote_sudo_password>
root

Wir sagen sudo, dass es keine Eingabeaufforderung ausgeben und die Eingabe von stdin übernehmen soll. Dadurch wird das sudo-Passwort vollständig stummgeschaltet, sodass die einzige Antwort, die Sie zurückerhalten, die Ausgabe von istwhoami .

Diese Technik bietet den Vorteil, dass Sie Programme über sudo over ssh ausführen können, für die selbst eine Standardeingabe erforderlich ist. Dies liegt daran, dass sudo das Passwort über die erste Zeile von stdin verbraucht und dann das Programm, das es ausführt, weiterhin stdin abruft.

Beispiel 2 - Remote-Befehl, für den ein eigener Standard erforderlich ist

Im folgenden Beispiel wird der Remote-Befehl "cat" über sudo ausgeführt, und wir stellen über stdin einige zusätzliche Zeilen zur Verfügung, die die Remote-Katze anzeigen kann.

$ ssh user@server cat \| sudo --prompt="" -S -- "cat" << EOF
> <remote_sudo_password>
> Extra line1
> Extra line2
> EOF
Extra line1
Extra line2

Die Ausgabe zeigt, dass die <remote_sudo_password> Zeile von sudo verwendet wird und dass die remote ausgeführte Katze dann die zusätzlichen Zeilen anzeigt.

Ein Beispiel dafür, wo dies von Vorteil ist, ist, wenn Sie ssh verwenden möchten, um ein Kennwort an einen privilegierten Befehl zu übergeben, ohne die Befehlszeile zu verwenden. Angenommen, Sie möchten einen remote verschlüsselten Container über ssh bereitstellen.

Beispiel 3 - Mounten eines Remote-VeraCrypt-Containers

In diesem Beispielskript mounten wir einen VeraCrypt-Container remote über sudo, ohne zusätzlichen Aufforderungstext:

#!/bin/sh
ssh user@server cat \| sudo --prompt="" -S -- "veracrypt --non-interactive --stdin --keyfiles=/path/to/test.key /path/to/test.img /mnt/mountpoint" << EOF
SudoPassword
VeraCryptContainerPassword
EOF

Es ist zu beachten, dass in allen obigen Befehlszeilenbeispielen (alles außer dem Skript) das << EOFKonstrukt in der Befehlszeile bewirkt, dass alles, was eingegeben wird, einschließlich des Kennworts, lokal aufgezeichnet wird .bash_history Computers aufgezeichnet wird. Es wird daher dringend empfohlen, dass Sie es für die Verwendung in der Praxis entweder vollständig über ein Skript wie das obige Veracrypt-Beispiel verwenden oder, wenn Sie sich in der Befehlszeile befinden, das Kennwort in eine Datei einfügen und diese Datei über ssh umleiten.

Beispiel 1a - Beispiel 1 ohne lokales Befehlszeilenkennwort

Das erste Beispiel würde also werden:

$ cat text_file_with_sudo_password | ssh user@server cat \| sudo --prompt="" -S -- whoami
root

Beispiel 2a - Beispiel 2 ohne lokales Befehlszeilenkennwort

und das zweite Beispiel würde werden:

$ cat text_file_with_sudo_password - << EOF | ssh va1der.net cat \| sudo --prompt="" -S -- cat
> Extra line1
> Extra line2
> EOF
Extra line1
Extra line2

Das Einfügen des Kennworts in eine separate Datei ist nicht erforderlich, wenn Sie das Ganze in ein Skript einfügen, da der Inhalt von Skripten nicht in Ihrem Verlauf landet. Es kann jedoch dennoch nützlich sein, wenn Sie Benutzern, die das Kennwort nicht sehen sollten, erlauben möchten, das Skript auszuführen.

Kurt Fitzner
quelle
Warum müssen Sie im Befehl ssh remote catdie Ergebnisse ausführen und in sudo weiterleiten? Können Sie nur sudoden Hauptbefehl ssh remote verwenden?
Joanpau
@joanpau Die Initiale catwird verwendet, um das Passwort des Benutzers an sudo auf der anderen Seite weiterzuleiten . Wenn der Benutzer sudo ohne Kennwort ausführen kann, ist dies nicht erforderlich, ich empfehle diese Konfiguration jedoch nicht. Der Grund für die Weiterleitung besteht darin, zu verhindern, dass das Kennwort in der Befehlszeile des Remote-Systems angezeigt wird. Befehlszeilen sind nicht sicher, jeder Benutzer kann jede Befehlszeile mit sehen ps auxwww.
Kurt Fitzner
Ich frage nach dem catBefehl ssh cat \| sudo --prompt="" -S.... Wenn die -SKräfte sudo, um das Passwort von stdin zu lesen, die Katze und die Pfeife überhaupt notwendig sind? Könnte der Befehl ssh einfach sein sudo --prompt="" -S...?
Joanpau
@jonpau Dieser Befehl cat nimmt stdin und leitet es durch sudo, um ihm das sudo-Passwort zu übergeben. Es zeigt, wie Sie das sudo-Passwort sicher über stdin durch ssh leiten können.
Kurt Fitzner
1

Der beste Weg ist ssh -t user@server "sudo <scriptname>"zum Beispielssh -t user@server "sudo reboot" . Es wird zuerst nach dem Kennwort für den Benutzer und dann nach root gefragt (da wir das Skript oder den Befehl mit Root-Rechten ausführen.

Ich hoffe, es hat geholfen und Ihren Zweifel ausgeräumt.

kashyap
quelle
0

NOPASSIn der Konfiguration auf Ihrem Zielcomputer ist die Lösung. Lesen Sie weiter unter http://maestric.com/doc/unix/ubuntu_sudo_without_password

Raphael Bossek
quelle
6
In diesem Fall möchte ich tatsächlich ein Passwort und muss es direkt eingeben, sodass dies für mich nicht funktioniert.
Darkfeline
0
echo $VAR_REMOTEROOTPASS | ssh -tt -i $PATH_TO_KEY/id_mykey $VAR_REMOTEUSER@$varRemoteHost 
echo \"$varCommand\" | sudo bash
Carlos Vladimir Ynoquio Herrer
quelle
2
... und bitte geben Sie eine Erklärung für Ihren Code.
pppery
-1

Ich hatte ein Problem,

user1@server1$ ssh -q user1@server2 sudo -u user2 rm -f /some/file/location.txt

Output:
sudo: no tty present and no askpass program specified

Dann habe ich es mit versucht

#1
vim /etc/sudoers
Defaults:user1    !requiretty

hat nicht funktioniert

#2
user1   ALL=(user2)         NOPASSWD: ALL

das hat richtig funktioniert!

Asef Amin
quelle
Dies erreicht nicht wirklich das, was gefragt wird. Die Idee ist, das Passwort weiterhin zu benötigen, es aber über ssh eingeben zu lassen. Was Sie getan haben, ist nur, Benutzer1 vollen Sudo-Zugriff auf Benutzer2 ohne Passwort zu gewähren. Dies ist für bestimmte Anwendungen in Ordnung, aber nicht die beste Idee als allgemeine Lösung.
Possum
-7

Abhängig von Ihrer Verwendung hatte ich Erfolg mit Folgendem:

ssh root@server "script"

Dies fordert zur Eingabe des Root-Passworts auf und führt den Befehl dann korrekt aus.

Essstifte
quelle
24
Huch, SSH als Wurzel? Das ist aus allen möglichen Gründen eine schlechte Idee.
Darkfeline
11
Denken Sie daran, ssh ist kein Telnet. Es ist nicht gefährlicher, ssh als root zu verwenden, als ssh als anderer Benutzer und sudo auszuführen. Ihr Passwort wird auf die gleiche Weise über die SSH-Verbindung verschlüsselt.
Stéphane
21
Stéphane ist in Bezug auf die Passwortsicherheit absolut korrekt. Wenn Sie jedoch root anstelle von sudo verwenden, verlieren Sie den mit sudo verbundenen Audit-Trail. Darüber hinaus ist der Root-Zugriff möglicherweise nicht verfügbar.
Djeikyb