Wie füge ich einen Befehl in einem Skript hinzu, ohne nach einem Kennwort gefragt zu werden?

101

Ich möchte mein System jeden Tag automatisch einschalten. Ich verwende den folgenden Code in meinem Python-Skript, aber sudo fragt mich jedes Mal nach einem Kennwort:

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

Wie kann ich dieses Skript ausführen, ohne dass sudo jedes Mal nach dem Kennwort fragt?

    
Viswa 25.06.2012, 15:30
quelle

5 Antworten

138
  

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

Der richtige Weg , um sudo so einzurichten, dass nur der von Ihnen benötigte Befehl, dh echo date... > rtc... , OHNE den Befehl ausführen darf Passwort.

Schritt 1. Erstellen Sie ein Shellskript mit diesem Befehl

  • Öffnen Sie gedit (oder Ihren bevorzugten Editor) und erstellen Sie das Skript, z. pydatertc.sh
  • Nur diese Zeile einfügen und speichern, z. Ihr Heimatverzeichnis:
    echo date \'+%s\' -d \'+ 24 hours\' > /sys/class/rtc/rtc0/wakealarm
  • Verlassen Sie den Editor und machen Sie aus dem Terminal die ausführbare Datei , und ändern Sie den Besitz von root . Andernfalls könnte ein anderer Benutzer, der Zugriff auf Ihr System hat, möglicherweise das Skript bearbeiten und Führen Sie die gewünschten Befehle als root aus, 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.sh ohne Kennwort ausgeführt werden kann

  • Geben Sie am Terminal sudo visudo ein, um die Sudo-Berechtigungsdatei ( sudoers ) zu öffnen.
  • In Zeile 25 wird folgende Zeile angezeigt: %sudo ALL=(ALL:ALL) ALL
  • Fügen Sie unterhalb dieser Zeile die folgende Zeile ein, wobei username Ihr Benutzername ist:
    username  ALL=(ALL) NOPASSWD: /home/username/pydatertc.sh
  • Beenden Sie den Editor ( Strg + X falls nano )

Schritt 3. Ändern Sie Ihr Python-Skript, um pydatertc.sh aufzurufen.

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

Jetzt sollte Ihr Skript ohne Passwort ausgeführt werden. UND ohne die Sicherheit Ihres Kontos, Ihrer Daten oder Ihres Systems zu beeinträchtigen!

Alternative nur für wakealarm (nicht zur allgemeinen Verwendung!):

Nur in diesem speziellen Fall , da die Datei /sys/class/rtc/rtc0/wakealarm nur den Weckalarm für das System steuert und ansonsten harmlos ist. Eine andere Möglichkeit, das Kennwort zu umgehen, besteht darin, entweder den Besitz zu übernehmen Datei mit chown (wenn Sie der einzige Benutzer sind, der den Alarm einstellt) oder mit chmod +666 weltweit schreibbar machen; Entfernen Sie in diesem Fall einfach die sudo aus Ihrem Python-Aufruf, und lassen Sie sh -c "...." intakt.

    
ish 25.06.2012 16:53
quelle
29
  

Warnung!

     

Wenn Sie Ihr Anmeldekennwort im Klartext, in einem Befehl oder in einer Datei speichern, ist extrem unsicher und kann Ihre privaten Daten und Ihr System gefährden. Es wird dringend empfohlen , dies niemals zu tun, auch wenn Sie glauben, dass Ihr System "persönlich" ist oder sich an einem "sicheren Ort" befindet!

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

echo LOGINPASSWD | sudo -S COMMAND HERE

wobei LOGINPASSWD Ihr Login-Passwort ist (Beispiel: iloveponies) und BEFEHL HIER ist Ihr Befehl, der nach sudo kommt, wie sh -c "echo da .. etc

    
hytromo 25.06.2012 15:38
quelle
21

Wenn Sie nichts dagegen haben, dass das Skript zu einer bestimmten Uhrzeit (oder tagsüber) ausgeführt wird, legen Sie es im Stammverzeichnis von root ( /root ) ab und führen Sie das Skript über die System-Crontab ( /etc/crontab ) aus. ) als root. Dann müssen Sie Ihre Sicherheit nicht gefährden.

Unter Link finden Sie Informationen zum Hinzufügen des Skripts zur Crontab.

    
z7sg 25.06.2012 15:49
quelle
11

Ein weiteres verwandtes nettes Feature von sudo, das in den obigen hervorragenden Antworten nicht erwähnt wurde, ist die Variable 'timestamp_timeout'. Es ist eine Sudo-Variable, die Sie erhöhen können, um interaktive Kennworteingaben zu speichern.

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. Es ist jedoch eine gute Sache, sich dessen bewusst zu sein.

    
arielf 29.06.2012 23:10
quelle
1
export MY_SUDO_PASS="user_password_here"

Um zu testen, ob es sich um einen funktionierenden Typ handelt:

echo $MY_SUDO_PASS
> user_password_here

Ausführen von "sudo apt-get update" und Akzeptieren des Kennworts aus Umgebungsvariablen, die wir zuvor erstellt haben:

echo $MY_SUDO_PASS | sudo -S apt-get update

Führen Sie von Python aus (Beispiel zum rekursiven Ändern des Verzeichnisbesitzers in username_here):

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 Passwort abrufen -S Schalter wird abgefangen und das Passwort an sudo übergeben

    
Jozsef Turi 15.03.2018 17:59
quelle

Tags und Links