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

Python实现SSH连接时密码输入与os.system阻塞问题咨询

Python实现SSH连接问题解决方案

你遇到的两个问题本质上是工具选型不对导致的:

  • os.system是同步阻塞的子进程调用方法,它会完全占用当前进程的标准IO,直到启动的子进程完全退出才会返回,根本不支持和运行中的子进程做输入交互,也没法在子进程运行时继续执行后续代码。
  • 你命令里加的cmd /k参数本身就要求cmd执行完命令后保留窗口不关闭,会进一步导致进程一直挂起无法返回。

推荐方案:使用paramiko库实现SSH(无依赖、可控性强)

不要手动调用系统cmd下的ssh命令,直接用Python生态专门的SSH库paramiko,从代码层面完成连接、认证、命令执行全流程,不需要手动处理密码输入,也不会出现无意义的阻塞。

  1. 先安装依赖:
    pip install paramiko
  2. 基础使用示例:
import paramiko

# 初始化SSH客户端实例
ssh_client = paramiko.SSHClient()
# 自动接受首次连接的主机密钥,避免手动确认
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

# 建立SSH连接,替换为你自己的IP、端口、账号密码
ssh_client.connect(
    hostname="目标服务器IP",
    port=22,
    username="root",
    password="你的SSH连接密码"
)

# 连接建立后直接执行远程命令,不需要等待shell关闭
stdin, stdout, stderr = ssh_client.exec_command("ls /root")
# 获取命令执行结果
command_result = stdout.read().decode("utf-8")
print("命令执行结果:\n", command_result)

# 后续代码会直接执行,不会被阻塞
print("这行代码不需要手动关闭shell就能正常运行")

# 操作完成后主动关闭连接即可
ssh_client.close()

如果需要做交互式的长连接操作,还可以调用invoke_shell()方法创建交互式shell通道,自定义输入输出的处理逻辑。


备选方案:调用系统ssh命令的实现方式

如果必须使用系统自带的ssh客户端,就放弃os.system,改用subprocess模块启动子进程,配合sshpass工具自动完成密码输入:

  1. 先安装sshpass:Windows可以通过choco安装,Linux直接通过apt/yum源安装即可,作用是自动给ssh进程传递密码,不需要手动输入。
  2. 示例代码:
import subprocess

# 启动非阻塞的SSH子进程
ssh_process = subprocess.Popen(
    ["sshpass", "-p", "你的SSH密码", "ssh", "-o", "StrictHostKeyChecking=no", "root@目标服务器IP"],
    stdin=subprocess.PIPE,
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE
)

# 子进程启动后后续代码会立刻执行,不会阻塞
print("后续业务逻辑正常运行")

# 需要执行远程命令时,直接往子进程的标准输入写内容即可
ssh_process.stdin.write(b"ls /root\n")
ssh_process.stdin.flush()
# 读取命令返回结果
print(ssh_process.stdout.readline().decode("utf-8"))

注意:不建议把明文密码硬编码在代码里,生产环境优先使用SSH密钥认证,不管是paramiko还是系统ssh命令都原生支持密钥登录,安全性更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 03:42:31