/etc/environment 的语法记录在哪里?

/etc/environment 的语法记录在哪里?

我想知道 /etc/environment 的确切语法。我知道这不是一个普通的 shell 脚本,但是单引号和双引号到底是如何处理的?

文件中前面定义的环境变量可以用于定义后面的变量吗?

逃跑如何进行?如果值中有空格会怎样?

另外 - 文件何时处理?网上有冲突的信息称,它是在系统启动时、每次用户登录时或两者兼而有之时进行处理的。

我无法在网上找到这些详细信息;谁能指点我权威文档?

如果重要的话,我对 Ubuntu (Debian) 特别感兴趣。

答案1

很奇怪,我之前就测试过。这个行为有点……奇怪。

这些设置位于/etc/environment

FOO1=bar
FOO2="bar"
FOO3="bar
FOO4=bar"
FOO5='bar'
FOO6='bar"
export FOO7=bar
FOO8=bar bar bar
#FOO9=bar
FOO10=$PATH
FOO11="foo#bar"

给出这些环境变量:

FOO1=bar
FOO2=bar
FOO3=bar
FOO4=bar"
FOO5=bar
FOO6=bar
FOO7=bar
FOO8=bar bar bar
FOO10=$PATH
FOO11=foo

换句话说:

  • 它跳过前导export(7)
  • 如果该值以单引号或双引号开头,则会删除该值以及任何结尾的单引号或双引号。 (2, 5)
  • ...但它不介意引号不匹配,或者最终引号丢失 (3, 6)
  • 即使没有引号,它也不特殊对待空格 (8)
  • ...甚至没有尾随空格,这在这里很难显示,但我也测试了 (8)
  • #它忽略以(9)开头的行
  • ...并在 a 处剪切行#,即使它位于引号之间 (11)
  • 它不支持变量扩展 (10)

它由 读取pam_env.so,因此您希望它记录在pam_env联机帮助页, 或者environment手册页,但他们没有提到引号的处理。除了测试之外,您还必须解析代码中的行为拉斯克斯的回答链接到。

我想它会尝试接受您放入 shell 启动文件中的分配,以便export FOO="bar bar"在两者中执行相同的操作(前提是您那里没有任何尾随空格)。只是 for 的语法/etc/environment要简单得多(在我看来,到了愚蠢的程度)。

/etc/environment也不支持变量扩展等。如上所述,$PATH文件中的$PATH值最终以文字形式出现,而不是目录列表。

上面链接的手册页也描述了pam_env.conf,它具有更丰富的语法并允许变量扩展。但它仍然不是 shell 语法。

有关的:

答案2

/etc/environment文件的读取方式是pam_env不幸的是,官方文档对于格式并不是非常明确;它说:

语法是简单的 KEY=VAL 对,位于单独的行上。可以指定导出指令以实现 bash 兼容性,但会被忽略。当不同的服务需要不同的环境时,这非常有用。

如果你真的很好奇,实际的解析逻辑可以在_parse_env_file功能在 PAM 源中。具体来说:

  /* now we try to be smart about quotes around the value,
     but not too smart, we can't get all fancy with escaped
     values like bash */
    if (key[i] == '=' && (key[++i] == '\"' || key[i] == '\'')) {
        for ( t = i+1 ; key[t] != '\0' ; t++)
            if (key[t] != '\"' && key[t] != '\'')
                key[i++] = key[t];
            else if (key[t+1] != '\0')
                key[i++] = key[t];
        key[i] = '\0';
    }

答案3

我将尝试回答你的第二、第四和第五个问题。

该文件的文档位于手册页(man 5 pam_env.conf)

/etc/environment后读取pam_env.conf,并且man 5 pam_env.conf表示此文件在用户登录时读取。

基本上,只有文件key=value中的行/etc/environment。手册页指出,您可以使用该文件/etc/security/pam_env.conf通过其他可能不存在的变量来设置环境变量。

从手册页来看,关于/etc/security/pam_env.conf

每行以变量名称开头,然后每个变量有两个可能的选项DEFAULTOVERRIDEDEFAULT允许管理员将变量的值设置为某个默认值,如果未提供任何值,则假定为空字符串。该 OVERRIDE选项指示pam_env如果有要使用的值,则应输入其值(覆盖默认值)。当OVERRIDE 不使用时,""将被假定并且不会进行覆盖。

VARIABLE [DEFAULT=[value]] [OVERRIDE=[value]]

(可能不存在的)环境变量可以在使用该${string}语法的值中使用,并且(可能不存在的)PAM_ITEM 也HOME可以SHELL在使用该语法的值中使用@{string}$和字符都@可以通过反斜杠转义以用作文字值 值可以用 分隔""" 不支持转义。请注意,您想要使用的许多环境变量可能在调用模块时尚未设置。例如,${HOME}下面多次使用,但许多 PAM 应用程序不会在您需要时使其可用。特殊变量@{HOME}@{SHELL}被扩展为用户的 passwd 条目中的值。

/etc/environment 文件指定要设置的环境变量。该文件必须由单独行上的简单 NAME=VALUE 对组成。 pam_env(8) 模块将读取 pam_env.conf 文件之后的文件。

您还可以使用 shell 的(例如 bash 或 zsh)配置文件或设置类似的环境变量。

相关内容