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 whoami
Befehl:
$ 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 << EOF
Konstrukt 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.
ssh <user@server> sudo <script>
ich so etwas versuchte , da ich den Fehler bekamsudo: no tty present and no askpass program specified