Sollten Skripte, die sudo benötigen, fehlschlagen, wenn sie es nicht haben, oder sudo und prompt verwenden?

26

Ich habe ein Skript, mit dem ich die Helligkeit der Hintergrundbeleuchtung genau steuern kann und sudodas ausgeführt werden muss. Es ist im Wesentlichen das:

backlight="/sys/class/backlight/acpi_video0/brightness"
echo $1 | tee $backlight

und lebt bei ~/bin/backlight-adjust. Das Skript benötigt sudoBerechtigungen, da tee $backlightan einen privilegierten Speicherort geschrieben wird. Also wird es scheitern, wenn es nicht läuft sudo.

Dieser Ansatz hat ein Problem, weil ich nicht einfach laufen kann sudo backlight-adjust, weil ~/binnicht $PATHin der sudoUmgebung, sondern nur in meiner Umgebung. Also müsste ich rennen sudo env "PATH=$PATH" backlight-adjustoder so ähnlich.

Alternativ hätte ich es so schreiben können:

backlight="/sys/class/backlight/acpi_video0/brightness"
echo $1 | sudo tee $backlight

und fordern Sie mich auf, das Passwort einzugeben.

Der zweite Ansatz funktioniert bei mir besser, da ich mich nicht daran erinnern muss, sudo einzugeben. es wird mich auffordern. Und ich kann meine $PATHintakt halten . Das fühlt sich insgesamt bequemer an, aber gibt es Gründe, warum ich es nicht auf die zweite Art tun sollte?

(Ich verwende Xubuntu 14.04 und meine Shell ist GNU Bash 4.2.45, wenn das einen Unterschied macht.)

John Feminella
quelle
Danke für die Korrektur. Ich bin mit ein modifiziertes Debian (LMDE) und mein sudohält eigentlich meine $PATHstandardmäßig so dass ich dieses Problem nicht haben.
Terdon

Antworten:

27

Persönlich würde ich einen anderen Ansatz verwenden. Erstellen Sie einen Alias ​​für Ihr Skript. Fügen Sie diese Zeile zu Ihrer ~/.bashrc(oder einer Entsprechung in anderen Shells) hinzu.

alias backlight-adjust='sudo ~/bin/backlight-adjust'

Auf diese Weise brauchen Sie sich keine Gedanken darüber zu machen, wie Sie es ausführen, sudound müssen das nicht sudozum Skript hinzufügen . Es ist für Sie völlig transparent und fordert Sie beim Ausführen einfach zur Eingabe Ihres Kennworts auf backlight-adjust.

terdon
quelle
Dies scheint ein sehr vernünftiger Ansatz zu sein, der nur minimale Auswirkungen auf den Rest des Systems hat. +1.
John Feminella
@JohnFeminella Wenn Sie dieses Skript jedoch jemals mit anderen teilen möchten, benötigen diese auch den Alias. Persönlich sehe ich keinen Grund, sudodas eigentliche Skript nicht einzufügen, zumal Sie auf diese Weise leicht erkennen können, für welche Elemente des Skripts tatsächlich Root-Berechtigungen erforderlich sind.
Kyle Strand
@KyleStrand Nein, werden sie nicht. Der vom Skript aufgerufene Befehl beschwert sich einfach darüber, keinen Zugriff zu haben.
terdon
@terdon Ich erkenne, dass ich etwas klarer hätte sein können, aber vermutlich wissen Sie, was ich meinte: Der Empfänger des Skripts wird mit demselben Problem konfrontiert sein, mit dem ursprünglich der Autor des Skripts konfrontiert war, und als gewissenhafter Skript-Sharer sollte der Autor dies tun Teilen Sie auch ihre persönliche Lösung für dieses spezielle Verwendungsdilemma mit.
Kyle Strand
@KyleStrand ja, aber es gab kein Problem, das einzige Problem, das das OP hatte, war, dass er sich nicht daran erinnern musste, sudo einzugeben, ansonsten ist das Skript perfekt portierbar. Mein Punkt ist, dass der Alias ​​komplett optional ist und nichts löst, sondern nur die Verwendung erleichtert.
terdon
7

Ich kann nicht erkennen, warum es falsch sein könnte - obwohl ich es normalerweise vorziehen würde, dass Befehle keine Fragen an mich stellen, damit sie skriptfähig sind. Sie können /etc/sudoersdie sudoFunktion auch ohne Passwort anpassen.

Aber ... warum nicht hinzufügen?

chgrp  one-of-your-groups-here /sys/class/backlight/acpi_video0/brightness     
chmod g+w /sys/class/backlight/acpi_video0/brightness 

in deinem /etc/rc.localund vergessen sudo?

(Wenn Sie Ubuntu verwenden können, befinden sudoSie sich in der sudo- Gruppe, damit Sie es verwenden chgrp sudo /sys...und damit zufrieden sein können.)

