gpt4 book ai didi

python - Paramiko ssh 死亡/挂起,输出很大

转载 作者:行者123 更新时间:2023-11-28 18:36:52 24 4
gpt4 key购买 nike

我尝试使用 Paramiko 和 SSH 来备份服务器以调用 tar 命令。当文件数量有限时,一切正常,但当它是一个大文件夹时,脚本会无休止地等待。下面的测试告诉我问题出在标准输出的大小上。

有没有办法纠正并执行这种命令?

案例大输出:

query = 'cd /;ls -lshAR -h'
chan.exec_command(query)
while not chan.recv_exit_status():
if chan.recv_ready():
data = chan.recv(1024)
while data:
print data
data = chan.recv(1024)

if chan.recv_stderr_ready():
error_buff = chan.recv_stderr(1024)
while error_buff:
print error_buff
error_buff = chan.recv_stderr(1024)
exist_status = chan.recv_exit_status()
if 0 == exist_status:
break

结果是(不正常 - 阻塞 - 死亡 ??)

2015-07-25 12:57:07,402 --> Query sent

案例小输出:

query = 'cd /;ls -lshA -h'
chan.exec_command(query)
while not chan.recv_exit_status():
if chan.recv_ready():
data = chan.recv(1024)
while data:
print data
data = chan.recv(1024)

if chan.recv_stderr_ready():
error_buff = chan.recv_stderr(1024)
while error_buff:
print error_buff
error_buff = chan.recv_stderr(1024)
exist_status = chan.recv_exit_status()
if 0 == exist_status:
break

结果是(一切正常)

2015-07-25 12:55:08,205 --> Query sent
total 172K
4.0K drwxr-x--- 2 root psaadm 4.0K Dec 27 2013 archives
0 -rw-r--r-- 1 root root 0 Jul 9 23:49 .autofsck
0 -rw-r--r-- 1 root root 0 Dec 27 2013 .autorelabel
4.0K dr-xr-xr-x 2 root root 4.0K Dec 23 2014 bin
2015-07-25 12:55:08,307 --> Query executed (0.10)

放在GitHub上:
https://github.com/paramiko/paramiko/issues/563

最佳答案

如果 ls -R 打印出大量错误输出(如果当前用户不是 root => 没有访问所有文件夹的权限),您的代码 deadlocks最终。

这是因为,错误流的输出缓冲区最终会填满,所以 ls 停止工作,等待您读取流(清空缓冲区)。

当您等待常规输出流完成时,它永远不会做的事情,就像 ls 等待您读取错误流一样,您永远不会做的事情。

您必须并行读取两个流(参见 Run multiple commands in different SSH servers in parallel using Python Paramiko )。

或者更简单,使用 Channel.set_combine_stderr将两个流合并为一个流。

关于python - Paramiko ssh 死亡/挂起,输出很大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31625788/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com