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

Jay*_*mon 10 ubuntu environment-variables

在 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文件中不起作用。

小智 6

这是由 pam_env 模块读取的。鉴于 pam_env 模块希望它们是“简单”的 KEY=VALUE 对(不需要引号)并且还支持由 # 标识的注释,因此它假定 # 及其后在 VALUE 中的任何内容都是注释。另请注意,它不支持任何转义概念。

这可以在pam_env.c 中_parse_env_file 函数的以下片段中看到。

/* now find the end of value */
mark = key;
while(mark[0] != '\n' && mark[0] != '#' && mark[0] != '\0')
    mark++;
if (mark[0] != '\0')
    mark[0] = '\0';
Run Code Online (Sandbox Code Playgroud)

上面的代码段遍历 VALUE 部分的每个字符,直到找到\n,#\0。然后用\0.覆盖该字符。

这有效地剥离了#和接下来的一切。注意:这是一个功能而不是一个错误。这是评论功能。

因此,此时您不能拥有/etc/environment包含 a#或 a\n\0在值中间的值。从代码看来,密钥也需要是字母数字。