Rmano
quelle
3

Alternativ könnten Sie hinzufügen

Defaults        env_keep +="PATH"

zu Ihrer /etc/sudoersDatei.

Mog
quelle
2

Sie geben sudo backlight-adjust an, weil sich ~ / bin in der sudo-Umgebung nicht im $ PATH befindet

Warum also davon abhängen? Ich denke, Sie sollten nur diese Zeile ändern /home/user/bin/backlight-adjustund es wird funktionieren.

Aber ich hätte wirklich gerne Terdons Lösung, auch einen Alias ​​zu verwenden. Oder Sie platzieren Ihr Skript in /usr/bin/und es wird für jeden Benutzer verfügbar sein (inkl. Root)

ExploWare
quelle
Ja, aber es ist ärgerlich, das zu tun. Ansonsten, warum sollte ich es überhaupt in meinen $ PATH schreiben? Außerdem mag ich es, wenn es sich in ~/binmeinem Home-Dotfiles-Repository befindet, damit die Versionskontrolle nicht unterbrochen wird.
John Feminella
@ JohnFeminella übrigens gibt es keinen Grund, den Pfad zu ändern, verwenden Sie einfach die -EFlagge, um die Umwelt zu sudo -E command
schonen
@terdon Das funktioniert in Debian nicht; Es wird aus Sicherheitsgründen überschrieben. Sie müssten die Umgebungsvariablen explizit übergeben, wie ich in meiner Frage ( sudo env "PATH=$PATH" ...) erwähnt habe.
John Feminella
1

Kann keine allgemeine Regel angeben ... Wenn das Skript / Programm für eine Neukonfiguration (z. B. einen Drucker) vorgesehen ist und von regulären Benutzern aufgerufen werden soll, muss dies geschehen. Ansonsten würde ich gut genug in Ruhe lassen: Wenn ein regulärer Benutzer es ausführt, scheitern Sie einfach (entweder als Ergebnis einer expliziten Überprüfung oder nur, weil es nicht erlaubt ist, etwas zu tun).

Erhöhte Privilegien sollten, wenn überhaupt, sparsam vergeben werden. Das Wechseln zu höheren Rechten ist schwierig, überlassen Sie es besser den Experten (dh sudo(1)).

vonbrand
quelle
0

Ich persönlich verwende so etwas wie ${SUDO}in meinen Skripten, damit der Anrufer es bei Bedarf einstellen oder ${SUDO:-sudo}standardmäßig verwenden kann.

In Ihrem speziellen Fall bin ich jedoch mit der akzeptierten Antwort einverstanden.

Mirabilos
quelle
-1

Platzieren Sie das Skript (ohne das sudo) an einem geeigneten, benutzerweiten Ort /bin, und führen Sie dann Folgendes aus:

sudo chown root /bin/backlight-adjust
sudo chmod 4755 /bin/backlight-adjust

Dies funktioniert durch Setzen des setuid-Flags, was bedeutet, dass es immer als Dateieigentümer ausgeführt wird. Für Details lesen Sie bitte http://major.io/2007/02/13/chmod-and-the-mysterious-first-octet/ . Ich weiß nicht so viel darüber, wie das funktioniert. Ich fand es einfach googelnd, basierend auf etwas, von dem ich dachte, ich hätte es vor ein paar Jahren gelesen.

AJMansfield
quelle
1
Shell-Skripte können nicht mehr eingestellt werden, Gott sei Dank ... Das ist eine absolut böse Antwort, wissen Sie. Vor allem in Bezug auf die Sicherheit.
Mirabilos
@mirabilos Es ist nur gefährlich, wenn die Gruppen- oder allgemeinen Schreibflags aktiviert sind. Mit setuid besteht das Risiko, dass jeder mit Schreibrechten für die Datei alles ausführen kann, was er möchte, als wäre er der Benutzer. Daher müssen diese Schreibrechte geschützt werden. 4755Mittel, die immer ausgeführt werden, wenn der Eigentümer lesen, schreiben und ausführen kann, die Gruppe lesen und ausführen kann und die Benutzer lesen und ausführen können. Dies ist die Standardberechtigungsstufe für Dinge, die ein Benutzer mit Root-Berechtigungen ausführen darf.
AJMansfield
@mirabilos Und die Idee, dass Shell-Skripte mit setuid mehr Schwachstellen als Binärdateien mit setuid beinhalten, ist einfach albern; Binärdateien sind auch nicht immun gegen den ptrace-Exploit, der der Haupt-Exploit ist, der setuid nutzt.
AJMansfield
2
Alle aktuellen Unix-ähnlichen Betriebssysteme verbieten setuid-Skripte. Das ist nur eine Tatsache. Fragen Sie sie selbst nach Gründen, wenn Sie mir nicht glauben. Beginnen Sie mit OpenBSD.
Mirabilos