Python实现SSH连接时密码输入与os.system阻塞问题咨询
Python实现SSH连接问题解决方案
你遇到的两个问题本质上是工具选型不对导致的:
os.system是同步阻塞的子进程调用方法,它会完全占用当前进程的标准IO,直到启动的子进程完全退出才会返回,根本不支持和运行中的子进程做输入交互,也没法在子进程运行时继续执行后续代码。- 你命令里加的
cmd /k参数本身就要求cmd执行完命令后保留窗口不关闭,会进一步导致进程一直挂起无法返回。
推荐方案:使用paramiko库实现SSH(无依赖、可控性强)
不要手动调用系统cmd下的ssh命令,直接用Python生态专门的SSH库paramiko,从代码层面完成连接、认证、命令执行全流程,不需要手动处理密码输入,也不会出现无意义的阻塞。
- 先安装依赖:
pip install paramiko - 基础使用示例:
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工具自动完成密码输入:
- 先安装sshpass:Windows可以通过choco安装,Linux直接通过apt/yum源安装即可,作用是自动给ssh进程传递密码,不需要手动输入。
- 示例代码:
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
相关产品推荐
相关产品推荐

