余进
ssh 远程连接时取消继承 locale 环境变量
2020-12-16 00:27
阅读:2418

想在 mtputty 下新开一个 putty 窗口下载安装某软件,由于已经打开的putty标签页实在太多了,就试了试微软新出的终端工具 Windows Terminal。打开默认是 WSL 的窗口(好像是某一次在它的 json 配置文件里设置过)。于是 ssh 登录到集群管理节点,进行 git clone。测试软件时却发现 Perl 的解释器总是会报 locale 相关的警告,提示如下

perl: warning: Setting locale failed.

perl: warning: Please check that your locale settings:

        LANGUAGE = (unset),

        LC_ALL = (unset),

        LC_COLLATE = "C",

        LANG = "C.UTF-8"

    are supported and installed on your system.

perl: warning: Falling back to the standard locale ("C").

这个警告之前倒是见过,设置一下 LC_ALL=C 可以解决,但是之前发现某些软件的某些 Python 脚本要求运行环境的 LANG 环境变量必须为 en_US.UTF-8,否则会报错退出,于是没有采用这个方法。

但是我这几天都在计算节点上跑各种基于 Perl 的任务怎么没出这个警告呢?于是在已经打开的 putty 窗口里面随便选了一个,测试了一下 `perl -v` ,是正常的输出。 exit 到管理节点,`perl -v` 还是正常输出。重新用 Windows Terminal (WSL) 连接到管理节点,运行 Perl 解释器会有这个警告,并且环境变量 LANG 的值是 "C.UTF-8",而 putty 远程连接的 shell 里面这个值是默认的"en_US.UTF-8",看来问题在终端工具上。

于是搜索“WSL ssh locale”相关的信息,没找到什么有用的。想在ChinaUnix论坛上发帖求助,结果发现要添加3个好友才能发帖(上一次登录时还可以随便发帖的……)缩减一下搜索关键词为“ssh locale“,终于用 bing 搜索到相关的了:

https://stackoverflow.com/questions/29609371/how-do-not-pass-locale-through-ssh

原来 ssh 连接时默认会 "pass" 当前 shell 的一些环境变量到新建的 login shell 中,由 ssh config 文件(默认应该是 /etc/ssh/ssh_config)控制,其中有一行:

SendEnv LANG LC_*

将其注释掉即可。或者在 ssh服务端(即目标主机的sshd)的 config 文件中(默认应该是 /etc/ssh/sshd_config)注释掉这一行:

AcceptEnv LANG LC_*

而 putty 是虚拟的终端(貌似吧……)所以没有所谓当前的 shell,不会传递 locale 环境变量到新的 login shell 中,所以用 putty 远程连接和在真实的 shell 中用 ssh 客户端进行远程连接还是有区别的。试了下用 Windows Terminal (PowerShell) 运行系统自带的 OpenSSH 客户端进行远程连接,发现和 putty 效果一样。

转载本文请联系原作者获取授权,同时请注明本文来自余进科学网博客。

链接地址:https://wap.sciencenet.cn/blog-3414436-1262652.html?mobile=1

收藏

分享到:

当前推荐数:0
推荐到博客首页
网友评论0 条评论
确定删除指定的回复吗?
确定删除本博文吗?