sudo -u 沒有在 $HOME/.profile 中附加路徑
我有需要root權限的腳本。我使用
sudo ./script.sh
. 腳本的某些部分需要以原始使用者身份實際執行,所以我sudo --user=$SUDO_USER
在腳本內部使用來完成這項工作。我遇到的問題是我為使用者安裝了一些實用程序,並且它們的路徑附加到我的~/.profile
. 我感覺 ~/.profile 在以 sudo 執行時沒有執行,由sudo --user=$SUDO_USER echo $PATH
.我可以通過採購 $HOME/.profile 來解決這個問題,但這似乎不是正確的解決方案:
sudo --user=$SUDO_USER source $HOME/.profile; command_i_want_to_run
我是否應該將我的 $PATH 附加到不同的文件中,以便無論上下文如何都可以使用它?
未獲取或類似配置文件的原因
bashrc
是 sudo 不執行 shell。它實際上分叉了這個過程並做了一些其他的事情——所以它根本不一定與 shell 相關。Process model
如果您想更詳細地閱讀此內容,請在中搜尋man sudo
。我可以想到兩個可供您選擇的明智選擇:
- 您可以告訴 sudo 使用登錄 shell
- 您可以使用 sudo 執行 bash 並告訴 bash 作為登錄 shell
兩者以略微不同的方式實現相同的目標。
選項 1:
sudo --user=baam -i echo '$PATH'
將告訴 sudo 啟動預設 shellbaam
並執行echo $PATH
. 注意原始命令中的引號$PATH
,否則它將在bash 看到它之前被擴展。選項 2:
sudo --user=baam bash -c -l 'echo $PATH'
將使用 sudo 執行 bash。該-l
標誌告訴 bash 充當登錄 shell,因此它將 source.profile
。我認為這是更好的解決方案,因為您還可以指定另一個支持該-l
標誌的 shell,例如zsh
,因此您整體上更加靈活。
我不確定它是否取決於本地 sudoers 策略,但至少在我的 Ubuntu 系統上,您可以使用 sudo
-i
或--login
選項來指定登錄 shell:-i, --login Run the shell specified by the target user's password data‐ base entry as a login shell. This means that login-specific resource files such as .profile or .login will be read by the shell.
所以例如
$ sudo sudo -u steeldriver sh -c 'echo $PATH' [sudo] password for steeldriver: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
但
$ sudo sudo -iu steeldriver sh -c 'echo $PATH' /home/steeldriver/bin:/home/steeldriver/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin