sudo 접두사가 붙었지만 플래그를 기반으로 하는 bash 스크립트에서 명령을 실행하는 방법은 무엇입니까?

sudo 접두사가 붙었지만 플래그를 기반으로 하는 bash 스크립트에서 명령을 실행하는 방법은 무엇입니까?

내 사용 사례는 macOS의 docker가 보호된 보안 모델과 일부 HyperVisor 시스템을 사용하기 때문에 sudo 또는 루트 액세스가 필요하지 않다는 것입니다(여기서의 세부 정보는 주제에서 벗어남). 반면 실제 Linux 커널과 cgroup이 있는 docker에서는 Linux 기반 시스템에서 docker는 컨테이너 및 명령을 실행하기 위해 액세스가 필요 sudo하거나 액세스 권한이 있습니다.root

하나 쓰고 싶다상당히환경을 올바르게 감지하고 sudo필요할 때 모든 docker 명령을 실행하거나 필요하지 않을 때는 실행하지 않는 이식 가능한 스크립트입니다.

이를 달성하는 가장 좋은 방법은 무엇입니까?

내 생각에 해결책은 docker스크립트에서 직접 사용하는 것입니다. Linux 사용자는 이를 실행해야 sudo ./script.sh하고 macOS 사용자는 그냥 실행할 수 있지만 ./script.sh포함된 모든 명령은 mkdir, 파일 생성 등 루트에서 실행됩니다. 가장 깨끗한 방법은 아닌 것 같습니다.

내가 찾고 있는 것의 예:

$sudo_or_not docker run -d nginx
$sudo_or_not docker ps | grep nginx

아니면 어쩌면

run_docker_command("docker run -d nginx")
run_docker_command("docker ps | grep nginx")

하지만 bash에서 이와 같은 작업을 수행하는 방법을 모르겠습니다. 이미 $IS_MAC_OS또는 0같은 변수가 있으므로 1여기서는 운영 체제를 감지하는 것이 중요하지 않다고 가정해 보겠습니다 .

답변1

Linux 시스템에서 Docker에 대한 액세스는 일반적으로 dockerDocker 소켓에 대한 쓰기 액세스 권한이 있는 그룹 뒤에 있습니다.

% stat /var/run/docker.sock
  File: /var/run/docker.sock
  Size: 0           Blocks: 0          IO Block: 4096   socket
Device: 17h/23d Inode: 831         Links: 1
Access: (0660/srw-rw----)  Uid: (    0/    root)   Gid: (  999/  docker)
Access: 2019-12-03 15:41:42.633241981 +0900
Modify: 2019-11-28 15:49:03.877925150 +0900
Change: 2019-11-28 15:49:03.877925150 +0900
 Birth: -

이 그룹의 구성원인 사용자는 명령을 sudo실행할 필요가 없습니다.docker


그러나 다음과 같이 래퍼 함수를 ​​사용할 수 있습니다.

if [[ $IS_MAC_OS = 1 ]]
then
    sudo_or_not () {
        "$@"  # just run the arguments
    }
else
    sudo_or_not () {
        sudo "$@"  # run the arguments with sudo
    }
fi

sudo_or_not docker run foo/bar

아니면 직접 포장해 보세요 docker.

if [[ $IS_MAC_OS = 1 ]]
then
    docker () {
        command docker "$@"  # just run the actual docker command with arguments
    }
else
    docker () {
        sudo docker "$@"  # run docker with sudo
    }
fi

docker run foo/bar

관련 정보