Sicheres Übergeben des Root-Passworts in einem Shell-Skript

Sicheres Übergeben des Root-Passworts in einem Shell-Skript

Ich starte meinen GNU/Linux-Laptop immer im Konsolenmodus. Aber manchmal muss ich den GUI-Modus aufrufen. Dazu muss ich immer das Root-Passwort eingeben. Also habe ich das folgende Skript „gogui.sh“ geschrieben und eingefügt /usr/bin:

#!/bin/bash
echo "mypassword" | sudo service lightdm start

Das ist eine wirklich dumme Idee, denn wenn jemand die Datei liest, kann er problemlos mein Passwort sehen.

Gibt es dazu eine Alternative?

Antwort1

Es ist völlig sinnlos, in einem Skript ein Passwort an sudo zu übergeben. Fügen Sie stattdessen eine sudo-Regel hinzuNOPASSWDFügen Sie den bestimmten Befehl hinzu, den Sie mit dem Tag ausführen möchten. Achten Sie darauf, dass die befehlsspezifische NOPASSWDRegel nach jeder allgemeinen Regel stehen muss.

saeid ALL = (ALL:ALL) ALL
saeid ALL = (root) NOPASSWD: service lightdm start

Aber das ist wahrscheinlich sowieso nicht nützlich. lightdm startstartet eine Anmeldeaufforderung, aber Sie brauchen das nur, wenn Sie anderen Benutzern die grafische Anmeldung ermöglichen möchten. Sie brauchen es nicht, wenn Sie nur eine GUI-Sitzung starten möchten. Rufen Sie stattdessen aufstartxum eine GUI-Sitzung aus Ihrer Textmodus-Sitzung zu starten. Dies erfordert keine zusätzlichen Berechtigungen.

Möglicherweise müssen Sie Ihren Fenstermanager oder Ihre Desktopumgebung explizit angeben, da startxmöglicherweise nicht derselbe Standard-Sitzungstyp ausgewählt wird, den Lightdm verwendet.

startx -- gnome-session

Antwort2

Es gibt einige Optionen und eine davon besteht darin, den spezifischen Befehl visudomit dem Flag NOPASSWD hinzuzufügen:

%wheel ALL=(ALL) NOPASSWD: /path/to/myscript

cat /path/to/myscript
#!/bin/bash
service lightdm start

Antwort3

BEARBEITEN
Ich habe gerade bemerkt, dass Sie in Ihren Kommentaren Unity erwähnen, also scheint es, als würden Sie Ubuntu verwenden. Meine ursprüngliche Antwort war ausgerichtet aufSysVinitSysteme, aber Befehle wietelinitsind weiterhin vorhanden und funktionieren auf Distributionen mitSystemdoderEmporkömmling.

SysV-Weg

    telinit 5

Auf modernen Systemd-Systementelinitwird weitergeleitet zusystemctl.

Systemd-Weg

    systemctl isolate runlevel5.target

oder

    systemctl isolate graphical.target

Ursprüngliche Antwort:
Bei älteren Nicht-Systemd-Distributionen (z. B. RHEL/CentOS 6 und älter) ist der einfachste Weg, vom Konsolenmodus zur GUI zu wechseln, die Verwendung destelinitBefehl. Bei den RHEL/Centos-Distributionen wird beispielsweise der textbasierte Mehrbenutzermodus auf Level 3 und der Mehrbenutzer-GUI-Modus auf Level 5 ausgeführt. Der Wechsel vom Konsolen- in den GUI-Modus erfolgt folgendermaßen: Standardmäßig sind telinitRoot-Berechtigungen erforderlich. Um dies als normaler Benutzer ohne Kennwort auszuführen, benötigen Sie einen sudoersEintrag oder setzen das Setuid-Flag in der ausführbaren Datei Telinit. Diese sudoMethode ist der bevorzugte Ansatz, da sie auf Ihr Konto beschränkt werden kann.

Antwort4

Da Sie sich speziell auf beziehen sudo, bleiben Sie beiGilles' Antwort. Da es in Ihrem Fragentitel jedoch lediglich darum ging, ein Passwort für ein Programm zu erhalten, stdinund ich vor kurzem eine ähnliche Situation hatte:

echo $(read -sp "Password: " password; echo $password) | yourcommand

Wahrscheinlich werde ich dafür einiges an Kritik ernten, aber es hat funktioniert.

Apropos bash, dort können Sie wahrscheinlich auch verwenden

yourcommand <$(read -sp "Password: " password; echo $password)

verwandte Informationen