yum을 루트로 실행하고 나머지 스크립트는 사용자를 호출하는 스크립트를 만드는 방법

yum을 루트로 실행하고 나머지 스크립트는 사용자를 호출하는 스크립트를 만드는 방법

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 권한이 있어야 합니다.

관련 정보