如何不通过 ssh 连接命令传递区域设置

我有一些 ssh 的别名,例如:

alias buildWork="ssh work '~/build_app'"

问题是,ssh命令传递一些变量,如 $LC_CTYPE,这会导致一些错误。

如何防止这种情况并使用服务器配置?

44467 次浏览

似乎您的 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_*

简而言之:

$ touch ~/.ssh/config
$ ssh -F ~/.ssh/config your_user@your_host

详情请参阅 这个答案

To stop sending Environment Variables via sftp
Tested on CENTOS 7
- create file config in ~/xyzuser/.ssh/config
- set permission to 600 ~/xyzuser/.ssh/config
- Put the following content in the file


comment the below lines commented to disable env variables#########


- Send locale-related environment variables
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


Running without the ~/xyzuser/.ssh/config
sftp -v   xyzuser@destinationhost
-------------------truncated output--------
debug1: Requesting no-more-sessions@openssh.com
debug1: Entering interactive session.
debug1: Sending environment.
debug1: Sending env LANG = en_US.UTF-8
debug1: Sending subsystem: sftp


Running with the ~/xyzuser/.ssh/config


sftp -v -F /home/xyzuser/.ssh/config  xyzuser@destinationhost


----truncated----------
debug1: channel 0: new [client-session]
debug1: Requesting no-more-sessions@openssh.com
debug1: Entering interactive session.
debug1: Sending subsystem: sftp
Connected to destinationhost

接受的答案是正确的,但是,如果您不想更改配置文件,您可以在命令行上覆盖特定的区域设置

LC_TIME="en_US.UTF-8" ssh user@example.com

我当时面临的问题是 ssh 传递了区域设置,所以我尝试在客户端上禁用它,然后在服务器端也禁用(如上所述) ,但是登录后区域设置仍然在抱怨。

结果是目标服务器本身的一个混乱的地区,设置是从 /etc/default/locale获取的

我必须彻底清理它,运行 # dpkg-reconfigure locales修复了这个问题。

正如在其他答案中已经解释的那样,客户端将发送通过 /etc/ssh/ssh_config中的 SendEnv指定的所有环境变量。还可以使用用户的配置强制 ssh不发送已定义的变量名。

来自 OpenSSH 手册页:

可以通过使用-作为模式的前缀来清除以前设置的 SendEnv 变量名。默认情况下不发送任何环境变量。

因此,为了防止发送您的语言环境,您可以将以下内容放入您的 ~/.ssh/config:

SendEnv -LC_* -LANG*

如果不发送我们的本地环境(SendEnv) ,这是默认行为,因为它是在 /etc/ssh/ssh_config中指定的,你必须:

  1. 为用户 ~/.ssh/config创建一个配置文件
  2. 加上这些线
Host *
SendEnv !LANG !LC_*
  1. 重新加载 shell sudo su - $YourSelf (或注销/登录)

解释一下

  • 意味着不
  • * 意味着一切

所以

  • 不要发送变量 LANG
  • ! LC _ * = = 不要发送以 LC _ 开始的所有变量

来源: https://bugzilla.mindrot.org/show_bug.cgi?id=1285#c8

请记住,并不是每个有这个问题的人都有编辑/etc/ssh/ssh _ config 的能力