如何在以 sudo 为前缀但基于标志的 bash 脚本中运行命令?

如何在以 sudo 为前缀但基于标志的 bash 脚本中运行命令?

我的用例是,macOS 上的 docker 不需要 sudo 或 root 访问权限,因为它使用受保护的安全模型和一些 HyperVisor 系统(此处的详细信息与主题无关),而在具有真正的 Linux 内核和 cgroup 的基于 Linux 的系统上,docker 需要sudo或以其他方式root访问运行容器和命令。

我想写一个相当可移植脚本,可以正确检测环境,并在sudo需要时运行所有 docker 命令,或者在不需要时不运行所有 docker 命令。

实现这一目标的最佳方法是什么?

我想一种解决方案是直接docker在脚本中使用,Linux 用户需要运行sudo ./script.sh,而 macOS 用户可以只运行./script.sh,但所有包含的命令都将在 root 下运行——例如 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_OS01因此检测操作系统在这里并不重要。

答案1

在 Linux 系统上,对 Docker 的访问通常是在一个docker组后面进行的,该组对 Docker 套接字具有写访问权限:

% 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

相关内容