使用python远程操作linux服务器

python测试开发人工智能安全 发布于 2014/05/08 22:08
阅读 902
收藏 9

概述

  • 功能:实现同时对多台linux服务器通过ssh执行同一命令。

  • 技术基础: python pexpect,部支持windows。

  • 参数:

    • 固定参数pwd:远程服务器密码,用户名目前写死是root,可自行修改。

    • 可选参数-c CMDS:要执行的命令,比如:"ls -l","cd /home/test && test.py&如果不选择,会从当前目前的cmd.txt读取。

    • 可选参数-s SERVERS:目标服务器,比如192.168.0.1,最后一位数可以用-表示一个区间,分号用于分割不同的ip。如果不选择,会从当前目前的ip.txt读取。

主脚本

01 #!/usr/bin/python# -*- coding: utf-8 -*-# Author:         Rongzhong Xu# CreateDate: 2014-05-06import argparseimport common# deal with argumentsparser = argparse.ArgumentParser()parser.add_argument('pwd', action="store",help=u'password')parser.add_argument('-c', dest='cmds', action="store", help=u'command')parser.add_argument('-s', dest='servers', action="store", help=u'hosts')parser.add_argument('--version', action='version',
02     version='%(prog)s 1.1 Rongzhong xu 2014 05 08')options = parser.parse_args()servers = []if options.servers:
03     raw_server = options.servers.split(';')
04     for server in raw_server:
05         if '-' in server:
06             server_list = server.split('.')
07             base = '.'.join(server_list[:3])
08             indices = server_list[-1].split('-')
09             start, end = indices            for item in range(int(start),int(end)+1):
10                 servers.append('{0}.{1}'.format(base,item))
11                  
12         else:
13             servers.append(server) else:
14     for item in open('ip.txt'):
15         servers.append(item)   
16         cmds = []        if options.cmds:
17     cmds.append(options.cmds)else:
18     for item in open('cmd.txt'):
19         servers.append(item)            
20     for host in servers:
21     print 
22     print("*"*80)
23     print("\nConnect to host: {0}".format(host))
24     c = common.Ssh()
25     c.connect(host,'root',options.pwd)
26     for item in cmds:
27         c.command(item)
28     c.close()

ssh 登陆类库

01 class Ssh(object):
02      
03     client = None
04  
05     @classmethod
06     def connect(cls,ip,username="root",password="123456", prompt=']#',
07         silent=False):
08  
09         # Ssh to remote server
10         ssh_newkey = 'Are you sure you want to continue connecting'
11         child = pexpect.spawn('ssh '+ username + '@'+ ip, maxread=5000)
12          
13         i = 1
14         # Enter password
15         while i != 0:
16             i = child.expect([prompt, 'assword:*', ssh_newkey, pexpect.TIMEOUT, 
17                 'key.*? failed'])
18             if not silent:
19                 print child.before,child.after,            
20             if i == 0: # find prompt
21                 pass      
22             elif i == 1: # Enter password
23                 child.send(password +"\r")  
24             if i == 2: # SSH does not have the public key. Just accept it.
25                 child.sendline ('yes\r')               
26             if i == 3: # Timeout
27                 raise Exception('ERROR TIMEOUT! SSH could not login. ')
28             if i == 4: # new key
29                 print child.before,child.after,
30                 os.remove(os.path.expanduser('~')+'/.ssh/known_hosts')                     
31  
32         Ssh.client = child        
33  
34  
35  
36     @classmethod
37     def command(cls,cmd, prompt=']#', silent=False):
38         Ssh.client.buffer = ''
39         Ssh.client.send(cmd + "\r")
40         #Ssh.client.setwinsize(400,400)
41         Ssh.client.expect(prompt)
42         if not silent:        
43             print Ssh.client.before, Ssh.client.after,
44         return Ssh.client.before, Ssh.client.after    
45      
46     def close(cls,):
47         Ssh.client.close()

实例

01 # ./batch.py -husage: batch.py [-h] [-c CMDS] [-s SERVERS] [--version] pwdpositional arguments:  pwd         password
02  
03 optional arguments:
04   -h, --help  show this help message and exit
05   -c CMDS     command
06   -s SERVERS  hosts
07   --version   show program's version number and exit
08  
09 # ./batch.py password -s "192.168.0.71-76;123.1.149.26" -c "cat /etc/redhat-release"
10  
11 ********************************************************************************
12  
13 Connect to host: 192.168.0.71
14 Last login: Thu May  8 17:04:02 2014 from 183.14.8.49
15 [root@localhost ~ ]# cat /etc/redhat-release
16 CentOS release 5.8 (Final)
17 [root@localhost ~ ]#
18 ********************************************************************************
19  
20 Connect to host: 192.168.0.72
21 Last login: Thu May  8 17:03:05 2014 from 192.168.0.232
22 [root@localhost ~ ]# cat /etc/redhat-release
23 CentOS release 5.8 (Final)
24 [root@localhost ~ ]#
25 ********************************************************************************
26  
27 Connect to host: 192.168.0.73
28 Last login: Thu May  8 17:02:29 2014 from 192.168.0.232
29 [root@localhost ~ ]# cat /etc/redhat-release
30 CentOS release 5.8 (Final)
31 [root@localhost ~ ]#
32 ********************************************************************************
33  
34 Connect to host: 192.168.0.74
35 Last login: Thu May  8 17:02:32 2014 from 192.168.0.232
36 [root@localhost ~ ]# cat /etc/redhat-release
37 CentOS release 5.8 (Final)
38 [root@localhost ~ ]#
39 ********************************************************************************
40  
41 Connect to host: 192.168.0.75
42 root@192.168.0.75's p assword:  
43 Last login: Thu May  8 17:02:56 2014 from 192.168.0.232[root@localhost ~ ]# cat /etc/redhat-releaseCentOS release 6.4 (Final)[root@localhost ~ ]#********************************************************************************
44  
45 Connect to host: 192.168.0.76
46 Last login: Thu May  8 17:03:00 2014 from 192.168.0.232[root@localhost ~ ]# cat /etc/redhat-releaseCentOS release 5.8 (Final)[root@localhost ~ ]#********************************************************************************
47  
48 Connect to host: 123.1.149.26
49 Last login: Thu May  8 16:46:56 2014 from 183.56.157.199[root@LINUX ~ ]# cat /etc/redhat-releaseRed Hat Enterprise Linux Server release 6.5 (Santiago)[root@LINUX ~ ]#[root@AutoTest batch]#

本文地址

参考资料

加载中
0
Xsank
Xsank

这个代码还是重新编辑下吧

返回顶部
顶部