it-swarm.com.de

richtiger Weg nach Sudo über ssh

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

ssh [email protected] "Sudo script"

Wie kann ich das Kennwort für Sudo über SSH eingeben, ohne dass das Kennwort während der Eingabe angezeigt wird?

129
darkfeline

Eine andere Möglichkeit ist die Verwendung von -t zu ssh wechseln:

ssh -t [email protected] "Sudo script"

Sehen 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.
216
dave4420

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

echo pass | ssh -tt [email protected] "Sudo script"

Vorteile:

  • kein Passwort Prompt
  • das Passwort wird im Bash-Verlauf des Remote-Computers nicht angezeigt

In Bezug auf die Sicherheit: Wie Kurt sagte, wird beim Ausführen dieses Befehls Ihr Kennwort in Ihrem lokalen Bash-Verlauf angezeigt, und es ist besser, es zu speichern das Passwort in einer anderen Datei oder speichern Sie den Befehl all in einer .sh-Datei und führen Sie ihn aus. HINWEIS: Die Datei muss über die richtigen Berechtigungen verfügen, damit nur die zugelassenen Benutzer darauf zugreifen können.

10
ofirule

Angenommen, Sie möchten kein Passwort eingeben:

ssh $Host 'echo $PASSWORD | Sudo -S $COMMMAND'

Beispiel

ssh [email protected] 'echo secret | Sudo -S echo hi' # outputs 'hi'
4
Leathan

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

Sie können Sudo über ssh verwenden, ohne ssh dazu zu zwingen, eine Pseudotty zu haben (ohne die Verwendung des Schalters ssh "-t"), indem Sie Sudo anweisen, kein interaktives Passwort zu fordern und das Passwort einfach von stdin zu entfernen. Verwenden Sie dazu den "-S" -Schalter von Sudo. Dadurch wartet Sudo auf das Kennwort unter stdin und hört auf zu lauschen, wenn eine neue Zeile angezeigt wird.

Beispiel 1 - Simple Remote Command

In diesem Beispiel senden wir einen einfachen whoami -Befehl:

$ ssh [email protected] cat \| Sudo --Prompt="" -S -- whoami << EOF
> <remote_Sudo_password>
root

Wir weisen Sudo an, keine Eingabeaufforderung auszugeben und deren Eingabe von stdin zu übernehmen. Dies führt dazu, dass das Sudo-Passwort völlig unbemerkt weitergegeben wird. Die einzige Antwort, die Sie erhalten, ist die Ausgabe von whoami.

Diese Technik bietet den Vorteil, dass Sie Programme über Sudo über ssh ausführen können, die selbst eine Standardeingabe erfordern. Dies liegt daran, dass Sudo das Kennwort über die erste Zeile von stdin verbraucht und dann zulässt, dass das von ihm ausgeführte Programm weiterhin stdin abruft.

Beispiel 2 - Remote-Befehl, der seine eigene Standardeingabe benötigt

Im folgenden Beispiel wird der Remote-Befehl "cat" über Sudo ausgeführt, und es werden einige zusätzliche Zeilen über stdin bereitgestellt, damit die Remote-Katze angezeigt werden kann.

$ ssh [email protected] 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 wird von Sudo verbraucht, und die remote ausgeführte Katze zeigt dann die zusätzlichen Zeilen an.

Ein Beispiel dafür, wo dies nützlich wäre, 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 - Montage eines entfernten VeraCrypt-Containers

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

#!/bin/sh
ssh [email protected] 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 << EOF construct in der Befehlszeile bewirkt, dass alles, was eingegeben wurde, einschließlich des Kennworts, in der .bash_history des lokalen Computers aufgezeichnet wird. Es wird daher dringend empfohlen, dass Sie für den Einsatz in der Praxis entweder das Skript vollständig ausführen, wie im obigen Beispiel von veracrypt, oder das Kennwort in eine Datei eingeben und diese Datei über ssh umleiten.

Beispiel 1a - Beispiel 1 ohne lokales Befehlszeilenpasswort

Das erste Beispiel würde also lauten:

$ cat text_file_with_Sudo_password | ssh [email protected] cat \| Sudo --Prompt="" -S -- whoami
root

Beispiel 2a - Beispiel 2 ohne lokales Befehlszeilenpasswort

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

Wenn Sie das Ganze in ein Skript einfügen, ist es nicht erforderlich, das Kennwort in einer separaten Datei abzulegen, da der Inhalt von Skripts nicht in Ihrem Verlauf endet. Es kann dennoch nützlich sein, wenn Sie Benutzern erlauben möchten, die das Kennwort nicht sehen sollten, das Skript auszuführen.

2
Kurt Fitzner

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

0
Raphael Bossek

Der beste Weg ist ssh -t [email protected] "Sudo <scriptname>", beispielsweise ssh -t [email protected] "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 deine Zweifel ausgeräumt.

0
kashyap