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()​获取。

留下评论