如何在Python脚本中以root权限运行.sh文件?
问题原因及解决方法
你的代码无法正常工作的核心原因是:每个os.system()调用都会启动一个独立的子shell进程,彼此之间的权限、工作目录等环境完全隔离:
os.system('sudo su')会启动一个需要交互式输入密码的root shell,但os.system无法处理交互,所以看起来没反应;而且这个shell和后续的cd、./clone.sh命令完全无关。os.system('cd /home/pi/Desktop/webcam')只是在临时子shell里切换目录,执行完后原进程的工作目录完全没变。- 最后执行
./clone.sh时,既不在目标目录,也没有root权限,自然无法正常运行。
以下是几种简便的解决方法:
方法1:直接用sudo执行完整路径的脚本
如果脚本不需要依赖当前工作目录,最直接的写法是:
import os os.system('sudo /home/pi/Desktop/webcam/clone.sh')
方法2:合并命令在同一个sudo环境中执行
如果脚本依赖当前工作目录(比如读取同目录下的文件),可以把切换目录和执行脚本合并成一条命令,用sudo bash -c包裹:
import os os.system('sudo bash -c "cd /home/pi/Desktop/webcam && ./clone.sh"')
方法3:使用更推荐的subprocess模块
subprocess是Python官方推荐替代os.system的模块,功能更灵活,还能捕获输出:
import subprocess # 方式3.1:指定脚本完整路径 subprocess.run(['sudo', '/home/pi/Desktop/webcam/clone.sh'], check=True) # 方式3.2:指定工作目录再执行脚本 subprocess.run(['sudo', './clone.sh'], cwd='/home/pi/Desktop/webcam', check=True)
注意:如果你的sudo配置不需要输入密码,以上命令可以直接执行;如果需要密码,建议配置sudo的NOPASSWD权限,不要在脚本中硬编码密码(风险极高)。
内容的提问来源于stack exchange,提问作者zzzw3838
相关产品推荐
相关产品推荐

