You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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密码,可以配置免权限:

  1. 打开终端执行sudo visudo(用这个命令编辑sudoers更安全,避免语法错误导致sudo失效)
  2. 在文件末尾添加一行:你的用户名 ALL=(ALL) NOPASSWD: ALL(把你的用户名换成你实际的Ubuntu用户名)
  3. Ctrl+O保存,Ctrl+X退出就行

这样你的用户执行sudo时就不需要输入密码了,脚本可以全自动运行。

内容的提问来源于stack exchange,提问作者woohu1

火山引擎 最新活动