sudoプレフィックスが付いていますが、フラグに基づくbashスクリプトでコマンドを実行する方法は?

sudoプレフィックスが付いていますが、フラグに基づくbashスクリプトでコマンドを実行する方法は?

私の使用例は、macOSのdockerが保護されたセキュリティモデルといくつかのHyperVisorシステムを使用しているため、sudoまたはrootアクセスが必要ないことです(ここの詳細はトピックから離れています)。一方、実際の 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

おすすめ記事