【问题标题】:How not to pass the locale through an ssh connection command如何不通过 ssh 连接命令传递语言环境
【发布时间】: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。祝你好运。

标签: bash ssh


【解决方案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 pageIf 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_*
    

    【讨论】:

    • 感谢您的解释!
    • 你太棒了!
    猜你喜欢
    • 2021-05-26
    • 2016-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-16
    • 2016-11-16
    • 2020-09-01
    相关资源
    最近更新 更多