下面的代码通过SSH在一台计算机上运行grep并打印结果:
import sys, os, string
import paramiko
cmd = "grep -h 'king' /opt/data/horror_20100810*"
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('10.10.3.10', username='xy', password='xy')
stdin, stdout, stderr = ssh.exec_command(cmd)
stdin.write('xy\n')
stdin.flush()
print stdout.readlines()
我如何一次将5台机器全部置入grep(这样就不会造成重大延迟),而不是将所有这些都放入5个变量并将它们全部打印出来。
你需要将调用放在单独的线程(或进程中,但这可能会过大),这反过来又要求代码位于函数中(无论如何,这是一个好主意:在模块的顶部没有大量代码)等级)。
例如:
import sys, os, string, threading
import paramiko
cmd = "grep -h 'king' /opt/data/horror_20100810*"
outlock = threading.Lock()
def workon(host):
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host, username='xy', password='xy')
stdin, stdout, stderr = ssh.exec_command(cmd)
stdin.write('xy\n')
stdin.flush()
with outlock:
print stdout.readlines()
def main():
hosts = ['10.10.3.10', '10.10.4.12', '10.10.2.15', ] # etc
threads = []
for h in hosts:
t = threading.Thread(target=workon, args=(h,))
t.start()
threads.append(t)
for t in threads:
t.join()
main()
如果你有五个以上的主机,我建议你改用“线程池”体系结构和工作单元队列。但是,只有五个,坚持“专用线程”模型比较容易(特别是因为标准库中没有线程池,因此你需要第三方包,例如threadpool ...或许多微妙的自定义程序)你自己的代码;-)。
我淘汰了1台计算机,所以我只需要4台。我忘了提一下,所有数据稍后都会在脚本中进行不同的处理,并且据我所知,您的代码(I PyN00b)将同时打印所有计算机上的所有数据,但是我如何才能仅从一台主机处理数据呢?而且所有主机都有不同的通过权限,所以我可以将它们全部放入workon()吗?Ty,请快速重播Alex。问候
@konjo,您可以在刚刚获取数据的线程中执行数据的处理-我之所以使用
print
它,只是因为那是您在问题中所做的。当然host
,如果您需要对其的不同值执行不同的处理,则处理过程可能涉及检查的值。或者,您可以编写多个函数以target=
在您的线程中使用:没有约束,所有线程都必须运行相同的函数!好的,我能够对所有4台计算机执行grep操作,但是现在所有数据都已合并。我如何从每个主机提取数据,能否举个例子,请扩展上面的例子?问候
Ty Alex为此,我认为您误会了我,我确实从上面接受了您的建议和示例,但是我在编程方面是新手,所以我只需要更多提示。我已经完成了上面针对不同cmd命令所做的修改。再说一遍。问候
@konjo,在Stack Overflow上,是让问题的提问者“接受”答案的意思是,单击答案左侧的复选标记形状的图标-这可以使提问者获得一些声望,并且使回答者具有更多的声誉。您的“接受0%”表示您从未做到过,这令人感到莫名其妙。