Ubuntu系统下如何在Python3中获取root权限并执行Shell命令?
为啥你的脚本切换root后就停了?怎么解决?
你遇到的问题其实是os.system()的工作机制导致的:每次调用os.system()都会启动一个完全独立的子进程。当你执行os.system("sudo su")时,这个命令会启动一个新的root交互shell,这个进程会一直等着用户输入命令,所以后面的代码根本没机会执行;就算你手动退出这个shell,后面的os.system("other commands")还是在原来的普通用户进程里跑,根本没拿到root权限。
下面给你几个靠谱的解决方案,按推荐程度排序:
方案1:给单个命令直接加sudo(最简单)
如果你的后续命令都是独立的,没必要切换整个shell,直接给每个需要root权限的命令加上sudo就行:
import os # 每个需要root的命令前加sudo os.system("sudo apt update") os.system("sudo apt install -y nginx") os.system("sudo systemctl start nginx")
只要你的用户在sudoers列表里,执行时输入一次密码(或者配置免密码sudo),这些命令就能以root权限运行。
方案2:用sudo -c批量执行多个命令
如果需要连续执行一串root命令,可以把它们用&&或者;连接,通过sudo -c一次性交给root shell执行,这样所有命令都在同一个root进程里:
import os # 把多个命令整合成一个字符串,用sudo -c执行 root_commands = "apt update && apt install -y nginx && systemctl start nginx" os.system(f'sudo -c "{root_commands}"')
注意引号的嵌套,这里外层用单引号,内层用双引号,避免语法冲突。
方案3:用subprocess模块(官方推荐,更灵活)
os.system()是比较老旧的API,Python官方更推荐用subprocess模块,它能更好地控制进程、捕获输出、处理返回值,适合复杂场景:
import subprocess # 执行单个sudo命令,还能捕获输出 update_result = subprocess.run( ["sudo", "apt", "update"], capture_output=True, text=True ) print("更新输出:", update_result.stdout) print("错误信息:", update_result.stderr) # 批量执行多个命令 root_cmds = "apt install -y nginx && systemctl enable --now nginx" subprocess.run(["sudo", "-c", root_cmds], shell=False) # 如果你不怕shell注入风险(命令是自己写的,不是用户输入的),也可以这样写: # subprocess.run(f"sudo {root_cmds}", shell=True)
额外小技巧:配置免密码sudo(无人值守必备)
如果你的脚本需要自动运行,不想每次都输入sudo密码,可以配置免权限:
- 打开终端执行
sudo visudo(用这个命令编辑sudoers更安全,避免语法错误导致sudo失效) - 在文件末尾添加一行:
你的用户名 ALL=(ALL) NOPASSWD: ALL(把你的用户名换成你实际的Ubuntu用户名) - 按
Ctrl+O保存,Ctrl+X退出就行
这样你的用户执行sudo时就不需要输入密码了,脚本可以全自动运行。
内容的提问来源于stack exchange,提问作者woohu1




