Ignoriere sudo im Bash-Skript

9

Ich habe ein kleines Bash-Skript:

#!/bin/bash

touch dummy.txt

Wenn ich dieses Skript mit ausführe sudo, wird es erstellt, dummy.txtdas root-geschützt ist .

Was ich tun möchte ist:

Unabhängig davon , ob dieses Skript ausgeführt wird , unter Verwendung sudooder ein normaler Benutzer, die Datei dummy.txtsollte nicht root geschützt werden.

Anonym
quelle
4
Was auch immer Sie unter "root protected" verstehen, Sie können chownund chmodin Ihrem Skript verwenden, um den Besitz und die Berechtigungen wie gewünscht festzulegen.
Fkraiem
1
Es ist nicht klar, was Sie unter "root protected" verstehen. Meinen Sie damit, dass nur der Root-Benutzer lesen / schreiben kann (z. B. sind die Dateiberechtigungen auf etwa 700 festgelegt) oder dass der Root-Benutzer der Dateieigentümer ist?
1
@ DoritoStyle Entschuldigung für die Verwirrung. Mit root protected meinte ich, dass der Root-Benutzer der Dateieigentümer ist.
Anonym

Antworten:

22

Sie können testen, ob das Skript sudomithilfe der Variablen EUIDund ausgeführt SUDO_USERwird, und dann ausführen, touchals SUDO_USERob es wahr wäre - so etwas wie

#!/bin/bash

if [[ $EUID -eq 0 ]] && [[ -n $SUDO_USER ]]; then
  sudo -u "$SUDO_USER" touch dummy.txt
else
  touch dummy.txt
fi
Steeldriver
quelle
2
Beachten Sie, dass ==für den Zeichenfolgenvergleich verwendet. Da ein $EUIDganzzahliger Wert zurückgegeben werden soll, würde ich empfehlen, den -edVergleich zu verwenden. Leerzeichen sind in Benutzernamen zulässig , zitieren Sie also wahrscheinlich die $SUDO_USERVariable. Ansonsten gute Antwort - das würde ich persönlich nutzen.
Sergiy Kolodyazhnyy
@steeldriver das ist was ich gesucht habe. Vielen Dank!!
Anonym
1
Sie können das Skript selbst erneut ausführen lassen, sudo -uwenn es feststellt, dass es als Root ausgeführt wird. Das OP sprach davon, mehrere Befehle in einem Skript zu haben. Vermeiden Sie jedoch eine Endlosschleife bei Fehlern.
Peter Cordes
1
Es gibt keine [[...]]Wortaufteilung innerhalb, daher ist es nicht unbedingt erforderlich, die Variable in der if-Anweisung zu zitieren. @Serg und ich -edwaren ein Tippfehler für-eq
Arronical
@Arronical ja, das war Tippfehler für -eq. Wusste nicht, dass [[es keine Wortaufteilung gibt. Vielen Dank. Persönlich würde ich immer noch aus Gründen der guten
Skriptgewohnheiten
9

Wenn Ihr Skript nicht als ausgeführt werden soll root, können Sie das Problem am sichersten lösen, indem Sie die Ausführung des Skripts ganz am Anfang abbrechen:

if [ "$EUID" = 0 ]; then
   echo "This script must NOT be run as root" 
   exit 1
fi

Optional können Sie Ihr Skript als Fallback-Benutzer (z. B. sudo -u FALLBACK_USER "$0") erneut ausführen, anstatt es einfach abzubrechen.

Der Versuch, die Macken einzelner Befehle zu beheben, macht Ihr Skript unnötig komplex und schwer zu debuggen. Jedes Mal, wenn Sie es ändern, müssen Sie alle Tests zweimal durchführen (als normaler Benutzer, dann als root) und alle auftretenden rootFehler beheben . Es ist sozusagen keine zukunftssichere Lösung.

Dmitry Grigoryev
quelle
6

Standardmäßig haben Dateien, die mit root accound erstellt wurden, folgende Berechtigungen:

-rw-r--r-- 1 root root 0 11 17 23:25 rootfile.txt

Hier gehört die Datei zum Root-Benutzer und zur Root-Gruppe und kann von root gelesen und beschrieben werden, aber nur von anderen.

Der einfachste Ansatz wäre, nur chowndie Datei an den ursprünglichen Benutzer zurückzugeben.

chown username:group_name dummy.txt

Sie können eine $SUDO_USERVariable verwenden, auf die nur zugegriffen werden kann , wenn sie sudoaufgerufen wird.

chown "$SUDO_USER":"$SUDO_USER" dummy.txt

Wenn Sie das Skript als normaler Benutzer ausführen , wird das chownTeil überhaupt nicht benötigt. Daher sollten Sie die Verwendung der if-Anweisung oder des &&Tests in Betracht ziehen, um den Fall zu testen, in dem das Skript als root ausgeführt wird, und Folgendes tun:

#!/bin/bash
touch dummy.txt
[ $UID -eq 0 ] && chown "$SUDO_USER":"$SUDO_USER" dummy.txt

Der obige Ansatz wird empfohlen. Es gibt andere, z. B. chmodzum Ändern der Lese-, Schreib- und Ausführungsberechtigungen für Benutzer und Gruppen, dies wird jedoch nicht empfohlen.

Sergiy Kolodyazhnyy
quelle
Danke für deine Antwort. Aber in QI gerade erklärt einfaches Szenario im realen Fall Original-Skript wird viele Dateien erstellen. Können wir unter Linux nicht einfach einfach sudo ignorieren?
Anonym
1
@Anonymous Wenn Sie das gesamte Skript mit ausführen sudo, dann nein - Sie können es nicht ignorieren. Sie können entweder das Skript als regulärer Benutzer ausführen (was ich nicht verstehe, warum Sie dies nicht tun, da Sie hier einfach eine Datei für Ihren Benutzer erstellen) oder den Dateibesitz ändern, wie in meiner Antwort gezeigt.
Sergiy Kolodyazhnyy
Dies ist die richtigste Lösung und sollte nicht so schwer zu skalieren sein.
Küken