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 sudo
in meinem Skript zu vermeiden, habe ich beschlossen, sudo
vor 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
, wget
und …
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 mkdir
oder wget
mit Superuser-Berechtigungen auszuführen?
Antwort1
Wenn Sie verwenden sudo
, starten Sie eine neue Shell als der Benutzer, sudo
zu dem Sie wechseln möchten (standardmäßig root). Dadurch wird die SUDO_USER
Variable 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 wget
und chmod
alle anderen Befehle, die Sie als normaler Benutzer im Skript ausführen möchten, und lassen Sie sie mit ausführen, sudo -u $SUDO_USER
sodass 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_USER
Variable 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 mkdir
den 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 wget
den chmod
Befehl 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'