如何访问脚本中 sudo/EOF 子句内的脚本变量和环境变量......BASH

如何访问脚本中 sudo/EOF 子句内的脚本变量和环境变量......BASH

问题:

我一直在努力解决这个cp总是给出错误的问题,因为变量不存在......

这是我的代码:

if [ ! -z "$USER1" ]
then
     sudo -u "$USER1" bash <<'EOF'
     sleep 5
     BASHRC=.bashrc
     cp "$BASHRC" "$HOME"/.bashrc
     sleep 5
     wget https://raw.github.com/trapd00r/LS_COLORS/master/LS_COLORS -O "$HOME"/.dircolors
     sleep 5
     echo 'eval $(dircolors -b $HOME/.dircolors)' >> "$HOME"/.bashrc
     . "$HOME"/.bashrc
     sleep 5
     echo "Here is LS_COLORS in action: "
     ls -l "$HOME"
EOF
fi

问题:

如何使我的脚本变量和环境变量可以在 sudo 子句中访问(有很多)?

是 sudo 还是here-document 有这个问题?

编辑:

删除 EOF 上的引号给我带来了以前的问题:

./testing3892739.sh billy
cp: failed to access '/root/.bashrc': Permission denied

编辑2:

现在脚本看起来像这样......

    if [ ! -z "$USER1" ]
108 then
109     sudo -i -u "$USER1" bash <<'EOF'
110     sleep 5
111     cp -f .bashrc "$HOME"/.bashrc
112     sleep 5
113     wget https://raw.github.com/trapd00r/LS_COLORS/master/LS_COLORS -O "$HOME"/.dircolors
114     sleep 5
115     echo 'eval $(dircolors -b $HOME/.dircolors)' >> "$HOME"/.bashrc
116     . "$HOME"/.bashrc
117     sleep 5
118     echo "Here is LS_COLORS in action: "
119     ls -l "$HOME"
120 EOF
121 fi

切换-isudo最后一个问题产生了影响......但像往常一样,现在一段时间了,还有许多不同的错误,cp给出了一个错误现在是

cp: '.bashrc' and '/home/billy/.bashrc' are the same file

该文件存在,但我需要将其覆盖。

我只是希望我的脚本从当前的cp隐藏文件可以在任何地方,因为这是脚本所在的目录和更新服务器所需的文件,如果存在,则将其写入并覆盖。.bashrcdir$HOME

答案1

因此(基于注释)您想要.bashrc引用sudo调用目录中的文件;而是$HOME扩展到目标用户的主目录。我思考这样做的方法是使用-H

 -H, --set-home
             Request that the security policy set the HOME environment
             variable to the home directory specified by the target user's
             password database entry.  Depending on the policy, this may
             be the default behavior.

为了显示:

$ sudo -Hu testuser bash -c 'echo \$PWD = $PWD; echo \$HOME = $HOME' 
$PWD = /home/steeldriver/forums/tests
$HOME = /home/testuser

而“常规”sudo $HOME解析为调用用户的解析

$ sudo -u testuser bash -c 'echo \$PWD = $PWD; echo \$HOME = $HOME'
$PWD = /home/steeldriver/forums/tests
$HOME = /home/steeldriver

当登录 shell$HOME解析为目标用户的登录 shell 时 - 但工作目录也会发生变化:

$ sudo -iu testuser bash -c 'echo \$PWD = $PWD; echo \$HOME = $HOME'
/home/testuser = /home/testuser
/home/testuser = /home/testuser

两者在您的应用程序中都不是很有用。

请记住,这sudo是完全可配置的,并且默认行为可能会有所不同,具体取决于您的 Unix/Linux 的具体风格和发行版。

答案2

您正在使用<<'EOF'。如果您<<EOF不带引号使用,您的 shell 将扩展变量。如果您不希望 shell 扩展某些变量,请用 引用它们\$

相关内容