如何建立一個以 root 身分執行 yum 的腳本,但以呼叫使用者身分執行腳本的其餘部分

如何建立一個以 root 身分執行 yum 的腳本,但以呼叫使用者身分執行腳本的其餘部分

我有一個 bash 腳本,它使用 yum 安裝一些 Docker 相關的實用程序,自然 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(嚴格來說,這不會更改您的登入名,它會運行一個新的 shell)是

newgrp docker

為了解決這個問題,IE作為docker你的主要團隊,你需要以你自己的方式來管理它;假設sudo

su "${SUDO_USER}" -c "newgrp docker"

會這樣做。

請注意,以這種方式結束腳本newgrp意味著當您收到新提示時,腳本不會這樣結束;結果是

  • 當你打字時你所在的 shellsudo ./myscript.sh
    • sudo
      • 外殼正在運行myscript.sh
        • newgrp
          • shell 開始時docker作為主要組

只有當您退出由 啟動的 shell 時,該腳本才會退出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 權限才能正確執行。

相關內容