答:
在 Windows Server 2012 系统上执行你的 SSH 连接和命令执行脚本时,stdout.read(999999) 步骤的延迟可能与以下几个因素有关:
- 网络延迟和连接问题
网络配置:检查 Windows Server 2012 的网络配置,包括防火墙和网络设置,确保不会影响 SSH 的流量。
网络延迟:确认网络延迟是否会影响命令的执行,尤其是在 Windows Server 2012 上可能会因为网络设置或者其他网络问题导致延迟。 - SSH 客户端和 Shell 配置
缓冲区问题:在某些系统上,SSH 客户端和远程设备的 shell 的缓冲区可能会导致延迟。尝试减少 stdout.read 的读取量或使用 stdout.readline() 来逐行读取输出数据。
终端行为:某些终端(如 invoke_shell)可能会处理缓冲区的方式不同。你可以尝试使用 exec_command 方法来执行命令,看是否有改进。 - Windows 系统特定问题
Python 版本和 Paramiko 版本:确认 Windows Server 2012 上的 Python 和 Paramiko 的版本是否与 Windows 10 上相同,确保版本兼容。
权限问题:确保 Windows Server 2012 上的 Python 进程有足够的权限来进行网络通信和文件操作。 - 代码优化
使用 exec_command:可以尝试用 exec_command 方法替代 invoke_shell。 exec_command 可能会更适合你这种简单的命令执行场景:
import paramiko
def ssh_exec_command2(device_ip, username, password, command1, command2):
port = 22
ssh_client = paramiko.SSHClient()
ssh_client.load_system_host_keys()
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh_client.connect(device_ip, port, username, password, timeout=10)
print('连接设备 ', device_ip)
# 使用 exec_command 执行命令
commands = f"{command1}; {command2}"
stdin, stdout, stderr = ssh_client.exec_command(commands)
# 读取输出
output = stdout.read().decode()
error = stderr.read().decode()
print("执行完毕", device_ip)
if error:
print("错误:", error)
else:
print("读取完毕", device_ip)
ssh_client.close()
return output
- 调试和日志
增加日志:在代码中添加更多的日志信息来确认代码的执行状态,例如在 stdin.write 后面添加日志,确认命令是否真正被发送。
排除故障:在 Windows Server 2012 上运行 SSH 命令的不同环境下进行测试,以排除可能的系统特定问题。
总结
建议你尝试用 exec_command 替代 invoke_shell 来执行命令,可能会更适合这种简单的命令执行场景,并仔细检查网络配置和系统权限,确保没有潜在的问题