如何为Azure自动输入密码?解决subprocess调用SSH时密码传参错误问题
错误原因
你当前的写法中,| 是shell管道符,作用是将前一个命令的标准输出作为后一个命令的标准输入,你直接把key.PASSKEY放在管道后面,会被shell识别为要执行的命令而非输入内容,因此会触发command not found报错,同时ssh默认会从终端交互读取密码,自然会停在密码输入提示处。
解决方案
下面提供三种常用实现方式:
方案1:使用pexpect库处理交互式输入(最稳妥)
pexpect专门用于处理交互式命令行场景,适配ssh的终端输入要求,不需要额外安装系统工具。
- 首先安装依赖:
pip install pexpect
- 代码示例:
import pexpect # 替换为你实际的ssh登录命令 ssh_cmd = key.SSH_KEY child = pexpect.spawn(ssh_cmd) # 匹配密码提示文本 child.expect(r"azureuser@.*'s password:") # 输入密码并追加换行符 child.sendline(key.PASSKEY) # 如果需要保持交互会话,加这行 child.interact() # 如果只需要执行命令后退出,替换为 child.wait() 即可
方案2:使用sshpass系统工具配合subprocess
需要先在运行代码的机器上安装sshpass工具,适合不想改太多原有代码的场景。
- 安装sshpass:
- Debian/Ubuntu 系列:
sudo apt install sshpass - CentOS/RHEL 系列:
sudo yum install sshpass
- Debian/Ubuntu 系列:
- 代码示例:
import subprocess cmd = f"sshpass -p '{key.PASSKEY}' {key.SSH_KEY}" process_1 = subprocess.call(cmd, shell=True)
注意:该方式密码会明文出现在进程列表中,仅建议在测试环境或安全隔离的环境中使用
方案3:原生subprocess实现,无额外依赖
需要给ssh命令添加参数,强制从标准输入读取密码:
import subprocess # 给ssh命令追加 -o StdinPasswd=yes 参数,强制从stdin读取密码 cmd = f"{key.SSH_KEY} -o StdinPasswd=yes" process_1 = subprocess.Popen( cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE ) # 传入密码并追加换行符 stdout, stderr = process_1.communicate(input=f"{key.PASSKEY}\n".encode()) # 可打印输出排查问题 print(stdout.decode()) print(stderr.decode())
内容的提问来源于stack exchange,提问作者greendaysbomb
相关产品推荐
相关产品推荐

