Ich habe ein Skript, das als sudo script.sh
oder ausgeführt werden kannpkexec script.sh
Aus Benutzersicht wäre es viel angenehmer, wenn das Skript den Benutzer nach dem Kennwort fragen würde, wenn es nur mit seinem Namen ausgeführt würde script.sh
.
Wie kann ich eine Anforderung an das gesamte Skript "einbetten" pkexec
oder sudo
es mit Root-Rechten ausführen?
Beachten Sie, dass das Ausführen von Allem mit sudo sh -c
möglicherweise nicht die beste Lösung ist, da ich Funktionen im Skript habe.
command-line
bash
scripts
Sergiy Kolodyazhnyy
quelle
quelle
exec
- sich selbst aufrufen, aber gleichzeitig den Prozess ersetzen, damit wir nicht mehrere Instanzen des Skripts"$@"
wird auf mehrere Wörter erweitert, eines für jeden Parameter.Wenn Sie einen schönen Dialog wünschen, versuchen Sie etwas davon. Ich habe dies direkt aus etwas herausgerissen, das ich geschrieben habe, damit es zusätzliche Dinge gibt, die Sie vielleicht nicht brauchen oder wollen, aber es zeigt die allgemeine Idee:
Hierfür wird Whiptail verwendet, das Sie installieren können, wenn Sie es noch nicht haben:
quelle
exec echo [PASSWORD]
! Es wird ein Prozess mit dem Kennwort in der Befehlszeile erzeugt, den jeder Benutzer sehen kann. Verwenden Sie entweder den eingebauten Befehlecho
(erzwingen Sie die eingebaute Version mitbuiltin echo
) oder den Bashismus<<<
(wie folgt:)sudo ... <<< "$pass"
; Sh und andere Shells haben hier Dokumente für diese Fälle. Geben Sie auch das Passwort an, falls es Sonderzeichen enthält.whiptail
Befehl in ein separates Skript und die Verwendung so etwas wieSUDO_ASKPASS=/path/to/askpass-with-whiptail.sh sudo -A -p "My password prompt" -- "$0" "$@"
habensudo
prompt Deal mit dem benutzerdefinierten Kennwort ein .Die Antwort von blade19899 ist in der Tat der richtige Weg, aber man könnte auch
sudo bash
den Shebang einschalten:Die offensichtliche Einschränkung ist, dass dies nur funktioniert, solange das Skript mit aufgerufen wird,
./script
und fehlschlägt, sobald das Skript mit aufgerufen wirdbash script
.quelle
bash script
in die Befehlszeile eingeben sollten, um ein Skript aufzurufen. Wenn das Skript etwas anderes alsbash
die#!
Zeile angibt, schlägt der Aufruf mitbash script
fehl. Wenn ich versuchen würde, ein Python-Skript mitbash script.py
diesem aufzurufen , würde dies ebenfalls fehlschlagen.perl script
. Um wirklich nett zu sein, überprüft Perl die shebang-Zeile und führt das richtige Programm aus, wenn Perl nicht aufgerufen wird.Ich stelle den Befehlen innerhalb des Skripts, die root-Zugriff benötigen, ein Vorwort voran
sudo
- wenn der Benutzer noch keine Berechtigungen erhalten hat, fordert das Skript an dieser Stelle zur Eingabe eines Kennworts auf.Beispiel
Dieses Skript kann entweder als
sudo <scriptname>
oder als ausgeführt werden<scriptname>
. In beiden Fällen werden Sie nur einmal nach dem Passwort gefragt.quelle
sudo
dass 25 verschiedene Befehle redundant abgerufen werden müssen. Es ist einfacher, sudo einmal aufzurufen. In diesem Fall ruft Ihr Skript sudo jedoch nur einmal auf, weil sudo eine Zeit von 15 Minuten hat - Befehle, die länger dauern, müssen erneut eingegeben werden. Dein Weg funktioniert einfach. . . Nicht so, wie ich es brauche.Anscheinend hat hier niemand das offensichtliche Anliegen angesprochen. Das Einfügen
sudo
in Ihr Skript, das Sie dann verteilen, fördert schlechte Benutzergewohnheiten . (Ich gehe davon aus, dass Sie es verteilen, weil Sie "aus Sicht der Benutzer" erwähnen.)Die Wahrheit ist, dass es bei der Verwendung von Anwendungen und Skripten eine Richtlinie gibt, die dem Sicherheitsprinzip im Bankwesen ähnelt: Geben Sie Ihre persönlichen Daten niemals an jemanden weiter, der Sie anruft und angibt, dass er "von Ihrer Bank aus" anruft , und die existiert aus ähnlichen Gründen.
Die Regel für Bewerbungen lautet:
Geben Sie niemals Ihr Passwort ein, wenn Sie dazu aufgefordert werden, es sei denn, Sie sind sich sicher, was damit geschehen soll. Dies gilt dreifach für jeden mit
sudo
Zugang.Wenn Sie Ihr Kennwort eingeben, weil Sie
sudo
über die Befehlszeile ausgeführt wurden, ist das großartig. Wenn Sie es eingeben, weil Sie einen SSH-Befehl ausgeführt haben, ist das in Ordnung. Wenn Sie es eingeben, wenn Sie sich bei Ihrem Computer anmelden, ist das natürlich großartig.Wenn Sie nur ein fremdes Skript oder eine ausführbare Datei ausführen und Ihr Kennwort nach Aufforderung nur zögerlich eingeben, wissen Sie nicht, wie das Skript damit umgeht . Soweit Sie wissen, kann es sein, dass es in einer temporären Datei im Klartext gespeichert wird und sich nicht selbst bereinigt.
Offensichtlich gibt es separate und zusätzliche Bedenken hinsichtlich der Ausführung unbekannter Befehle
root
, aber ich spreche hier davon, die Sicherheit des Kennworts selbst aufrechtzuerhalten . Selbst wenn die Anwendung / das Skript nicht böswillig ist, möchten Sie dennoch, dass Ihr Kennwort sicher gehandhabt wird, um zu verhindern, dass andere Anwendungen darauf zugreifen und es böswillig verwenden.Meine persönliche Antwort darauf lautet also:
quelle
sudo script_name
genauso verwundbar wie es ist, dasselbe. Vielleicht fördert diese Idee schlechte Gewohnheiten - dazu werde ich nichts sagen. Aber der Schlüssel ist zu wissen, was ein Programm tut, und das ist die Verantwortung des Benutzers. Das ist die ganze Idee hinter Open-Source-Software. Wie für mein eigenes Skript, na ja. . . Ein Skript ist Klartext - Benutzer können es lesen, wenn sie wissenIch habe es so gemacht:
quelle