自从永远我们曾经从不同的用户 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 社区帮助另一个用户,因此只需将其替换为您的变量的名称即可。