我刚刚发现了OpenSSH Server 中的设置~/.ssh/environment
。PermitUserEnvironment
它非常适合将变量设置为文字字符串;例如:
# host ~/.ssh/environment
PATH=/home/rlue/.local/bin:/usr/local/bin:/usr/bin:/bin:/usr/games
# client
$ ssh host 'echo $PATH'
/home/rlue/.local/bin:/usr/local/bin:/usr/bin:/bin:/usr/games
但变量扩展不起作用:
# host ~/.ssh/environment
PATH=/home/rlue/.local/bin:$PATH
# client
$ ssh host 'echo $PATH'
/home/rlue/.local/bin:$PATH
我发现了多个解决该主题的问题,对于变量是否扩展有不同的答案应该工作与否:
- “我发现,它没有扩展,因为我
PATH="$PATH:/new/path"
在它~/.ssh/environment
应该扩展的时候添加了一条线PATH=$PATH:/new/path
” - “你有双引号、变量扩展和别名定义。这些都不起作用。”
- “在生成
~/.ssh/environment
shell 或命令之前读取ssh
,因此(例如)导出和 $PATH 都没有意义。” - “证明[它]有效”
上一篇文章的作者说他确认他可以使用与我运行的相同版本的 OpenSSH 服务器(Debian 稳定版上的 1:7.9p1-10+deb10u2),但我严格按照他的指示进行操作,并且我'我仍然得到一个文字$PATH
(IE,无变量扩展)。
有没有人有一个明确的答案:是否是应该工作,如果是这样,我的配置缺少什么?
答案1
查看源码,相关函数为read_environment_file()
在session.c
和child_set_env()
在misc.c
。这些都是简单的函数 - 只需读取表单的行var=value
并设置它们,检查限制和有效性,但不对值进行任何额外的处理。这也是联机帮助页说:
此外,如果文件存在并且允许用户更改其环境,则ssh 会读取
~/.ssh/environment
并将格式为“ ”的行添加到环境中。VARNAME=value
所以,不,不应该通过文档或代码来实现。