Ich habe ein Skript, das drei Funktionen ausführt : A && B && C
.
Die Funktion B
muss als Superuser ausgeführt werden, während A
und C
nicht.
Ich habe mehrere Lösungen, aber keine davon ist zufriedenstellend:
sudo das gesamte Skript:
sudo 'A && B && C'
Das scheint eine schlechte Idee zu sein
A
undC
als Superuser, wenn es nicht benötigt wirdMachen Sie das Skript interaktiv:
A && sudo B && C
Möglicherweise muss ich mein Passwort eingeben, aber ich möchte, dass mein Skript nicht interaktiv ist, da jede Funktion einige Zeit in Anspruch nehmen kann und ich nicht möchte, dass das Skript auf mich wartet. Nun, das ist auch der Grund, warum es überhaupt ein Skript ist, also muss ich nicht zusehen, wie es läuft.
Die blöde Lösung:
sudo : && A && sudo -n B && C
Zuerst scheint es dumm, zuerst ein No-Op zu machen
sudo
, und ich muss auch die Daumen drücken, dass A nicht mehr als dauern wird$sudo_timeout
.Hypothetische Lösung (ich wünschte, Sie würden mir sagen, dass es existiert):
sudo --store-cred 'A && sudo --use-cred-from-parent-sudo B && C'
Das würde zu Beginn nach meinem Passwort fragen und diese Anmeldeinformationen dann nur bei Bedarf verwenden.
Was ist deine Meinung zu all dem? Ich wäre sehr überrascht, dass es keine Lösung für dieses Problem gibt, da ich denke, dass es ein ziemlich häufiges Problem ist (was ist mit make all && sudo make install
) ?
quelle
A
undC
Teile explizit mit aussu -l some_non_priviliged_user
. Keine Timeout-Probleme und keine Privilegien für A und C. Ich denke nicht, dass 4 möglich ist,sudo
scheint ein "globaler Zustand" für einen Benutzer zu sein.Antworten:
Ich denke, das Beste, was Sie tun können, ist, das Skript mit zu
sudo
starten und dann die Prozesse zu starten, die Sie als normaler Benutzer explizit mitsu user
oder ausführen möchtensudo -u user
:quelle
Fügen Sie der
/etc/sudoers
Datei Ihr Skript mit demNOPASSWD
Attribut hinzu, damit es ausgeführt werden kann, ohne dass Sie zur Eingabe eines Kennworts aufgefordert werden. Sie können dies an einen bestimmten Benutzer (oder eine Gruppe von Benutzern) binden oder zulassen, dass essudo
von jedem auf Ihrem System ausgeführt wird.Eine Beispielzeile für ein Skript mit dem Namen
/usr/local/bin/bossy
könnte ungefähr so aussehenUnd dann würden Sie so etwas verwenden
Für dieses Beispiel habe ich
PATH
Includes angenommen/usr/local/bin
. Wenn nicht, verwenden Sie einfach den vollständigen Pfad zum Skript, dhsudo /usr/local/bin/bossy
quelle
Möglicherweise möchten Sie die
!requiretty
Option sowohl insudo
als auch in derNOPASSWD
Option verwenden. Beachten Sie jedoch, dass dies die Sicherheit verringert.quelle
/etc/sudoers
Befehlseingabe für den Benutzer auszuführen ,B
mitNOPASSWD
ist die richtige Antwort.Aufbauend auf meiner Antwort auf die Vorautorisierung von sudo? (Damit es später ausgeführt werden kann) , schreiben Sie zwei Skripte:
ABC_script
::B_script
::Ausführen
./ABC_script
:sudo -b ./B_script
. Dies fragt nach dem Passwort ( unmittelbar nach dem AusführenABC_script
). Unter der Annahme , dass das richtige Passwort eingegeben wird, erzeugt erB_script
in dem b ackground (weil-b
als Root angegeben wurde). Dies scheint gleichbedeutend zu seinsudo sh -c "./B_script &"
.B_script
wird parallel zu asynchron ausgeführtABC_script
.B_script
prüft auf das Vorhandensein einer aufgerufenen DateiA_is_done
und führt eine Schleife durch, bis sie angezeigt wird.ABC_script
läuftA
. Wenn / wenn derA
Vorgang erfolgreich abgeschlossen wurde, erstellt das Skript eine Datei mit dem NamenA_is_done
.ABC_script
Anschließend wird geprüft, ob eine aufgerufene Datei vorhanden ist,B_is_done
und es werden Schleifen ausgeführt, bis sie angezeigt wird.B_script
Erkennt parallel das Vorhandensein vonA_is_done
und bricht aus der Schleife aus. Es löscht dieA_is_done
Datei und wird ausgeführtB
. Denken Sie daran,B_script
wird als root ausgeführt, sodass esB
als root ausgeführt wird. Wenn / wenn derB
Vorgang erfolgreich abgeschlossen wurde, erstellt das Skript eine aufgerufene DateiB_is_done
und wird beendet.ABC_script
Erkennt parallel das Vorhandensein vonB_is_done
und bricht aus der Schleife aus. Es löscht dieB_is_done
Datei. Denken Sie daran, dass esB_script
als root ausgeführt wurde, alsoB_is_done
im Besitz von root ist und Sie es verwenden möchten, umrm -f
zu vermeiden, dass Sie eine Bestätigungsanforderung erhalten.ABC_script
läuft dannC
und geht.Hinweise zur weiteren Verfeinerung:
ABC_script
sollte wahrscheinlichB_script
eher auf einem absoluten Pfad laufen als./
.A_is_done
undB_is_done
,ABC_script
sollte wahrscheinlich zufällig, eindeutige Dateinamen generieren.Es muss eine Bestimmung vorhanden sein, damit das Skript, das auf das Warten wartet, benachrichtigt wird, wenn das Programm, auf das es wartet, beendet wurde, aber fehlgeschlagen ist. (Im Moment, wenn dies
A
fehlschlägt, gehen beide Skripte einfach in eine Endlosschleife.) Dies kann so einfach wie das Ändern seinzu
Ändern Sie anschließend die Spin-Waits, um die
X_is_done
Dateien zu lesen , und fahren Sie fort, wenn sie 0 enthalten, und beenden Sie sie anderweitig.quelle
Sei dumm. benutze viele Zeilen.
quelle
&&
A && sudo B && C
. Genau wie Antoine in der Frage erklärt; Dies fragt nicht nach dem Passwort, bisA
es fertig ist, und er möchte nicht darauf warten müssen oder das Skript auf ihn warten lassen.