chroot环境中Python subprocess.run无法执行脚本的原因排查
问题分析与解决
你的问题出在两个核心点上:
1. chroot后未切换当前工作目录
os.chroot(".")仅将进程的根目录替换为当前目录,但进程的当前工作目录仍停留在原来的路径(比如/yadda/yadda)。在chroot环境中,这个原始路径并不存在,所以执行./b.sh时,系统实际是在chroot根目录下查找/yadda/yadda/b.sh,自然会提示文件不存在。
解决方法是在chroot后立刻切换当前工作目录到新的根目录(即chroot后的/,对应原来的当前目录):
import os, subprocess os.chroot(".") os.chdir("/") # 新增该行,切换到chroot后的根目录 subprocess.run(["./b.sh"])
2. chroot环境缺少脚本解释器
就算解决了路径问题,你还会遇到新错误——b.sh的shebang是#!/usr/bin/env bash,但空的chroot环境里既没有/usr/bin/env,也没有bash二进制文件,系统找不到脚本的执行器。
你需要把bash及其依赖库复制到chroot目录的对应路径:
- 先找到bash的位置:执行
which bash,通常结果是/bin/bash - 复制bash到chroot目录的
bin下:cp /bin/bash ./bin/ - 用
ldd /bin/bash查看bash依赖的库文件,将所有列出的.so文件复制到chroot目录对应的lib或lib64路径中
也可以直接修改b.sh的shebang,指定chroot环境里的bash绝对路径(比如你把bash放到了/bin/bash):
#!/bin/bash echo whateva
总结
先切换chroot后的工作目录,再确保chroot环境内有脚本所需的解释器及依赖库,就能正常执行脚本了。
内容的提问来源于stack exchange,提问作者food
相关产品推荐
相关产品推荐

