如何不通过 ssh 连接命令传递语言环境
Posted
技术标签:
【中文标题】如何不通过 ssh 连接命令传递语言环境【英文标题】:How not to pass the locale through an ssh connection command 【发布时间】:2015-06-19 00:03:20 【问题描述】:我有一些 ssh 的别名,例如:
alias buildWork="ssh work '~/build_app'"
问题在于ssh
命令传递了一些变量,例如$LC_CTYPE
,这会导致一些错误。
如何防止这种情况并使用服务器配置?
【问题讨论】:
我没有办法测试,但( unset LC_CTYPE ; ssh ..... )
可能有用。这将在子 shell((...)
)中暂时取消设置 LC_CTYPE,然后运行您的 ssh ....
command。祝你好运。
【参考方案1】:
正如在其他答案中已经解释的那样,客户端将在/etc/ssh/ssh_config
中发送通过SendEnv
指定的所有环境变量。您还可以使用您的用户配置强制 ssh
不发送已定义的变量名称。
来自OpenSSH man page:
可以通过在模式前加上 - 来清除以前设置的 SendEnv 变量名称。默认是不发送任何环境变量。
因此,为了防止发送您的语言环境,您可以将以下内容放入您的~/.ssh/config
:
SendEnv -LC_* -LANG*
【讨论】:
这似乎是最干净的答案,但我无法让它发挥作用。 以下对我有用,可以覆盖/etc/ssh/ssh_config
中的设置:SetEnv LANG=""
我终于发现这是它对我不起作用的原因。他们关闭了问题,但并没有真正解决问题 AFAICT:bugzilla.mindrot.org/show_bug.cgi?id=1285
这完全是疯子。 Debian 和 Ubuntu 等衍生产品曾经以普通用户无法阻止的方式设置 SendEnv
- 只有 root
可以更改它。显然是一个错误。 This was reported in 2010, fixed in 2018,到目前为止,该修复程序仍未到达我们的 Ubuntu 18.04 系统(它们运行 openssh 7.6p1)。所以实际的解决方法是升级到更新的 Debian 或基于 Debian 的版本——然后这个答案就可以了。【参考方案2】:
我遇到了归因于 ssh 传递区域设置的问题,因此我尝试在客户端站点上禁用它,然后在服务器站点上禁用它(如上所述),但登录后区域设置仍然在抱怨。
原来是目标服务器本身的混乱区域设置,该设置取自/etc/default/locale
我必须彻底清理它,运行 # dpkg-reconfigure locales
解决了这个问题。
【讨论】:
【参考方案3】:接受的答案是正确的,但是,如果您不想更改配置文件,则可以在命令行上覆盖特定的语言环境
LC_TIME="en_US.UTF-8" ssh user@example.com
【讨论】:
这对我不起作用。我改用LC_ALL="en_US.UTF-8" ssh xxx@xxxx
。【参考方案4】:
停止通过 sftp 发送环境变量
在 CENTOS 7 上测试
- 在 ~/xyzuser/.ssh/config 中创建文件配置
- 将权限设置为 600 ~/xyzuser/.ssh/config
- 将以下内容放入文件中
注释以下行注释以禁用 env 变量#########
- 发送与语言环境相关的环境变量
SendEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY
SendEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE
SendEnv LC_IDENTIFICATION LC_ALL LANGUAGE
SendEnv XMODIFIERS
在没有 ~/xyzuser/.ssh/config 的情况下运行
sftp -v xyzuser@destinationhost
-------------------截断的输出--------
debug1:请求 no-more-sessions@openssh.com
debug1:进入交互式会话。
debug1:发送环境。
debug1:发送 env LANG = en_US.UTF-8
debug1:发送子系统:sftp
使用 ~/xyzuser/.ssh/config 运行
sftp -v -F /home/xyzuser/.ssh/config xyzuser@destinationhost
----截断---------
debug1:通道 0:新的 [client-session]
debug1:请求 no-more-sessions@openssh.com
debug1:进入交互式会话。
debug1:发送子系统:sftp
连接到目标主机
【讨论】:
请实际尝试回答问题而不是复制粘贴。【参考方案5】:简而言之:
$ touch ~/.ssh/config
$ ssh -F ~/.ssh/config your_user@your_host
详情请见this answer。
【讨论】:
那个成功了。问题是为什么不采用用户配置而是采用全局配置? @crsuarezf 是否采用用户配置,但如果您不使用-F
,它也采用全局配置,而不是完全忽略它。来自man page:If a configuration file is given on the command line, the system-wide configuration file (/etc/ssh/ssh_config) will be ignored
我已经有一个~/.ssh/config
文件,所以这一切只是更新该文件上的时间。并且无法识别的局部变量仍然传递给主机。至少现在我可以在 man
页面中寻找一些东西。
@Vince 这个工作的原因是 -F 选项。它强制 ssh 不使用系统范围的配置。这通常是包含“Host *\n.SendEnv LANG LC_*”之类设置的文件【参考方案6】:
听起来您的 SSH 客户端已配置为转发区域设置。您可以通过更改配置来防止这种情况发生(全局文件通常为 /etc/ssh/ssh_config
):
# comment out / remove the following line
SendEnv LANG LC_*
您也可以更改服务器的配置,方法是在远程机器上编辑/etc/ssh/sshd_config
(注意sshd_config
中的d):
# comment out / remove the following line
AcceptEnv LANG LC_*
【讨论】:
感谢您的解释! 你太棒了!以上是关于如何不通过 ssh 连接命令传递语言环境的主要内容,如果未能解决你的问题,请参考以下文章