今天遇到一个因为windows文件上传Linux导致执行失败的问题,这里做一个记录
背景
平台支持自定义组件功能,允许用户上传可执行文件(bin/python/shell等等)。有用户反馈上传的python脚本组件输出不符合预期,遂进行定位。
系统报错:
定位问题异常点是fork
后调用execl
失败,系统报错errno(2)
,错误信息为No such file or directory
,但实际情况是拉起的文件无法执行。
异常点:python文件存在且权限正常
1、通过su -
命令切换至程序所属用户:用户侧权限可以查看到文件,使用python 文件名
可正确执行
2、gdb
跟踪程序:断点到程序执行到对应位置通过access
函数定位程序具备文件的读/执行权限,但继续向后走调用execl
会失败并返回errno(2)
,错误信息为No such file or directory
。
问题分析及原因定位
1、由上述分析可以看出,文件确实存在,但是因为其他原因导致执行时报错文件不存在。
2、异常原因:用户侧windows下编辑文件,使文件带有windows换行符。Linux解析时发现最后带有特殊字符,致使文件第一行解析器解析失败,完整报错信息(/usr/bin/python^M: bad interpreter: No such file or directory
)
解决方案
通过dos2unix
函数,可以将文件装换为Linux下的问题,转换后就可以正常执行了。
思考
Linux下的报错信息也不绝对,还是要根据时间情况进行分析
Windows下可以通过file
命令来进行识别,dos2unix
来进行转换