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