Verhindern Sie, dass einige Befehle mit Superuser-Berechtigungen ausgeführt werden

Verhindern Sie, dass einige Befehle mit Superuser-Berechtigungen ausgeführt werden

Ich bin neu bei Bash. Ich habe ein Skript geschrieben, das aus vielen Zeilen und Befehlen besteht. Dies ist eine Setup-Datei zum Abrufen und Installieren mehrerer Pakete. Daher muss ich in meinem Skript viele Installationsbefehle verwenden, wie diesen Befehl:

sudo apt install python2.7 python-pip

Um die Verwendung so vieler sudoin meinem Skript zu vermeiden, habe ich beschlossen, sudovor jedem Befehl zu entfernen und das Skript wie folgt auszuführen sudo ./setup.sh.

Es funktioniert gut, aber das Problem besteht darin, dass vor einigen Befehlen eigentlich nichts stehen muss sudo, wie z. B. mkdir, wgetund …

Wenn ich mein Skript mit ausführe sudo ./setup.sh, können die mit diesem Skript erstellten Verzeichnisse nicht ohne die Verwendung von entfernt, kopiert oder bearbeitet werden sudo. Ich wollte jedoch, dass sie für alle Benutzer zugänglich sind. Daher lautet meine Frage:

Gibt es beim Ausführen eines Skripts mit sudo (wie sudo ./setup.sh) eine Möglichkeit, einige seiner internen Befehle nicht mit mkdiroder wgetmit Superuser-Berechtigungen auszuführen?

Antwort1

Wenn Sie verwenden sudo, starten Sie eine neue Shell als der Benutzer, sudozu dem Sie wechseln möchten (standardmäßig root). Dadurch wird die SUDO_USERVariable auf den Benutzernamen dieses Benutzers gesetzt:

$ cat foo.sh
#!/bin/bash
echo "SUDO_USER: $SUDO_USER"

Wenn ich dieses Skript als ich selbst ausführe, erhalte ich nichts, da die Variable nicht festgelegt ist:

$ foo.sh
SUDO_USER: 

Aber wenn ich es mit ausführe sudo, wird die Variable gesetzt:

$ sudo foo.sh
SUDO_USER: terdon

In diesem Sinne können Sie die spezifischen Befehle, die Sie als normaler Benutzer ausführen möchten, einfach mit dem Benutzernamen des Benutzers ausführen, der das Skript startet. Ändern Sie also Ihre wgetund chmodalle anderen Befehle, die Sie als normaler Benutzer im Skript ausführen möchten, und lassen Sie sie mit ausführen, sudo -u $SUDO_USERsodass sie als normaler Benutzer und nicht als Root ausgeführt werden:

apt install python2.7 python-pip ## will run as root
sudo -u $SUDO_USER mkdir foo ## will run as $SUDO_USER

Durch die Verwendung der SUDO_USERVariable wird sichergestellt, dass alle von Ihnen erstellten Verzeichnisse und Dateien dem Benutzer gehören, der das Skript gestartet hat, und Sie Ihrem Skript den Namen dieses Benutzers nicht bei jeder Ausführung explizit mitteilen müssen.

Antwort2

Damit die von mkdir erstellten Verzeichnisse von allen Benutzern verwendet werden können, müssen Sie die Berechtigung mit dem Befehl chmod in „WORLD lesbar/schreibbar“ ändern.

Geben Sie im Skript nach der Ausführung mkdirden folgenden Befehl ein:

chmod -R 755  «directory-name»

(Für alle lesbar, nur von Root beschreibbar)

oder

chmod -R 777  «directory-name» 

(Von allen Benutzern im System lesbar und auch beschreibbar)

Verwenden Sie dazu wgetden chmodBefehl nach dem Herunterladen.

ODER

Wenn Sie den Befehl dennoch als anderer Benutzer ausführen möchten, verwenden Sie den Befehl su:

su - «username» -c 'command to be executed'

verwandte Informationen