标签: environment-variables

/etc/environment 中的环境变量用磅(哈希)符号表示值

在 Ubuntu 12.04 上,我定义了一个环境变量,/etc/environment如下所示:

FOO="value_before#value_after"
Run Code Online (Sandbox Code Playgroud)

当我通过 ssh 进入服务器检查值时,我得到了这个:

$ env | grep FOO
FOO=value_before
Run Code Online (Sandbox Code Playgroud)

我猜它正在将#视为评论并将其剥离,但是,这有效:

$ . /etc/environment
$ export FOO
$ env | grep FOO
FOO=value_before#value_after
Run Code Online (Sandbox Code Playgroud)

我试过这样逃避#

FOO="value_before\#value_after"
Run Code Online (Sandbox Code Playgroud)

但这不起作用,我只是得到了这个:

FOO=value_before\
Run Code Online (Sandbox Code Playgroud)

关于如何使散列被视为值的一部分的任何想法?任何帮助都会很棒。

我在/etc/environment文件中尝试过的值:

FOO='value_before#value_after'
FOO="value_before#value_after"
FOO='"value_before#value_after"'
FOO="value_before\#value_after"
FOO='value_before\#value_after'
Run Code Online (Sandbox Code Playgroud)

以及上述的其他各种组合。当您通常在 shell 中设置它们时,其中的很多都将起作用。但它们似乎在/etc/environment文件中不起作用。

ubuntu environment-variables

10
推荐指数
1
解决办法
5142
查看次数

你如何在 Nginx 中设置特定于服务器的 ENV 值?

我正在启动一个项目,该项目使用环境变量来设置数据库连接和其他一些事情。(他们不想使用配置文件,因为人们粗心大意并覆盖了它们)。

无论如何,我正在使用 nginx,虽然它支持 env - 它似乎并没有很好支持它。您不能在每个服务器块的基础上设置 env 值。换句话说,这行不通:

server {
    listen 80;
    server_name domain;
    env FOO = "bar";
}
Run Code Online (Sandbox Code Playgroud)

你必须这样做:

env FOO = "bar";

http {
    server {
        listen 80;
        server_name domain;
    }
}
Run Code Online (Sandbox Code Playgroud)

这意味着我不能拥有特定于 vhost 的值。所以我必须为每个站点创建一个完整的 vhost 配置,并且只激活我目前想要的一个,以便正确设置值。

有没有办法解决这个问题?

nginx web-server environment-variables virtualhost

9
推荐指数
1
解决办法
3万
查看次数

传递变量以在 Debian Jessie 安装的 preseed 文件中使用

是否可以通过引导提示向 Debian 安装程序添加变量,以便可以在预置文件中使用该变量?

特别是,我正在尝试解决以下问题:

我们有一个非常广泛的安装后脚本,通常是从服务器下载的。但是现在我想创建 Packer 映像并将安装后脚本与其他 Packer 文件一起保留在版本控制中。为了访问 preseed,我可以在引导命令中执行“preseed/url=http://{{ .HTTPIP }}:{{ .HTTPPort }}/preseed.cfg”。但现在我希望安装程序从同一位置下载安装后脚本。

目前,安装后挂钩如下所示:

d-i preseed/late_command string wget -q -O /tmp/postinstall.sh http://our.public.server/postinstall.jessie.sh ; sh /tmp/postinstall.sh
Run Code Online (Sandbox Code Playgroud)

理想情况下,我想做类似的事情:

d-i preseed/late_command string wget -q -O /tmp/postinstall.sh http://{{ .HTTPIP }}:{{ .HTTPPort }}/postinstall.jessie.sh ; sh /tmp/postinstall.sh
Run Code Online (Sandbox Code Playgroud)

但是当然 Debian 安装程序不会用所需的值替换那些。所以我在想有可能将类似环境变量的变量传递给我们可以在 preseed 文件中使用的安装程序。

任何提示或提示表示赞赏!

编辑:尝试将 late_command 添加到引导命令中,但没有被接受。

编辑:尝试预置/运行,但它在不允许目标内命令的不同环境中运行。

