So erstellen Sie ein Skript, das Yum als Root ausführt, den Rest des Skripts jedoch als aufrufender Benutzer

So erstellen Sie ein Skript, das Yum als Root ausführt, den Rest des Skripts jedoch als aufrufender Benutzer

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_USERVariable ü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

USERwenn 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 newgrpdiese 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 tippensudo ./myscript.sh
    • sudo
      • die Shell läuftmyscript.sh
        • newgrp
          • die Shell begann mit dockerder primären Gruppe

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.

verwandte Informationen