Python Paramiko 没有以正确的顺序显示命令输出
Python Paramiko doesn't show commands output in the right order
当我运行下面的代码时,我得到了一个扭曲的结果:
######## Make connection
remote_conn_pre=paramiko.SSHClient()
remote_conn_pre.set_missing_host_key_policy(paramiko.AutoAddPolicy())
remote_conn_pre.connect(ip, port=22, username=username,
password=password,
look_for_keys=False, allow_agent=False)
remote_conn = remote_conn_pre.invoke_shell()
######## commands read from JSON file (commands)
for command in commands["normal"]:
print("-- command: " + command)
remote_conn.send(command + "\n")
while not remote_conn.recv_ready():
time.sleep(0.300)
output = remote_conn.recv(buffersize)
print(output.decode())
输出结果:
-- command: sh run | section dhcp
sh run | sec dhcp
-- command: sh run | i ip route
ip dhcp bootp ignore
sh run | i ip route
ip route 0.0.0.0 0.0.0 vlan 1
如您所见,ip dhcp bootp ignore
结果应位于 “DHCP 部分” 而不是 “路由部分”[=27] =].
正确的结果应该是:
-- command: sh run | section dhcp
sh run | sec dhcp
ip dhcp bootp ignore
-- command: sh run | i ip route
sh run | i ip route
ip route 0.0.0.0 0.0.0 vlan 1
这里出了什么问题?我想到命令没有准备好,所以我内置了睡眠定时器。然而,在此之后缓冲区似乎不为空或准备就绪。
因为您没有等待命令完成再发送另一个命令。实际上,SSHClient.invoke_shell
(SSH“shell”通道)无法做到这一点。 “shell”频道不适用于命令自动化。
而是使用 SSHClient.exec_command
(SSH“exec”通道)。
参见
如果您的某些命令实际上不是顶级shell命令,而是顶级命令的子命令,另请参阅:
当我运行下面的代码时,我得到了一个扭曲的结果:
######## Make connection
remote_conn_pre=paramiko.SSHClient()
remote_conn_pre.set_missing_host_key_policy(paramiko.AutoAddPolicy())
remote_conn_pre.connect(ip, port=22, username=username,
password=password,
look_for_keys=False, allow_agent=False)
remote_conn = remote_conn_pre.invoke_shell()
######## commands read from JSON file (commands)
for command in commands["normal"]:
print("-- command: " + command)
remote_conn.send(command + "\n")
while not remote_conn.recv_ready():
time.sleep(0.300)
output = remote_conn.recv(buffersize)
print(output.decode())
输出结果:
-- command: sh run | section dhcp
sh run | sec dhcp
-- command: sh run | i ip route
ip dhcp bootp ignore
sh run | i ip route
ip route 0.0.0.0 0.0.0 vlan 1
如您所见,ip dhcp bootp ignore
结果应位于 “DHCP 部分” 而不是 “路由部分”[=27] =].
正确的结果应该是:
-- command: sh run | section dhcp
sh run | sec dhcp
ip dhcp bootp ignore
-- command: sh run | i ip route
sh run | i ip route
ip route 0.0.0.0 0.0.0 vlan 1
这里出了什么问题?我想到命令没有准备好,所以我内置了睡眠定时器。然而,在此之后缓冲区似乎不为空或准备就绪。
因为您没有等待命令完成再发送另一个命令。实际上,SSHClient.invoke_shell
(SSH“shell”通道)无法做到这一点。 “shell”频道不适用于命令自动化。
而是使用 SSHClient.exec_command
(SSH“exec”通道)。
参见
如果您的某些命令实际上不是顶级shell命令,而是顶级命令的子命令,另请参阅: