SSH远程执行Python3 Error: UnicodeEncodeError: ‘ascii‘ codec

首先确定要执行脚本服务器的语言编码环境,执行

# locale -a
C
en_US.utf8
POSIX
# locale 
LANG=en_US.utf8
LC_CTYPE="en_US.utf8"
LC_NUMERIC="en_US.utf8"
LC_TIME="en_US.utf8"
LC_COLLATE="en_US.utf8"
LC_MONETARY="en_US.utf8"
LC_MESSAGES="en_US.utf8"
LC_PAPER="en_US.utf8"
LC_NAME="en_US.utf8"
LC_ADDRESS="en_US.utf8"
LC_TELEPHONE="en_US.utf8"
LC_MEASUREMENT="en_US.utf8"
LC_IDENTIFICATION="en_US.utf8"
LC_ALL=

而SSH客户端的语言编码环境如下:

# locale -a
C
C.UTF-8
POSIX
# locale
LANG=C.UTF-8
LANGUAGE=
LC_CTYPE="C.UTF-8"
LC_NUMERIC="C.UTF-8"
LC_TIME="C.UTF-8"
LC_COLLATE="C.UTF-8"
LC_MONETARY="C.UTF-8"
LC_MESSAGES="C.UTF-8"
LC_PAPER="C.UTF-8"
LC_NAME="C.UTF-8"
LC_ADDRESS="C.UTF-8"
LC_TELEPHONE="C.UTF-8"
LC_MEASUREMENT="C.UTF-8"
LC_IDENTIFICATION="C.UTF-8"
LC_ALL=

通过对比发现SSH客户端的编码环境是C.UTF-8,而Python运行环境为en_US.utf8

C表示的是ascii编码, en_US.utf8 与 zh_CN.utf8 都是包含汉字的

首先想到的是可能是SSH客户端影响了Python运行时的默认encode方式,那么我们把SSH客户端的环境设置成和Python运行环境一样的『这里客户端为Ubuntu』

#!/bin/sh

# 1.设置语言为en_US_UTF-8
echo -e 'LANG="en_US_UTF-8"\nLANGUAGE="en_US:en"' >> /etc/default/locale
# 生效配置
source /etc/default/locale

# 2.如果缺少en_US_UTF-8语言包 安装locales工具并设置en_US_UTF-8
apt-get install --no-install-recommends -y locales
locale-gen en_US.UTF-8
localedef -v -c -i en_US -f UTF-8 en_US.UTF-8

设置完成后再尝试SSH到Python运行环境容器,发现运行不再报错。
那么问题来了,为什么SSH会用客户端的编码运行环境

SSH ENV机制探究

cat /etc/ssh/ssh_config 

在ssh的配置文件中发现如下内容:
上面配置,会将本地的语言环境SendEnv到Python运行环境,那么我们就不需要保证客户端和Python运行环境的语言环境一致了。
只需要将配置修改为:

SendEnv LANG en_US.utf8

还有一种办法

如果不在乎本地语言编码环境的改变,在/etc/profile中增加两行

# vim /etc/profile
export LC_ALL='en_US.utf8'
export LANG='en_US.utf8'

# source /etc/profile

你可能感兴趣的:(ssh,ubuntu,linux)