ssh登录运行Python脚本ascii解析文字报错的分析
操作系统语言环境变量的加载顺位可能会影响ssh登录初始化执行脚本的运行结果
问题描述
- 背景:通过/etc/profile.d/agent.sh在用户SSH登录时执行一个python脚本
- SSH登录时运行Python脚本报错:”UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 25-26″
- SSH登录后使用相同的命令运行,不会报错
分析思路
- Python2没有使用UTF-8编码,而是ascii编码,处理中文文字会产生异常。在Python3中,默认的字符处理编码为UTF-8,因此理论上不应存在编码问题。
- 在Linux系统中,Python的默认处理编码会受到环境变量
LC_ALL
、LC_CTYPE
、LANG
的影响,影响顺序从前到后。 - Linux系统中,环境变量的加载顺序为:
/etc/profile
、/etc/profile.d/*
。其中/etc/profile.d/*
按照名称字母升序加载。 - Linux系统中,语言环境变量在
/etc/profile.d/lang.sh
中加载。
因此,在/etc/profile.d/lang.sh执行前执行的脚本,可能未设置语言环境变量或者设置的不是UTF-8,导致Python编码识别错误。
修改方式
- 在Python代码中指定使用的编码为UTF-8
- 在agent.sh中,执行Python脚本命令前增加LANG环境变量,如
LANG=zh_CN.UTF-8 python3 xxx.py
- 修改agent.sh的命名为zagent.sh,目的是在lang.sh后执行
补充
- 在Python程序中,当前使用的编码可通过sys.getfilesystemencoding()获取。