如何不通过 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 连接命令传递语言环境的主要内容,如果未能解决你的问题,请参考以下文章

如何通过环境变量传递 ssh 密钥密码

Linux下语言环境的设定

在远程 ssh 命令中传递变量

C语言环境中如何导入数据

SSH 从本地文件运行命令并传递本地环境变量

如何在 Laravel 5.3 中获取当前的语言环境