编辑:这可以是一种解决方法:如何在 debian preseed 文件中通过管道将命令组合在一起?但我更喜欢将脚本放在一个单独的文件中。如果不可能,那也是不可能的。

debian environment-variables preseed packer

9
推荐指数
2
解决办法
5266
查看次数

SSH: TERM 变量的 SetEnv 行为

我想为我的每台远程机器将 TERM 环境变量设置为不同的值,所以我SetEnv TERM=myTermForRemoteVar~/.ssh/config. 远程机器仍然可以看到TERM=myLocalTermVar

AcceptEnv TERM/etc/ssh/sshd_config远程机器上添加了。仍然没有运气。

我只是为了测试目的而尝试在SetEnv FOO=smth本地和AcceptEnv FOO. 这工作得很好,远程机器可以看到FOO=smth.

TERM通过SSH特殊处理?SetEnv一般适用,但不适用于TERM. 还有其他人看到这种行为吗?至少没有记录。这是一个错误吗?

ssh environment-variables

9
推荐指数
1
解决办法
1178
查看次数

“服务”-命令和环境变量

我正在尝试启动需要 env 的服务。变量设置为特定路径。我在“/etc/profile.d/”中设置了这个变量。但是,当我使用service命令启动此服务时,它不起作用。

男士服务:

service runs a System V init script in as predictable environment as possible,
removing most environment variables and with current working directory set to /.
Run Code Online (Sandbox Code Playgroud)

所以似乎service正在删除我的变量。我应该如何设置变量以防止它们被删除。或者是我不应该做的事情。

可以使用 init-scripts 手动启动服务,甚至可以将路径硬编码到脚本中,但我想知道如何通过service命令使用它。

linux redhat centos service environment-variables

8
推荐指数
2
解决办法
3万
查看次数

64 位 Windows 上的 %ProgramFiles% 差异

从命令提示符,我得到以下信息:

>echo %ProgramFiles%
C:\Program Files
Run Code Online (Sandbox Code Playgroud)

然而,一些应用程序(在这个例子中是 PHP,虽然我在 Apache 的 httpd.conf 中看到了相同的行为),它是:

>php -r "echo $_ENV['ProgramFiles'];"
C:\Program Files (x86)
Run Code Online (Sandbox Code Playgroud)

为什么是这样?

背景:我正在开发与主机操作系统是 32 位还是 64 位无关的脚本,对于配置文件,这非常有效。在 32 位系统上,%ProgramFiles%是“C:\Program Files”,而在 64 位系统上,%ProgramFiles%似乎同样返回C:\Program Files (x86). 我只是好奇为什么当我从 Windows 命令提示符(或在资源管理器栏等中)尝试它时,同样的情况不成立。是否有 64 位命令提示符之类的?

windows environment-variables

8
推荐指数
1
解决办法
5万
查看次数

有没有办法控制 Windows 更新提取临时文件的位置?

在供应商构建的系统上工作时,我们意识到C:他们创建的操作系统分区 ( ) 相当小 (38 GB)。目标是将 Windows 2008 R2 更新到 SP1。一些消息来源指出,在安装过程中需要 8 GB,其中包括提取的临时文件。我设法在分区上清除了多达 4.6 GB 的空间,但仍然没有削减它。

在同一系统上有足够空间的卷上存在另一个分区,但经验告诉我,这些安装程序喜欢提取到C:\temp(或其他一些变体)。我的问题是:

  • Service Pack 安装程序是否使用环境变量来提取临时文件 ( %TEMP%)?
  • 如果临时文件可路由,4.6 GB 空间是否足够用于 SP1 后安装?
  • 除了TechNet上显示的内容之外,是否还有其他安装程序开关可以帮助解决此问题?

一方面,我尝试了其他选项,例如缩小更大的应用程序分区 ( D:),但是在该分区之后只有很多空间,这使得操作系统分区无法利用卷上释放的空间。此外,我目前不在车站尝试此操作,但很高兴知道这是否值得事先尝试。谢谢!

environment-variables windows-update windows-server-2008-r2 service-pack

8
推荐指数
1
解决办法
144
查看次数

Tomcat服务看不到$JAVA_HOME

