Subprocess with sudo#

使用 Python 来代替 Bash 脚本可以更好的控制逻辑判断和字符串. 但是有的命令是需要 sudo 权限的. 那么我们怎么能让 Python 脚本中的 subprocess.run() 命令能精确的以我们想要的用户, 例如 sudo (root 用户) 和普通用户来执行命令呢?

假如你有一个自动化工作, 需要分别运行两个脚本, 一个是用普通用户, 一个是用 root 用户:

# content of my main.py
import subprocess

# 这是要用 user 来运行的
subprocess.run(["~/.pyenv/shims/python", "my_script_1.py"])

# 这是要用 root 来运行的
subprocess.run(["/usr/bin/python3", "my_script_2.py"])

这时候你无论是用 python main.py 还是用 sudo python main.py, 都会用同一个设置运行两个脚本. 正确的做法应该是你用 sudo python main.py 来运行. 但是 main.py 里的内容需要变一下. 其原理就是你永远用 root 来运行你的入口脚本, 但是对于里面脚本再调用脚本, 凡是要用到 root 的地方就不变, 凡是要用到 user 的地方就用 sudo -H -u your_username 来运行.

# content of my main.py
import subprocess

# 这是要用 user 来运行的
subprocess.run([
    "sudo",
    "-H",
    "-u",
    "ubuntu",
    "~/.pyenv/shims/python",
    "my_script_1.py",
])

# 这是要用 root 来运行的
subprocess.run(["/usr/bin/python3", "my_script_2.py"])

Reference