Ich habe dieses Bash-Skript gehackt, das prüft, ob der Benutzer Superuser-Rechte hat und ob er nicht danach fragt. Letztendlich versuche ich, die zweite "if" -Anweisung umzukehren, damit ich die folgenden zwei Zeilen entfernen kann (das Echo "password ok" und das "else" in der folgenden Zeile)
# Root user only
if [[ "$EUID" != 0 ]]; then
sudo -k # make sure to ask for password on next sudo
if sudo true; then
echo "Password ok"
else
echo "Aborting script"
exit 1
fi
fi
echo "do my ops"
Ist der Zweck von "true" in der vierten Zeile nur eine Null-Anweisung?
Ich muss den Test in der vierten Zeile invertieren. Wie mache ich das? Folgendes habe ich versucht:
if sudo false; then
if sudo true == false; then
if [!(sudo true)]; then
echo "Aborting script" >&2
Antworten:
true
Bash ist kein Schlüsselwort, sondern ein Programm, das sofort mit einem erfolgreichen Beendigungscode beendet wird. Ebensofalse
ist ein Programm, das mit einem erfolglosen Exit-Code beendet wird.Sie können dies ausprobieren, indem Sie beide Programme von Ihrem Terminal aus ausführen und dann die
$?
Variable lesen , die den Exit-Code des letzten Programms enthält.if sudo true
ist nicht gleichbedeutend mitif sudo == true
.if sudo true
führt dastrue
Programm mit aussudo
und überprüft den Exit-Code.Deshalb:
if sudo false; then
läuft das Programmfalse
als sudo. Die Rückgabe wird immer falsch sein.if sudo true == false
wird das Programmtrue
mit den Argumenten ausführen==
undfalse
verwendensudo
. Das ist offensichtlich nicht so, wie du es beabsichtigt hast.if [!(sudo true)]
ist eine ungültige Syntax.Was Sie wahrscheinlich suchen, ist
quelle
true
undfalse
ist „builtins“, Befehle direkt von dem Shell interpretiert; In Unix-ähnlichen Systemen sind sie im Allgemeinen auch als eigenständige Programme auf dem Dateisystem vorhanden. Der Unterschied ist hier nicht so wichtig, aber soweit ich weiß,sudo true
wird das eigenständige Programm ausgeführt, nicht die eingebaute Bash.true
undfalse
sind die Titel auf ihren Manpages:true - do nothing, successfully
undfalse - do nothing, unsuccessfully
true
nicht vorhanden, zeigt der Code in der Frage, warum man es möglicherweise erfinden muss! Es ist ein minimales Programm, das nur scheitern kann, wenn das System, auf dem es läuft, wirklich kaputt ist. Auf diese Weise können Sie feststellen, ob Ihre Zugangsdaten in Ordnung sind.Ich habe das Gefühl, dass die akzeptierte Antwort Ihre Frage nicht beantwortet hat.
Der Zweck dieses Vorgangs besteht darin, zu überprüfen, ob Sie dies tatsächlich können
sudo
.Wie diese Prüfung durchgeführt wird, erfolgt über das
true
Programm, wie in der akzeptierten Antwort erläutert.quelle
sudo true
ist auch recht einfach, wenn auch etwas hackig.sudo
installiert werden muss, damit die Überprüfungen nicht völlig gleichwertig sind. Sie könnten sich in der Gruppe sudoers befinden und trotzdem nicht in der Lage sein, sudo auszuführen. (Dies kann insbesondere dann der Fall sein, wenn Sie z. B. ein Skript schreiben, um ein neues Image von einem minimalen rootfs-Tarball zu erstellen, der möglicherweise kein sudo enthält.)sudo
ohne Mitglied der sudoers-Gruppe zu sein, wenn Sie (entweder persönlich oder als Mitglied einer anderen Gruppe) in aufgeführt sind/etc/sudoers
. Aber auchsudo true
ist nicht unfehlbar, da dersudo
Zugriff nur für bestimmte Befehle gewährt werden kann, so dass Sie möglicherweise dazu in der Lage sindsudo true
, aber nicht dazusudo something_else
oder umgekehrt. Es gibt keine andere Möglichkeit zum Testen, als den Befehl auszuführen, mit dem Sie tatsächlich ausgeführt werden möchtensudo
.sudoers
Gruppe befinden und dies nicht,sudo
da diesudoers
Gruppe nicht in dersudoers
Datei aufgeführt ist. Eine Gruppe mit den vier Buchstabensudo
im Namen ist kein gültiger Hinweis darauf, ob ein Benutzer in dieser Gruppe eine bestimmte Aktion ausführen kann oder nichtsudo
.Wie ich in diesem Skript sehe. Es wird nur geprüft, ob sudo aktiviert ist, das ist es ..
true gibt nur true zurück.
Wenn in diesem Fall ein Befehl mit sudo ausgeführt werden muss, wird dies beim Start überprüft und das Kennwort wird nur einmal abgefragt.
Die Bedingung funktioniert wie folgt: Wenn sudo den Befehl true korrekt ausführt, gibt es true für die Bedingung if zurück, sudo ist aktiviert und der Benutzer hat das Kennwort korrekt eingegeben, andernfalls haben Sie das Kennwort falsch eingegeben oder sudo ist nicht aktiviert, das Skript darf nicht weitermachen.
Die anderen Befehle müssen nicht nach dem sudo-Kennwort fragen, da Ihre Authentifizierung beim ersten Mal erfolgreich war (dies hängt jedoch von der sudo-Konfiguration ab, sodass dieses Skript stark von der Umgebungskonfiguration abhängt).
Das 'echo password ok' zeigt das auch. Das Shell-Skript fragt nicht mehr nach dem Passwort.
quelle
sudo true
undsudo -k
. Letzteres erfordert ausdrücklich kein Passwort. Keiner der anderen Befehle im Skript wird über sudo ausgeführt, daher sind keine Kennwörter erforderlich, unabhängig davon, ob die Authentifizierung zum ersten Mal erfolgreich war.