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

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

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

sudo ./myscript.sh

しかし、スクリプトが完了すると、私のユーザーはrootに変わります。これは、スクリプトの最後でこれを実行しているユーザーを次のようにDockerグループに追加したいので、これが問題になります。

groupadd docker
gpasswd -a $USER docker

したがって、スクリプトが完了すると、現在のユーザーではなくグループにルートが追加されます。これは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を使用した場合はまったく要求しません)。ただし、正しい動作のために、スクリプトはユーザーが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権限が必要です。

関連情報