我需要为环境变量设置密码,但问题是密码包含尖角符号,而当我想使用这个变量时,只显示到第一个尖角符号。例如,假设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 中添加的任何内容都将运行,环境变量也是如此。它们将很容易设置,并且不会因 而中断#
。