
Ich habe ein Bash-Skript, das Yum verwendet, um einige Docker-bezogene Dienstprogramme zu installieren, und natürlich benötigt Yum Sudo-Zugriff. Also führe ich das Skript über Folgendes aus:
sudo ./myscript.sh
Aber das Skript ändert meinen Benutzer am Ende in „root“. Das ist ein Problem für mich, weil ich möchte, dass der Benutzer, der es ausführt, am Ende des Skripts zur Docker-Benutzergruppe hinzugefügt wird, und zwar über:
groupadd docker
gpasswd -a $USER docker
Wenn das Skript fertig ist, fügt es der Gruppe Root und nicht den aktuellen Benutzer hinzu. Ich nehme an, das liegt daran, dass ich es mit sudo ausführe.
Ist es möglich, ein Skript mit sudo auszuführen, aber die Anmeldung des aktuellen Benutzers beizubehalten? So wie ich es verstehe, ist es im Allgemeinen keine gute Idee, sudo in Skripten zu verwenden.
Hier ist das Skript (bearbeitet nach den Antworten unten):
#!/bin/bash
yum remove docker \
docker-common \
container-selinux \
docker-selinux \
docker-engine
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
yum makecache fast
yum install docker-ce
systemctl start docker
groupadd docker
groupadd docker
gpasswd -a "${SUDO_USER}" docker
su "${SUDO_USER}" -c "newgrp docker"
Antwort1
Sie können die SUDO_USER
Variable überprüfen, um festzustellen, ob das Skript ausgeführt wirdüber sudo
, und wenn ja, welcher Benutzer es ausgeführt hat. Dann verwenden Sie das einfach in gpasswd
:
gpasswd -a "${SUDO_USER}" docker
oder
gpasswd -a "${SUDO_USER-$USER}" docker
USER
wenn Sie bei Abwesenheit von auf zurückgreifen möchten SUDO_USER
.
Der Befehl, der Sie dazu veranlasst, sich als anzumelden root
(genau genommen ändert dies nicht Ihre Anmeldung, sondern führt eine neue Shell aus), lautet
newgrp docker
Um das zu beheben,dhals Sie selbst mit als primäre Gruppe enden docker
, müssen Sie dies als Sie selbst ausführen; vorausgesetzt sudo
,
su "${SUDO_USER}" -c "newgrp docker"
werde das tun.
Beachten Sie, dass das Beenden Ihres Skripts auf newgrp
diese Weise bedeutet, dass Ihr Skript nicht als solches endet, wenn Sie eine neue Eingabeaufforderung erhalten; das Ergebnis ist
- die Shell, in der Sie sich befinden, wenn Sie tippen
sudo ./myscript.sh
sudo
- die Shell läuft
myscript.sh
newgrp
- die Shell begann mit
docker
der primären Gruppe
- die Shell begann mit
- die Shell läuft
Das Skript wird erst beendet, wenn Sie die von gestartete Shell beenden newgrp
.
Antwort2
Wenn die Verwendung von sudo im Allgemeinen als gute Vorgehensweise gilt und wenn die Verwendung – insbesondere innerhalb eines kurzen Skripts, das manuell ausgeführt werden soll – die Logik oder Wartung vereinfacht und das gewünschte Ziel erreicht, dann würde ich sagen, dass die Verwendung von sudo innerhalb eines Skripts angemessen, wenn nicht sogar vorzuziehen ist.
Es ist möglich, sudo innerhalb des Skripts zu verwenden und das Skript als normaler Benutzer auszuführen. Das aufgerufene sudo fragt normalerweise nur einmal nach einem Passwort (oder überhaupt nicht, wenn der Benutzer sudo kürzlich verwendet hat). Für ein ordnungsgemäßes Verhalten sollte das Skript jedoch verhindern, dass ein Benutzer es als Root ausführt.
# This should not be run as root (or using 'sudo')
if [ "$(/usr/bin/id -u)" == "0" ] ; then
echo "This script cannot be run as root (or using 'sudo')!" 1>&2
exit 1
fi
# Use sudo per command here
sudo groupadd docker
sudo gpasswd -a $USER docker
Da die Variable $USER hier dem normalen Benutzer entspricht, würde sie als erwartetes Argument für gpasswd eingefügt.
Dieses Beispiel wird als normaler Benutzer ausgeführt, nicht als sudo. Beachten Sie jedoch, dass der Benutzer für die ordnungsgemäße Ausführung über sudo-Berechtigungen verfügen muss.