Wie kann ich einen Befehl in einem Skript ausführen, ohne nach einem Kennwort gefragt zu werden?

107

Ich möchte mein System jeden Tag automatisch einschalten. Also benutze ich den folgenden Code in meinem Python-Skript, sudofrage mich aber jedes Mal nach einem Passwort:

os.system('sudo sh -c "echo date \'+%s\' -d \'+ \
       24 hours\' > /sys/class/rtc/rtc0/wakealarm"')

Wie kann ich dieses Skript ausführen, ohne sudojedes Mal nach dem Kennwort zu fragen?

Viswa
quelle
4
Sie sollten in Ihrem Motherboard-Handbuch oder BIOS nachsehen, ob es dieses Verhalten unterstützt. Ich weiß, es weicht der Frage aus! =] Aber es kann eine ausreichende Lösung sein.
Alex Hirzel

Antworten:

149

Bitte beachten Sie: Jede Methode, bei der Sie Ihr Anmeldekennwort im Klartext, in einem Befehl oder in einer Datei eingeben, ist unsicher und sollte NICHT verwendet werden!

Richtige Vorgehensweise zum Einrichten sudo, sodass nur der eine bestimmte Befehl ausgeführt werden echo date... > rtc...darf, den Sie benötigen, dh OHNE dass Sie das Kennwort benötigen.

Schritt 1. Erstellen Sie mit diesem Befehl ein Shell-Skript

  • Öffnen Sie gedit(oder Ihren Lieblingseditor) und erstellen Sie das Skript, zpydatertc.sh
  • Fügen Sie nur diese Zeile ein und speichern Sie sie zB in Ihrem Home-Verzeichnis:
    Echodatum \ '+% s \' -d \ '+ 24 Stunden \'> / sys / class / rtc / rtc0 / wakealarm
  • Beenden Sie den Editor und machen Sie das Skript vom Terminal aus ausführbar und ändern Sie seinen Besitz in root . Andernfalls könnte ein anderer Benutzer mit Zugriff auf Ihr System es möglicherweise bearbeiten und die von ihm gewünschten Befehle als root ausführen, ohne dass Sie Ihr Kennwort benötigen:
    sudo chown root:root /home/username/pydatertc.sh
    sudo chmod 700 /home/username/pydatertc.sh
    

Schritt 2. Richten Sie sudo so ein, dass pydatertc.shes ausgeführt werden kann, ohne dass ein Kennwort erforderlich ist

  • Geben Sie sudo visudoam Terminal ein, um die sudoersDatei sudo permissions ( ) zu öffnen
  • Um die Linie 25 sehen Sie diese Linie: %sudo ALL=(ALL:ALL) ALL
  • Fügen Sie unterhalb dieser Zeile die folgende Zeile ein, in der usernamesich Ihr Benutzername befindet:
    Benutzername ALL = (ALL) NOPASSWD: /home/username/pydatertc.sh
  • Verlasse den Editor ( Ctrl+ Xwenn nano )

Schritt 3. Ändern Sie das aufzurufende Python-Skript pydatertc.sh

  • Ändern Sie die Zeile in:
    os.system ('sudo /home/username/pydatertc.sh')

Jetzt sollte Ihr Skript ohne Kennwort ausgeführt werden UND ohne die Sicherheit Ihres Kontos, Ihrer Daten oder Ihres Systems zu gefährden!


Alternative nur für wakealarm(nicht für den allgemeinen Gebrauch!):

Da die Datei nur in diesem speziellen Fall den /sys/class/rtc/rtc0/wakealarmWeckalarm für das System steuert und ansonsten harmlos ist, besteht eine andere Alternative zur Vermeidung des Kennworts darin, den Besitz dieser Datei zu übernehmen chown(wenn Sie der einzige Benutzer sind, der den Alarm einstellt). oder mache es mit weltschreibbar chmod +666; Entfernen sudoSie in diesem Fall einfach die aus Ihrem Python-Anruf, und lassen Sie sie sh -c "...."intakt.

ish
quelle
1
Genial, das ist der richtige Weg.
Roadmr
1
So eine ausführliche, hilfreiche Antwort und genau, wie es gemacht werden sollte.
ArtOfCode
@RobertRosati, vielen Dank für deine Änderungsvorschläge - das hätte ich gar nicht vergessen sollen!
ish
1
@ m-ric Hast du den Befehl über diesen Zeilen gelesen? „sonst ein anderer Benutzer mit Zugriff auf Ihr System könnte es möglicherweise bearbeiten und ausführen , was Befehle sie als root wollen , ohne Ihr Passwort zu benötigen“
Tobias Kienzler
2
Mir ist klar, dass diese Antwort alt ist - aber hier gibt es immer noch ein Problem: Wenn sich die Datei in / home / username befindet , kann das System kompromittiert werden, wenn dieses Verzeichnis von einem böswilligen Benutzer (oder einem Nicht-Root-Login) beschrieben werden kann kompromittiert) . Sie könnten die Datei entfernen oder umbenennen, ein anderes Skript an seine Stelle setzen und dieses Skript über ausführen sudo- ohne ein Kennwort. Daher ist es weitaus sicherer , das Skript in ein Verzeichnis zu verschieben, das nur von root geändert werden kann, z. B. / usr / sbin oder / root . Ansonsten ist es LGTM.
NVRAM
30

