用的昨天刚接触到的库,在windows下通过paramiko来登录linux系统并执行了几个命令,基本算是初试成功,后面会接着学习的。
代码:
>>> import paramiko>>> ssh = paramiko.SSHClient()>>> ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())>>> ssh.connect('10.104.6.8',username = 'xiaopeng',password='******')>>> cmd = 'cd' #进入用户目录home>>> stdin,stdout,stderr = ssh.exec_command(cmd)>>> cmd = 'ls >test' #管道,ls命名的输出到文件test里面>>> stdin,stdout,stderr = ssh.exec_command(cmd)>>> cmd = 'cat test' # 显示test的内容,即ls命名的结果>>> stdin,stdout,stderr = ssh.exec_command(cmd)>>> print stdout.readlines() #结果 汉字用的字符显示['code/n', 'Desktop/n', 'order.cpp/n', 'python/n', 'test/n', '/xe5/x85/xac/xe5/x85/xb1/xe7/x9a/x84/n', '/xe6/xa8/xa1/xe6/x9d/xbf/n', '/xe8/xa7/x86/xe9/xa2/x91/n', '/xe5/x9b/xbe/xe7/x89/x87/n', '/xe6/x96/x87/xe6/xa1/xa3/n', '/xe4/xb8/x8b/xe8/xbd/xbd/n', '/xe9/x9f/xb3/xe4/xb9/x90/n']
这里我们都会发现,使用exec_command('cd dirname')时并不会切换目录,execute_command() 是a single session,每次执行完后都要回到缺省目录。所以可以 .execute_command('cd /var; pwd')。
python里面的paramiko模块,用这个实现ssh登录更加简单。看下面的代码:
#-*- coding: utf-8 -*- #!/usr/bin/python import paramiko import threading def ssh2(ip,username,passwd,cmd): try: ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(ip,22,username,passwd,timeout=5) for m in cmd: stdin, stdout, stderr = ssh.exec_command(m) # stdin.write("Y") #简单交互,输入 ‘Y' out = stdout.readlines() #屏幕输出 for o in out: print o, print '%s/tOK/n'%(ip) ssh.close() except : print '%s/tError/n'%(ip) if __name__=='__main__': cmd = ['cal','echo hello!']#你要执行的命令列表 username = "" #用户名 passwd = "" #密码 threads = [] #多线程 print "Begin......" for i in range(1,254): ip = '192.168.1.'+str(i) a=threading.Thread(target=ssh2,args=(ip,username,passwd,cmd)) a.start()
上面的程序还是有些技巧的:
1.利用多线程,同时发出登录请求,同时去连接电脑,这样速度快很多,我试了一下,如果不用多线程,直接一个一个挨着执行的话,大约5~10秒钟才能对一台电脑操作完,具体时间要根据命令的来决定,如果是软件安装或者卸载时间要更长一些。这样下来怎么也要一二十分钟,用多线程后就快多了,所有的命令执行完用了不到2分钟!
2.最好用root用户登录,因为安装或者卸载软件的时候如果用普通用户又会提示输入密码,这样又多了一次交互,处理起来就比较麻烦!安装软件时apt-get install xxx 最好加上“-y”参数,因为有时安装或删除软件时提示是否继续安装或卸载,这又是一次自动交互!加上那个参数后就没有人机交互了。
3.循环时循环所有ip,因为计算机的ip是路由器自动分配的,保险起见,最好全部都执行,保证没有遗漏的主机
4.远端执行命令时如果有交互,可以这样用 stdin.write("Y")来完成交互,“Y”就是输入“Y”。
5.把所有的命令放到一个列表里面,遍历列表可以依次执行列表里面的命令
新闻热点
疑难解答