
我有一個 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
意味著當您收到新提示時,腳本不會這樣結束;結果是
- 當你打字時你所在的 shell
sudo ./myscript.sh
sudo
- 外殼正在運行
myscript.sh
newgrp
- shell 開始時
docker
作為主要組
- shell 開始時
- 外殼正在運行
只有當您退出由 啟動的 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 權限才能正確執行。