使用Python之paramiko模块和线程实现多线程登录多台Linux服务器

  

,,,,,,,,有时候我们需要在多台Linux服务器上面执行同样的命令,或者同样的操作,如果我们每一台单独登录上去做这样太麻烦了,所以我们可以考虑使用自动化脚本来实现。我这里使用Python多线程的方式,这样速度更快,如果使用壳只能一台完了执行另外一台效率不高。

,,,,,,,,针对这样的需要写了一个Python脚本来完成这样的工作,大致实现了我需要的效果


实现代码:

# !/usr/bin/Python   # * - *编码:utf8 * - *      ”“”   此脚本适用于批量登录到Linux操作系统,并执行一些简单命令   要求所有服务器的用户名密码一样,或者密钥一样,都能使用同一种方法登录   执行的命令默认只输入第一行,如果要输出多行需要修改ssh_login函数   默认脚本是以用户名密码登录,也可以改为用密钥登录   选项特殊说明:   c:后面跟要执行命令,命令如w,正常运行时间、主机名、日期等,如果命令中有空格,需要用双引号,如“cat /etc/主机”   ——:后面跟主机,有三种写法192.168.1.31指单台主机,192.168.1.31,192.168.132,指定多台主机,把逗号换成”——“指定区间      如果有很多主机,但用户名密码不一样,登录方法也不一样,可以考虑把这些信息写入到一个文件,   通过对文件遍历来完成复杂环境的需求   ”“”      import  paramiko   得到optparse  import  OptionParser   import 系统   import  netaddr   import 线程      #使用选项帮助信息可以使用中文   重载(系统)   sys.setdefaultencoding (“utf - 8”)      #定义选项   时间=usage  sys.argv[0], +,”,[选项)”   时间=parser  OptionParser(使用)   parser.add_option (“c”,“——指令”,   ,,,,,,,,,,,,,,,,,dest=爸噶睢?   ,,,,,,,,,,,,,,,,,action=吧痰辍?   ,,,,,,,,,,,,,,,,,默认=False,   ,,,,,,,,,,,,,,,,,帮助='你要执行的命令,如:正常运行时间”)   parser.add_option(' - ',,,主机,   ,,,,,,,,,,,,,,,,,dest=爸骰?   ,,,,,,,,,,,,,,,,,action=吧痰辍?   ,,,,,,,,,,,,,,,,,默认=False,   ,,,,,,,,,,,,,,,,,帮助=的需要执行命令的主机,跟主机IP地址,多个IP用逗号分隔,也可以用”——“连接一个主机范围”)   选择,,args =, parser.parse_args ()      def  ssh_login (ip,指令):   ,,,”登录并执行命令,可以更改为使用密钥登录”   ,,,ssh =, paramiko.SSHClient ()   ,,,ssh.set_missing_host_key_policy (paramiko.AutoAddPolicy ())   ,,,ssh.connect(主机名=ip,端口=22日,用户名=?,密码=皃-0p-0p-0”)   ,,,stdin,, stdout,, stderr =, ssh.exec_command(指令)   ,,,print(%年代\ t % s, % (ip, stdout.readline () .rstrip ()))   ,,,ssh.close ()      if  __name__ ==,“__main__”:   ,,,if  not  options.commond:   ,,,,,,,印刷(“请指定要执行的命令”)   ,,,,,,,退出(1)   ,,,if  not  options.host:   ,,,,,,,印刷(“请指定主机”)   ,,,,,,,退出(1)      ,,,if  ', ',拷贝options.host:   ,,,,,,,ip =, options.host.split (" ")   ,,,,,,,for 小姐:ip:拷贝   ,,,,,,,,,,,t =, threading.Thread(目标=ssh_login, arg游戏=(我,options.commond)),,, #使用线程方式执行,更快   ,,,,,,,,,,,t.start ()   ,,,elif “-”,拷贝options.host:   ,,,,,,,startip =, options.host.split (“-”) [0]   ,,,,,,,endip =, options.host.split (“-”) [1]   ,,,,,,,ip =,列表(netaddr.IPRange (startip, endip)),,,,,,,, # netaddr.IPRange()用于计算IP地址区间内的所有IP   ,,,,,,,for 小姐:ip:拷贝   ,,,,,,,,,,,t =, threading.Thread(目标=ssh_login, arg游戏=(str(我),options.commond))   ,,,,,,,,,,,t.start ()   ,,,:   ,,,,,,,ip =options.host   ,,,,,,,ssh_login (ip, options.commond)


执行方式及结果如下:

使用Python之paramiko模块和线程实现多线程登录多台Linux服务器


使用Python之paramiko模块和线程实现多线程登录多台Linux服务器