Bash

sudo -u 沒有在 $HOME/.profile 中附加路徑

  • January 23, 2018

我有需要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

我可以想到兩個可供您選擇的明智選擇:

  1. 您可以告訴 sudo 使用登錄 shell
  2. 您可以使用 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

引用自:https://unix.stackexchange.com/questions/418979