![如何访问脚本中 sudo/EOF 子句内的脚本变量和环境变量......BASH](https://linux22.com/image/138789/%E5%A6%82%E4%BD%95%E8%AE%BF%E9%97%AE%E8%84%9A%E6%9C%AC%E4%B8%AD%20sudo%2FEOF%20%E5%AD%90%E5%8F%A5%E5%86%85%E7%9A%84%E8%84%9A%E6%9C%AC%E5%8F%98%E9%87%8F%E5%92%8C%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F......BASH.png)
问题:
我一直在努力解决这个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
切换-i
对sudo
最后一个问题产生了影响......但像往常一样,现在一段时间了,还有许多不同的错误,cp
给出了一个错误现在是
cp: '.bashrc' and '/home/billy/.bashrc' are the same file
该文件存在,但我需要将其覆盖。
我只是希望我的脚本从当前的cp
隐藏文件可以在任何地方,因为这是脚本所在的目录和更新服务器所需的文件,如果存在,则将其写入并覆盖。.bashrc
dir
$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 扩展某些变量,请用 引用它们\$
。