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?
ssh <user@server> sudo <script>
ich so etwas versuchte , da ich den Fehler bekamsudo: no tty present and no askpass program specified
Antworten:
Eine andere Möglichkeit besteht darin, den
-t
Schalter zu verwenden , umssh
:Siehe
man ssh
:quelle
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).-t
Methode zeigt auch die farbige Ausgabe von Befehlen an, die dies normalerweise tun.Ich konnte es mit dem folgenden Befehl vollständig automatisieren:
Vorteile:
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.
quelle
-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ührtread -s -p "Password: " pw
habeecho "$pw" | ....
. Ich habe dies jetzt in ein handliches Skript für mich selbst gerollt :).Angenommen, Sie möchten keine Passwortabfrage :
Beispiel
quelle
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: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 ist
whoami
.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.
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:
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:
Beispiel 2a - Beispiel 2 ohne lokales Befehlszeilenkennwort
und das zweite Beispiel würde werden:
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.
quelle
cat
die Ergebnisse ausführen und in sudo weiterleiten? Können Sie nursudo
den Hauptbefehl ssh remote verwenden?cat
wird 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 sehenps auxwww
.cat
Befehl sshcat \| sudo --prompt="" -S...
. Wenn die-S
Kräftesudo
, um das Passwort von stdin zu lesen, die Katze und die Pfeife überhaupt notwendig sind? Könnte der Befehl ssh einfach seinsudo --prompt="" -S...
?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.
quelle
NOPASS
In der Konfiguration auf Ihrem Zielcomputer ist die Lösung. Lesen Sie weiter unter http://maestric.com/doc/unix/ubuntu_sudo_without_passwordquelle
quelle
Ich hatte ein Problem,
Dann habe ich es mit versucht
hat nicht funktioniert
das hat richtig funktioniert!
quelle
Abhängig von Ihrer Verwendung hatte ich Erfolg mit Folgendem:
Dies fordert zur Eingabe des Root-Passworts auf und führt den Befehl dann korrekt aus.
quelle