我正在尝试在 CentOS 7 上使用 Systemd 设置 Tomcat 服务。

我已经安装了 Oracle Java 1.8u74/usr/java/jdk1.8.0_74$JAVA_HOME在启动时设置了环境变量,如下所示:

# echo "export JAVA_HOME=/usr/java/jdk1.8.0_74" > /etc/profile.d/setenv.sh
Run Code Online (Sandbox Code Playgroud)

当我登录系统时,我可以运行echo $JAVA_HOME并查看正确的路径。我已经安装了 Tomcat 并且该tomcat.service文件具有以下内容:

# Systemd unit file for Tomcat

[Unit]
Description=Apache Tomcat
After=syslog.target network.target

[Service]
Type=forking

Environment=JAVA_HOME=/usr/java/jdk1.8.0_74
Environment=CATALINA_PID=/opt/tomcat/temp/tomcat.pid
Environment=CATALINA_HOME=/opt/tomcat
Environment=CATALINA_BASE=/opt/tomcat
Environment='CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC'
Environment='JAVA_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom'

ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/opt/tomcat/bin/shutdown.sh

User=tomcat
Group=www

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

问题是,如果我省略读取的行Environment=JAVA_HOME=/usr/java/jdk1.8.0_74,Tomcat 找不到 $JAVA_HOME,但我希望它找到 $JAVA_HOME,因为它设置在/etc/profile.d/setenv.sh.

我的问题

  • 是不是因为启动顺序(即setenv.sh 在Systemd 启动后运行)而找不到?
  • 我是不是放setenv.sh错地方了?
  • 处理这个问题的最佳方法是什么?

linux java environment-variables systemd centos7

8
推荐指数
1
解决办法
8904
查看次数

如何在systemd服务文件中使用变量?

我正在为守护进程创建一个服务文件,我想使用变量(在初始化脚本中我使用环境变量)来为执行的脚本定义一些参数。例如,我想使用 2 个参数 $PARAM1 $PARAM2:

[Unit]
Description=my daemon
After=network.target

[Service]
ExecStart=/usr/local/bin/daemon1
PIDFile=/var/run/daemon1.pid
EnvironmentVariable=PARAM1=123
EnvironmentVariable=PARAM2=444
ExecStartPre=-/usr/bin/wget -O - --post-data=key1=$PARAM1&key2=$PARAM2 http://192.168.1.2/log.php
ExecStopPost=-/usr/bin/wget -O - --post-data=key1=$PARAM1 http://192.168.1.2/log.php
Type=simple

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

不用说,这个例子不起作用。systemd 是否可以实现类似的功能?可以对 exec 命令进行什么样的参数化?

service environment-variables systemd

8
推荐指数
1
解决办法
2万
查看次数

带有环境变量的 Apache 自定义标头

我尝试使用 Apache 服务器 2.4.6 和 headers_module 设置带有环境变量**的自定义 HTTP 标头。

我在端口 80 上的 HTTP VHost 中工作。

一切都按预期进行,基本示例如下:

Header set MyHeader "%D %t"

我已阅读 mod_headers 的 Apache 文档:https://httpd.apache.org/docs/2.4/en/mod/mod_headers.html#header

据说可以使用以下方式访问环境变量 %{ENVVARNAME}e

(ENVVARNAME 是 ENV 变量的名称)

我还阅读了其他帖子,但没有真正有效的答案: Apache set custom header with an environment variable

但我的问题是添加一个标头而不是像 HOSTNAME 环境值那样标识我的 Apache 服务器

  1. 我试过这个

Header Set X-Serv %{HOSTNAME}e

不成功:始终显示 X-Serv:{null} 而不是值

  1. 我也尝试过:

SetEnv myvar ${HOSTNAME} Header set X-Serv %{myvar}e

没有成功:它显示在我的 HTTP 标头中:X-Serv: %{myvar}e

我还尝试了其他一些不同的组合:

请注意:我的 HOSTNAME 环境变量存在,并且它显示在“env”命令中,其中 apache 用户拥有 httpd 进程

任何想法?

environment-variables http-headers apache-2.4

8
推荐指数
2
解决办法
2万
查看次数