Ich habe ein Skript von einer Crontab eines nicht privilegierten Benutzers ausgeführt, das einige Befehle mit aufruft sudo
. Außer es tut nicht. Das Skript läuft einwandfrei, aber die sudo'ed-Befehle schlagen unbemerkt fehl.
Das Skript läuft perfekt von einer Shell aus als der betreffende Benutzer.
Sudo benötigt kein Passwort. Der betreffende Benutzer hat
(root) NOPASSWD: ALL
Zugriff gewährt in/etc/sudoers
.Cron läuft und führt das Skript aus. Durch Hinzufügen eines einfachen
date > /tmp/log
Elements wird die Ausgabe zum richtigen Zeitpunkt erstellt.Es ist kein Berechtigungsproblem. Wieder wird das Skript ausgeführt, nur nicht die sudo'ed-Befehle.
Es ist kein Pfadproblem. Wenn Sie
env
das Skript ausführen, wird die richtige$PATH
Variable angezeigt, die den Pfad zu sudo enthält. Es hilft nicht, es unter Verwendung eines vollständigen Pfads auszuführen. Der ausgeführte Befehl erhält den vollständigen Pfadnamen.Der Versuch, die Ausgabe des Befehls sudo einschließlich STDERR zu erfassen, zeigt nichts Nützliches. Durch Hinzufügen
sudo echo test 2>&1 > /tmp/log
zum Skript wird ein leeres Protokoll erstellt.Die Sudo-Binärdatei selbst wird einwandfrei ausgeführt und erkennt, dass sie Berechtigungen hat, auch wenn sie von cron im Skript ausgeführt wird. Das Hinzufügen
sudo -l > /tmp/log
zum Skript erzeugt die Ausgabe:Der Benutzer ec2-user kann auf diesem Host die folgenden Befehle ausführen:
(root) NOPASSWD: ALL
Wenn Sie den Exit-Code des Befehls mit untersuchen $?
, wird ein Fehler zurückgegeben (Exit-Code:) 1
, aber es scheint kein Fehler zu vorliegen. Ein so einfacher Befehl /usr/bin/sudo /bin/echo test
gibt denselben Fehlercode zurück.
Was könnte sonst noch los sein?
Dies ist eine kürzlich erstellte virtuelle Maschine, auf der das neueste Amazon Linux AMI ausgeführt wird. Die crontab gehört dem Benutzer ec2-user
und die sudoers-Datei ist der Standard für die Verteilung.
The user in question has (root) NOPASSWD: ALL access granted in /etc/sudoers
und mein Gehirn begann zu laut zu schreien, um weiterzulesen.sudo
Rechten / nur / für die Befehle einzurichten, die Sie im Skript benötigen, und deren Anmeldefähigkeit vollständig zu deaktivieren.Antworten:
Sudo hat einige spezielle Optionen in seiner Berechtigungsdatei, von denen eine eine Einschränkung der Verwendung für Shells zulässt, die in einem TTY ausgeführt werden, was Cron nicht ist.
In einigen Distributionen, einschließlich Amazon Linux AMI, ist dies standardmäßig aktiviert. Die
/etc/sudoers
Datei sieht ungefähr so aus:Wenn Sie die Ausgabe in STDERR auf der Ebene des Shell-Skripts statt des Befehls sudo selbst erfasst hätten, wäre Ihnen eine Meldung in etwa so vorgekommen:
Die Lösung besteht darin, sudo die Ausführung in Nicht-TTY-Umgebungen zu ermöglichen, indem die folgenden Optionen entfernt oder auskommentiert werden:
quelle