我正在编写一个应该使用 sudo 权限运行的脚本。但是然后我需要从另一个用户那里执行一个命令,其中.bash_rc
有一些环境变量被重载,然后在命令中使用它。
例如。我需要PATH
为用户打印变量:
sudo -s -u ${USER_NAME} source ~/.bash_rc; echo $PATH
但它会PATH
为运行脚本的用户打印。我还尝试了很多其他选项(使用su
或传递 rcfile),但似乎都不起作用。
我该如何处理呢?
答案1
您有一个sudo
获取脚本的命令。您还有一个打印 的命令$PATH
。两者在其他方面是无关的。
也许你的意思是这样的:
sudo -u "${USER_NAME}" bash -c 'source ~/.bash_rc; echo $PATH'
不能-s
与复合命令一起使用,但可以与包含两个(或更多)命令的脚本一起使用:
cat >/opt/bin/show_me_the_path <<'X'
#!/bin/bash
source ~/.bash_rc
echo $PATH
X
chmod a+x /opt/bin/show_me_the_path
sudo -u "${USER_NAME}" -s /opt/bin/show_me_the_path
但即使这样也没什么意义,因为脚本强制使用自己的 shell ( /bin/bash
)。总之,最好重新考虑一下这个-s
标志。
答案2
您可以将其执行为:
sudo su - ${USER_NAME} -c 'source ~/.bash_rc; echo $PATH'
它运行的一个例子。用户“zippy”有一个 ~/.bash_rc 文件。请注意,这是标准 ~/.bashrc 文件的补充。用户执行命令“bschuck”则不会。 ~zippy/.bash_rc 文件包含:
#!/bin/bash
# .bash_rc
PATH=$PATH:/this/is/a/dummy/path
执行此命令有效:
bschuck@valhalla:~$ sudo su - zippy -c 'source ~/.bash_rc; echo $PATH'
/home/zippy/bin:/home/zippy/.local/bin:\
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/snap/bin:\
/this/is/a/dummy/path
然而,此命令不会保留来自 ~zippy/.bash_rc 文件的新 PATH:
bschuck@valhalla:~$ sudo -i -u zippy bash -c 'source ~/.bash_rc; echo $PATH'
/home/zippy/bin:/home/zippy/.local/bin:/usr/local/sbin:\
/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:\
/snap/bin
如果您需要运行多个命令,最好将它们放入脚本中,正如我昨天在对我的答案的评论中建议的那样。