You need to enable JavaScript to run this app. 如何为Azure自动输入密码?解决subprocess调用SSH时密码传参错误问题
优惠活动
大模型
产品
解决方案
定价
更多

如何为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
  • 代码示例:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 21:24:02