无法在环境变量中添加带有尖号的值

无法在环境变量中添加带有尖号的值

我需要为环境变量设置密码,但问题是密码包含尖角符号,而当我想使用这个变量时,只显示到第一个尖角符号。例如,假设he#l#lo是我的密码,当我将其设置/etc/environment为时PASSWORD_API="he#l#lo",我打印它只显示he并保留后面的字符#。但是当我export PASSWORD_API="he#l#lo"从终端使用时,一切正常!通过添加环境变量有什么问题,\etc\environment我无法更改密码,所以如果你有任何想法,请帮助我。谢谢

答案1

据我所知,这是模块pam_env读取环境文件行的方式的限制(甚至在尝试将它们解析成对之前name=value)。

具体来说,在_pam_assemble_line函数中(在libpam/pam_handlers.c):

        /*
         * we are only interested in characters before the first '#'
         * character
         */

        while (*s && *s != '#')
             ++s;

似乎没有规定如何以任何不同的方式处理引用或转义的字符串。

如果您需要设置包含此类字符的环境变量,那么您需要在其他地方进行设置 - 例如,创建/etc/profile.d/password-api.sh包含以下行的文件

export PASSWORD_API="he#l#lo"

应该由默认获取/etc/profile


当然,我确信您已经意识到,以纯文本形式在任何地方存储密码都是一个坏主意 - 如果您的应用程序提供了另一种选项(例如使用基于密钥的身份验证,或将密码安全地添加到代理),那么您应该使用它。

答案2

删除等号周围的空格:

$ PASSWORD_API="he#l#lo"
$ echo $PASSWORD_API
he#l#lo

答案3

我尝试了很多种设置环境的方法,但只有导出似乎有效,并且每次重新启动时都要在 cron 作业中运行 shell 脚本来运行一堆导出。

添加 systemd 环境变量https://www.freedesktop.org/software/systemd/man/systemd.exec.html#EnvironmentFile=这显示了如何在环境文件中完成它,该文件只能用于读取非#值,否则它会在#值上中断。

使用以下命令创建 shell 脚本:

export Key="Value"

然后运行:

crontab -e

选择您将使用的编辑器并继续添加要在重启时运行的脚本。

@reboot sh /home/username/profile.d/env.sh

保存文件并重新启动。您在 env.sh 中添加的任何内容都将运行,环境变量也是如此。它们将很容易设置,并且不会因 而中断#

相关内容