在脚本中运行 su 时获取 .bash_rc 源

在脚本中运行 su 时获取 .bash_rc 源

我正在编写一个应该使用 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

如果您需要运行多个命令,最好将它们放入脚本中,正如我昨天在对我的答案的评论中建议的那样。

相关内容