Was ist der Sinn von „true“ in bash, wenn sudo true ist? dann"

20

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
Matt Parkins
quelle
2
Wenn Sie die Frage ablehnen, können Sie erläutern, was ich tun kann, um die Frage zu verbessern? Ist das nicht die richtige Überlaufstelle?
Matt Parkins
4
Ich bin nicht sicher, woher die Abstimmungen kommen. Versuchen Sie, die Anweisung zu negieren oder die Anweisung für ungültig zu erklären ? Sie sagen, Sie möchten sowohl das Echo als auch das "Sonst" loswerden. Was ist also Ihr Endziel?
Jeff Schaller
1
siehe stackoverflow.com/q/10552711/537980
ctrl-alt-delor
1
@ ctrl-alt-delor Nach diesem Link muss ich anscheinend nur ein Ausrufezeichen vor das Sudo setzen und dann kann ich sowohl das Echo als auch das übrige entfernen, und jetzt habe ich es getestet, das funktioniert, danke.
Matt Parkins
2
Im Vorbeigehen sollten Sie die Fehlermeldung wahrscheinlich in den Fehlerstrom umleiten:echo "Aborting script" >&2
Toby Speight

Antworten:

38

trueBash ist kein Schlüsselwort, sondern ein Programm, das sofort mit einem erfolgreichen Beendigungscode beendet wird. Ebenso falseist 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.

true
echo $? # 0
false
echo $? #1

if sudo trueist nicht gleichbedeutend mit if sudo == true. if sudo trueführt das trueProgramm mit aus sudound überprüft den Exit-Code.

Deshalb:

if sudo false; thenläuft das Programm falseals sudo. Die Rückgabe wird immer falsch sein.

if sudo true == falsewird das Programm truemit den Argumenten ausführen ==und falseverwenden sudo. Das ist offensichtlich nicht so, wie du es beabsichtigt hast.

if [!(sudo true)] ist eine ungültige Syntax.

Was Sie wahrscheinlich suchen, ist

if ! sudo true;
JShorthouse
quelle
12
Als leicht pedantic Korrektur des ersten Satz: in heftigen Schlag , trueund falseist „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 truewird das eigenständige Programm ausgeführt, nicht die eingebaute Bash.
IMSoP
31
PS: Meine Lieblingszusammenfassungen von trueund falsesind die Titel auf ihren Manpages: true - do nothing, successfullyundfalse - do nothing, unsuccessfully
IMSoP
3
@IMSoP Das ist tief.
Brainplot
2
Wenn truenicht 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.
Nigel222
2
In AT & T SYSV Unix war "true" ein Shell-Skript / bin / true, das aus einem großen Copyright-Hinweis in Kommentaren bestand ... und sonst nichts.
Lee Daniel Crocker
21

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 trueProgramm, wie in der akzeptierten Antwort erläutert.

Mehrdad
quelle
1
Im Wesentlichen das. Eine Alternative könnte sein, zu überprüfen, ob der Benutzer in der sudoers-Gruppe ist, aber das reine Laufen sudo trueist auch recht einfach, wenn auch etwas hackig.
Sergiy Kolodyazhnyy
3
Beachten Sie, dass dies ebenfalls sudoinstalliert 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.)
Mehrdad
1
Das OP möchte aussteigen, wenn Sie nicht sudo können, und zwei Zeilen loswerden, anstatt ein anderes nach einem noop zu haben.
McKenzm
2
Umgekehrt können Sie auch in der Lage sein, sudoohne Mitglied der sudoers-Gruppe zu sein, wenn Sie (entweder persönlich oder als Mitglied einer anderen Gruppe) in aufgeführt sind /etc/sudoers. Aber auch sudo trueist nicht unfehlbar, da der sudoZugriff nur für bestimmte Befehle gewährt werden kann, so dass Sie möglicherweise dazu in der Lage sind sudo true, aber nicht dazu sudo something_elseoder umgekehrt. Es gibt keine andere Möglichkeit zum Testen, als den Befehl auszuführen, mit dem Sie tatsächlich ausgeführt werden möchten sudo.
Dave Sherohman
2
Sie können sich auch in der sudoersGruppe befinden und dies nicht, sudoda die sudoersGruppe nicht in der sudoersDatei aufgeführt ist. Eine Gruppe mit den vier Buchstaben sudoim Namen ist kein gültiger Hinweis darauf, ob ein Benutzer in dieser Gruppe eine bestimmte Aktion ausführen kann oder nicht sudo.
jrw32982 unterstützt Monica
5

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.

Luciano Andress Martini
quelle
1
Die einzigen Befehle, die über sudo ausgeführt werden, sind sudo trueund sudo -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.
Ilkkachu
Ich schrieb: "Wenn sie in diesem Fall einen Befehl mit sudo ausführen müssen, wird dieser beim Start zuerst überprüft und das Passwort nur einmal abgefragt."
Luciano Andress Martini