
Docker 관련 유틸리티를 설치하기 위해 yum을 사용하는 bash 스크립트가 있는데 당연히 yum에는 sudo 액세스가 필요합니다. 그래서 다음을 통해 스크립트를 실행합니다.
sudo ./myscript.sh
그러나 스크립트가 완료되면 내 사용자가 루트로 변경됩니다. 스크립트 끝에서 이를 실행하는 사용자를 다음을 통해 Docker 사용자 그룹에 추가하기를 원하기 때문에 이것이 나에게 문제가 됩니다.
groupadd docker
gpasswd -a $USER docker
따라서 스크립트가 완료될 때 현재 사용자 대신 그룹에 루트가 추가됩니다. 이는 sudo로 실행하기 때문이라고 생각합니다.
스크립트를 sudo로 실행하지만 현재 사용자의 로그인을 유지할 수 있습니까? 내가 이해한 바로는 스크립트 내에서 sudo를 사용하는 것은 일반적으로 좋은 생각이 아닙니다.
스크립트는 다음과 같습니다(아래 답변 후에 편집됨).
#!/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"
답변1
SUDO_USER
변수를 확인하여 스크립트가 실행되고 있는지 확인할 수 있습니다 .~을 통해 sudo
, 그렇다면 어떤 사용자가 실행했는지. 그런 다음 다음에서 사용합니다 gpasswd
.
gpasswd -a "${SUDO_USER}" docker
또는
gpasswd -a "${SUDO_USER-$USER}" docker
USER
가 없을 때 로 돌아가려는 경우 SUDO_USER
.
다음으로 로그인하게 만드는 명령 root
(엄격히 말하면 로그인이 변경되지 않고 새 쉘이 실행됨)은 다음과 같습니다.
newgrp docker
그 문제를 해결하려면,즉결국 당신 자신이 docker
기본 그룹이 된다면, 당신 스스로 그것을 운영해야 합니다. 가정하고 sudo
,
su "${SUDO_USER}" -c "newgrp docker"
이것을 할 것입니다.
이런 방식 으로 스크립트를 종료한다는 것은 newgrp
새 프롬프트가 표시될 때 스크립트가 종료되지 않는다는 것을 의미합니다. 결과는
- 입력할 때 있는 쉘
sudo ./myscript.sh
sudo
- 실행중인 쉘
myscript.sh
newgrp
docker
기본 그룹 으로 시작된 쉘
- 실행중인 쉘
스크립트는 에 의해 시작된 셸을 종료할 때만 종료됩니다 newgrp
.
답변2
sudo를 사용하는 것이 일반적으로 좋은 습관으로 간주되고 특히 수동으로 실행해야 하는 짧은 스크립트 내에서 사용하는 것이 논리 또는 유지 관리를 단순화하고 원하는 목표를 달성한다면 스크립트 내에서 sudo를 사용한다고 말할 수 있습니다. 바람직하지 않더라도 적절합니다.
스크립트 내에서 sudo를 사용하고 일반 사용자로 스크립트를 실행할 수 있습니다. 호출된 sudo는 일반적으로 비밀번호를 한 번만 요청합니다(또는 사용자가 최근에 sudo를 사용한 경우에는 전혀 요청하지 않음). 그러나 적절한 동작을 위해 스크립트는 사용자가 루트로 스크립트를 실행하지 못하도록 해야 합니다.
# 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
여기서 $USER 변수는 일반 사용자에 해당하므로 gpasswd의 예상 인수로 삽입됩니다.
이 예제는 일반 사용자로 실행됩니다. sudo가 아닙니다. 그러나 제대로 실행하려면 사용자에게 sudo 권한이 있어야 합니다.