You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python脚本中使用sudo su - username并传入密码?

嗨,这个需求是可行的,但我得先严肃提醒你:在脚本里硬编码密码是极度不安全的操作,会直接暴露系统权限,除非是测试环境或者有严格的安全防护,否则强烈不建议这么做!

方法1:用pexpect处理交互式命令(推荐,更稳定)

pexpect是专门用来处理交互式终端命令的Python库,能完美应对sudo的密码输入提示:

首先安装依赖:

pip install pexpect

然后编写脚本:

import pexpect

# 替换成你的目标用户名,强烈建议用环境变量读取密码而非明文!
target_user = "username"
sudo_pass = "your_sudo_password"  # 改成 os.getenv("SUDO_PASSWORD") 更安全

# 启动sudo su - 命令,切换到目标用户的登录shell
process = pexpect.spawn(f"sudo su - {target_user}")
# 等待终端输出密码提示
process.expect("Password:")
# 输入密码并回车
process.sendline(sudo_pass)

# 示例:切换成功后执行whoami命令验证当前用户
process.sendline("whoami")
process.expect(pexpect.EOF)

# 打印执行结果
print("执行结果:\n", process.before.decode().strip())

方法2:用subprocess结合sudo的-S参数

sudo自带-S参数,允许从标准输入(stdin)读取密码,这样可以用subprocess的管道传递密码:

import subprocess
import os

# 从环境变量读取密码,避免明文泄露(运行脚本前先执行 export SUDO_PASSWORD="你的密码")
sudo_pass = os.getenv("SUDO_PASSWORD")
target_user = "username"

# 构造命令:sudo -S 从stdin取密码,切换到目标用户的登录shell
cmd = ["sudo", "-S", "su", "-", target_user]
# 如果要直接执行目标用户的命令,可改成:
# cmd = ["sudo", "-S", "su", "-", target_user, "-c", "whoami && ls -l"]

# 传递密码(必须加换行符,sudo需要回车确认输入)
result = subprocess.run(
    cmd,
    input=f"{sudo_pass}\n".encode(),
    capture_output=True,
    text=True
)

if result.returncode == 0:
    print(f"成功切换到用户 {target_user}")
    print("命令输出:\n", result.stdout)
else:
    print("切换失败!")
    print("错误信息:\n", result.stderr)

关键安全注意事项

  • 绝对避免明文写密码:优先通过环境变量、加密配置文件等方式读取密码,减少泄露风险。
  • 简化操作:如果只是要执行某个用户的特定命令,直接用sudo -u username command更简洁,不需要完整切换shell。
  • 限制脚本权限:确保只有授权用户能读取这个脚本,避免密码被恶意获取。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:03:06