yum を root として実行し、スクリプトの残りを呼び出しユーザーとして実行するスクリプトを作成する方法

yum を root として実行し、スクリプトの残りを呼び出しユーザーとして実行するスクリプトを作成する方法

yum を使用して Docker 関連のユーティリティをインストールする bash スクリプトがあり、当然 yum には sudo アクセスが必要です。そのため、次のようにスクリプトを実行します。

sudo ./myscript.sh

しかし、スクリプトは実行後にユーザーを root に変更してしまいます。これは私にとっては問題です。スクリプトの最後で、それを実行しているユーザーを Docker ユーザーグループに追加したいからです。

groupadd docker
gpasswd -a $USER docker

したがって、スクリプトが終了するまでに、現在のユーザーではなく root がグループに追加されます。これは、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 は通常、パスワードを 1 回だけ要求します (ユーザーが最近 sudo を使用したことがある場合は、パスワードを要求しません)。ただし、スクリプトが適切に動作するために、ユーザーが root として実行できないようにする必要があります。

# 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 権限を持っている必要があることに注意してください。

関連情報