如何使用Python调用WSL Ubuntu并自动执行需输密码的sudo命令
解决方案
原有使用os.system('ubuntu.exe')的方式仅能打开空白WSL终端,无法向终端传递后续执行命令,因此需要替换为功能更完善的subprocess模块实现需求,以下是两种可行方案:
方案1:配置sudo免密规则(推荐,无密码泄露风险)
提前在WSL Ubuntu中配置指定命令的sudo免权限,不需要在Python脚本中硬编码密码,安全性更高:
- 手动打开WSL Ubuntu终端,执行命令
sudo visudo打开sudo配置文件 - 在配置文件末尾新增如下行,替换
<你的WSL用户名>为你实际的Ubuntu系统用户名:<你的WSL用户名> ALL=(ALL) NOPASSWD: /etc/init.d/dbus start, /etc/init.d/xrdp start - 保存退出配置文件后,上述两条服务启动命令执行sudo时将无需输入密码,Python脚本可改写为:
import subprocess # 执行完命令直接关闭终端 subprocess.run(["ubuntu.exe", "sudo /etc/init.d/dbus start && sudo /etc/init.d/xrdp start"], shell=True) # 如果需要执行完命令后保留终端窗口,替换为以下命令即可 # subprocess.run(["ubuntu.exe", "run", "bash", "-c", "sudo /etc/init.d/dbus start && sudo /etc/init.d/xrdp start; exec bash"], shell=True)
方案2:脚本自动传递密码(不推荐,明文存储密码有泄露风险)
如果不想修改sudo配置,可以利用sudo -S参数从标准输入读取密码的特性,直接在脚本中传递密码完成自动输入:
import subprocess # 替换为你实际的WSL账户密码 WSL_PASSWORD = "your_password" # 构造命令,通过echo将密码传递给sudo command = f'echo {WSL_PASSWORD} | sudo -S /etc/init.d/dbus start && sudo -S /etc/init.d/xrdp start' # 执行命令 subprocess.run(["ubuntu.exe", "run", "bash", "-c", command], shell=True)
内容的提问来源于stack exchange,提问作者Dandys
相关产品推荐
相关产品推荐