Warnung!

Das Eingeben Ihres Anmeldekennworts in Klartext, in einen Befehl oder eine Datei ist äußerst unsicher und kann Ihre privaten Daten und Ihr System gefährden. Es wird dringend empfohlen, dies niemals zu tun, selbst wenn Sie glauben, Ihr System sei "persönlich" oder an einem "sicheren Ort"!

Wenn das Skript nur für den persönlichen Gebrauch bestimmt ist und Sie es an einem sicheren Ort aufbewahrt haben und keine Angst davor haben, dass Ihr Konto gestohlen wird, dann ist hier eine einfache Lösung:

echo LOGINPASSWD | sudo -S COMMAND HERE

Dabei ist LOGINPASSWD Ihr Anmeldekennwort (Beispiel: iloveponies) und COMMAND HERE Ihr Befehl, der nach sudo kommt, wie sh -c "echo da .. etc

hytromo
quelle
13
@Viswa, Bitte beachten Sie, dass es sehr sehr gefährlich ist, das Passwort im Klartext anzuzeigen. Es wird dringend empfohlen, dies nicht zu tun
Anwar
3
-1 Wenn dies eine gute Idee ist, sollten Sie ein Passwort für Ihr Root-Konto festlegen und die Lösung von z7sg verwenden. Das ist genauso einfach und schafft kein sehr gefährliches Sicherheitsproblem.
Bryce
4
Hah! Ich hatte 6 Upvotes und 4 Downvotes auf meiner Antwort :) Aber warum Jungs, war mir nicht klar, "Persönlicher Gebrauch", "sicherer Ort" usw.? Es gibt keine Sicherheitslücke, es sei denn, Sie geben diese Datei heraus und Sie haben einen SSH-Server in Betrieb! Wo sehen Sie das Sicherheitsproblem, vorausgesetzt, das Skript ist für den persönlichen Gebrauch und an einem sicheren Ort?
Hytromo
5
Downvoted, dies ist der Weg zur dunklen Seite und wird bei der sudo-Methode nicht benötigt.
Floyd
4
Ok, sag mir einfach, auch wenn der Hacker sich als einfacher Benutzer in dein Konto eingeloggt hat, wie zum Teufel findet er das Skript mit deinem Passwort unter / usr / share / help / lv / ubuntu-help?
Hytromo
21

Wenn es Ihnen nichts ausmacht, dass das Skript zu einer bestimmten Uhrzeit (oder am Tag) ausgeführt wird, legen Sie es in das Stammverzeichnis ( /root) des Stammverzeichnisses ( ) und führen Sie das Skript auf dem System crontab ( /etc/crontab) als root aus. Dann müssen Sie Ihre Sicherheit nicht gefährden.

Informationen zum Hinzufügen des Skripts zur Crontab finden Sie unter https://help.ubuntu.com/community/CronHowto .

z7sg
quelle
4
Vielleicht möchten Sie wahrscheinlich verwenden , anacronwenn das ein Desktop / Laptop ist die 24x7 nicht laufen
balki
Dies ist eine nützliche Antwort, wenn Sie beispielsweise das Skript schreiben, um nach Updates zu suchen, diese Informationen zu verarbeiten und dem Administrator eine E-Mail mit den erforderlichen Updates zu senden. Persönlich werden viele meiner Skripte für die Serverautomatisierung verwendet, daher würde ich normalerweise nur sudo crontab -e verwenden. +1
Rab
11

Eine weitere nette Funktion von sudo, die in den hervorragenden Antworten oben nicht erwähnt wurde, ist die Variable 'timestamp_timeout'. Dies ist eine Sudo-Variable, die Sie erhöhen können, um bei der Eingabe interaktiver Kennwörter zu sparen.

Beispiel: In / etc / sudoers (oder einer der darin enthaltenen Dateien) können Sie die Standardeinstellung ändern:

# only require a password once every 60 minutes
Defaults timestamp_timeout=60

Vollständige Beschreibung von 'man sudoers':

timestamp_timeout

        Number of minutes that can elapse before sudo will ask for
        a passwd again.  The default is 5, set this to 0 to always
        prompt for a password.

Dies kann natürlich nicht helfen, wenn der Befehl von cron ausgeführt wird. Aber es ist gut, sich dessen bewusst zu sein.

Arielf
quelle
0
export MY_SUDO_PASS="user_password_here"

So testen Sie, ob es funktioniert:

echo $MY_SUDO_PASS
> user_password_here

So führen Sie "sudo apt-get update" aus und akzeptieren das Kennwort der zuvor erstellten Umgebungsvariablen:

echo $MY_SUDO_PASS | sudo -S apt-get update

Führen Sie den Befehl "Von Python aus" aus (Beispiel: Ändern des Verzeichnisbesitzes rekursiv in "Benutzername_hier"):

python
>> import subprocess
>> subprocess.call('echo $MY_SUDO_PASS | sudo -S chown -R username_here /home/username_here/folder_to_change_ownership_recursivley', shell=True)

echo $ MY_SUDO_PASS get's password -S Schalter fängt es ab und übergibt das Passwort an sudo

jturi
quelle
Ich bin nicht sicher, was dies zu den vorhandenen Antworten hinzufügt, die die meisten aktuellen BIOS-Unterstützung bei Alarm wecken ...
Elder Geek