如何在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
相关产品推荐
相关产品推荐

