我有一个有趣的问题我可以通过手动指定来解决这个问题PATH
。
问题是,虽然我的root
用户PATH
是:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
当我以用户身份在 NGINX/Passenger 中运行 Puppet Master 时puppet
,PATH
不知何故被设置为:
/usr/sbin:/sbin
为用户设置的环境变量在哪里PATH
?如何确保我的puppet
用户拥有正确的权限PATH
?用户没有 shell:
puppet:x:103:106::/var/lib/puppet:/bin/false
在config.ru
负责启动 Puppet Master 的 Rack 文件中,我插入了以下语句来查看PATH
用户puppet
正在运行的内容:
puts "PATH: " + ENV.fetch('PATH', 'null')
输出为PATH: null
,因此PATH
当 Passenger 运行时根本没有设置环境变量。
我正在运行 Ubuntu 14.04 amd64 的 Docker 容器中工作。
答案1
一般来说linuxPATH
通过读取点文件来设置环境变量。当您登录时,/etc/profile
会被读取。设置默认环境变量后,它会读取.shell_profile
例如.bash_profile
.如果这个点文件不存在,那么它会尝试读取.bash_login
,如果也不存在,它将查找.profile
.
让我们回到问题上来。用户puppet
没有 shell 或不容纳上述文件。您只需执行即可检查它echo "$SHELL" && echo "$PATH"
。
您可以PATH
使用点文件之一手动设置或查看以下内容:http://www.puppetcookbook.com/posts/set-global-exec-path.html
答案2
正如它所说在 NGINX 文档中:
默认情况下,nginx 会删除从其父进程继承的所有环境变量(TZ 变量除外)。
我的具体问题的解决方法可以通过几种不同的方式来实现。
解决方法 1:在 Ruby 中附加 PATH 变量
通过编辑config.ru
文件,我们可以简单地定义PATH
它(如果尚未定义):
if not ENV['PATH']
ENV['PATH'] = "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
end
这很简单并且解决了问题,但是隐藏在您可能永远不会再看的配置中。
解决方法 2:在 NGINX 中设置 PATH 变量
通过在 NGINX 站点配置中设置PATH
变量,我们对问题有了更“立即可见”的解决方案:
server {
listen 8140 ssl default_server;
# ...
# manually set PATH for Passenger; see PUP-3000
env PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
passenger_enabled on;
# ...
}