httpd执行的bash脚本不读取用户环境变量

时间:2018-01-18 22:03:36

标签: bash apache amazon-ec2

我们有一个由httpd作为默认ec2-user执行的脚本。但是,执行时脚本没有看到该用户的任何环境变量

该变量在用户ec2-user

下设置
myUseVarHome=/home/ec2-user

myScript.sh

#!/bin/bash
myFolder="${myUseVarHome}/test/www"
USER=$(whoami)
echo "Content-type: text/html"
echo ""
echo "hello $USER"
echo "myFolder=$myFolder"

执行脚本ec2-user输出

hello ec2-user
myFolder=/home/ec2-user/test/www

然后我们设置httpd 2.4 conf

<IfModule unixd_module>
    User ec2-user
    Group ec2-user
</IfModule>

现在用

调用脚本
wget 127.0.0.1/myScript.sh

输出

hello ec2-user
myFolder=/test/www

输出验证httpd用户为ec2-user,与手动执行脚本相同,但env变量${myUseVarHome}为空或不存在。

这是预期的行为还是我们需要在以httpd用户身份执行时以另一种方式调用env变量?

1 个答案:

答案 0 :(得分:1)

无论是 shell 还是普通的编程语言(如bashperl),

python的行为都不同。 / p>

根据设计,~/.bash_profile~/.bashrc等中的设置可供用户在bash播放外壳的滚动时设置内容(登录壳,相互作用壳)。考虑一下xterm(交互式shell)或ssh会话(登录shell)或控制台(登录shell)中的环境。

另一方面,bash也是一种强大的编程语言 - 关于用于管理systemd中的服务的许多脚本的思考 - 这需要不同的工作方式。例如,当开发人员编写系统脚本或bash程序时,他/她不太可能自动获取用户定义的~/.bash_profile。这是一个普通的程序,而不是shell。正常程序(包括bash程序)在当前工作的evironement(shell)中自然会 inherrit 设置,但不会设置

如果我们在cron中为bash编写一个程序,那么它恰好用bash写成;事实上,我们可以用pythonperl或任何其他编程语言编写它 - 然后,我们可以选择bash的{​​{1}}来源(阅读:用户shell的设置,恰好与编程语言的语言相同):

~/.bash_profile

但是,如果该特定用户不使用[ -f /home/user/.bash_profile ] && . /home/user/.bash_profile 作为他/她的shell,该怎么办?他/她可能会使用bash,'ksh zsh fish`等等。因此,在编写程序供公众使用时,这种做法并不真正有效。

因此,如果您认为有效,可以提供,。但是,在这里,它不是关于我们是否能够获取文件,而是关于事物应该如何在系统中起作用:设计概念。简而言之:我们应该将~/.bash_profile视为具有2个卷的内容:shell和编程语言。然后一切都会清晰,易于理解。

请参阅:How to change cron shell sh to bash