在 bash 4.3.27 中,“su”在将“-”与“-c 命令”结合时会忽略用户变量?

在 bash 4.3.27 中,“su”在将“-”与“-c 命令”结合时会忽略用户变量?

自从永远我们曾经从不同的用户 crontab 启动用户脚本,如下所示:

00 12 * * 1 su - user2 -c "/home/user2/myscript.sh"

通过这样做,脚本将在交互式 shell 加载 ~/.bash_profile 后启动。

然而,由于“shellshock”漏洞,我们最近已将 Bash 修补至 4.3.27 版本,并且该功能不再起作用。

我们仍然有旧 bash 的副本,所以我们可以测试这个问题:

[root ~]$ /bin/bash --version
GNU bash, versión 4.3.30(1)-release (x86_64-unknown-linux-gnu)

[root ~]$ /bin/bash.old --version
GNU bash, versión 4.1.2(1)-release (x86_64-redhat-linux-gnu)

[root ~]$ echo "export MYNEWVAR=helo" >> /home/usertest/.bash_profile

[root ~]$ su -s /bin/bash - usertest -c "env | grep MYNEWVAR"
[root ~]$ su -s /bin/bash.old - usertest -c "env | grep MYNEWVAR"
MYNEWVAR=helo

这是预期的行为吗?还是我们忘记启用配置编译 bash 的步骤?

问候。

答案1

自降级投票以来已更新,所以如果这能纠正问题,就像当我使用虚拟机和 arch 时一样,请投票,这样我就可以删除 -1。

如果您的系统使用 SUDO,请参见下面的后半部分...

对于仅使用 SU 的系统:

在某些系统中,它可以被别名化,因此即使你使用 su,它也会自动使用 su - 强制使用新用户的 bashrc 中的变量

查看您个人用户的 bash.rc 中下面提到的别名并将其删除。这应该会阻止它尝试使用 root 用户的设置变量。

页:https://wiki.archlinux.org/index.php/su
相关位:

因此,管理员通常应按如下方式使用 su:

$ su -

通过添加用户名 root 可以产生相同的结果:

$ su - root

同样,也可以对任何其他用户执行相同的操作(例如,名为 archie 的用户):

# su - archie

您可能希望为此向 ~/.bashrc 添加一个别名:

alias su="su -"

对于 SUDO 系统

这是因为 sudo 配置。我使用以下问题/答案来帮助我:https://askubuntu.com/questions/128413/setting-the-path-so-it-applies-to-all-users- including-root-sudo

基本上:

手册页指出sudoers

   env_reset       If set, sudo will reset the environment to only contain
                   the LOGNAME, MAIL, SHELL, USER, USERNAME and the SUDO_*
                   variables.  Any variables in the caller's environment
                   that match the env_keep and env_check lists are then
                   added.  The default contents of the env_keep and
                   env_check lists are displayed when sudo is run by root
                   with the -V option.  If the secure_path option is set,
                   its value will be used for the PATH environment
                   variable.  This flag is on by default.

解决方法如下:

因此,您可以在使用 sudo 时执行以下操作来维护变量

sudo visudo

这将为您打开 sudo 设置。然后按照我所做的操作,在下面添加以下内容

Defaults secure_path="blah"

Defaults env_keep +="VARIABLE VARIABLE VARIABLE"

(不包括由 secure_path 设置的 PATH)并且如果您希望维护多个变量,则这些只是每个变量之间的单个空格。

它的作用是告诉 sudo 保留哪些环境变量而不是忽略哪些环境变量。

完成后,按住 ctrl 并按 o 进行写出,按 Enter 并说“是”进行保存 [即使它指定了一个 tmp 文件,这也没关系,它将被写回到主配置,当询问是否要覆盖时只需说“是”]。

这应该允许您维护您想要的任何变量(一个重要的变量是JAVA_HOME,如果您使用代理,还有http_proxy)。

因此它应该看起来类似于下面,包括您指定的变量:

Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin/bin"
Defaults        env_keep +="GRAILS_HOME"

并验证是否需要退出所有打开的终端窗口并重新打开一个并运行

echo $GRAILS_HOME 

它应该是你设置的,现在发出

sudo echo $GRAILS_HOME

现在它应该保持不变。

Grails_home 参考来自我在 ubuntu 社区帮助另一个用户,因此只需将其替换为您的变量的名称即可。

相关内容