• python 管理ssh客户端


      1 root@zenghui:~/python# cat ipnew.txt
      2 vm_esxi133,192.168.11.133,22,1qaz2wsx,root,0
      3 int_www45,192.168.11.45,22,wdzj201445,root,0
      4 int_23,192.168.11.23,22,wdzj2014,root,0
      5 int_24,192.168.11.24,2022,wdzjkey,salt,1
      6 root@zenghui:~/python# cat ip_ssh.py 
      7 #!/usr/bin/python
      8 #-*- coding:utf-8 -*-
      9 import pexpect,commands,os,re,sys
     10 import struct, fcntl, signal,termios
     11 ip_new=open('ipnew.txt','a+')
     12 global ipaddress,ipaddresskey
     13 ipaddress={}
     14 ipaddresskey={}
     15 
     16 #从ipnew.txt获取内容加入ipaddress字典中
     17 def ip_name():
     18     file=open('ipnew.txt','r').readlines()
     19     ii=0
     20     for i in file:
     21     ii+=1
     22         aa=i.split(',')
     23         ipaddress.setdefault(ii,[aa[0],[aa[1],aa[2],aa[3],aa[4],aa[5]]])
     24         ipaddresskey.setdefault(aa[0],[aa[1],aa[2],aa[3],aa[4],aa[5]])
     25     #print ipaddress    
     26 #添加用户
     27 def ipadd():
     28     ipre=[]
     29     namere=[]
     30     portre=[]
     31     pwre=[]
     32     keyre=[]
     33     usernamere=[]
     34     while namere==[]:
     35         name=str(raw_input('请输入你的项目名称: '))
     36         namere=re.findall('w+',name)
     37         if len(namere) > 1 or ipaddresskey.has_key(name)==True:
     38             print '你输入的格式不对或名称已经存在,请重新输入!'
     39             namere=[]
     40             
     41     while ipre==[]:
     42         ip=str(raw_input('请输入ip地址:192.168.11.23: '))
     43         ipre=re.findall('d{1,3}.d{1,3}.d{1,3}.d{1,3}',ip)
     44         if len(ipre) > 1:
     45             ipre=[]
     46     while portre==[]:
     47         port=str(raw_input('请输入端口号:22: '))
     48         portre=re.findall('d{1,5}',port)
     49         if len(portre) > 1:
     50             portre=[]
     51             
     52     while pwre==[]:
     53         pw=str(raw_input('请输入密码“: '))
     54         pwre=re.findall('S+',pw)
     55         if len(pwre) > 1:
     56             pwre=[]    
     57             
     58     while usernamere==[]:
     59         username=str(raw_input('输入用户名: '))
     60         usernamere=re.findall('w+',username)
     61         if len(usernamere) > 1:
     62             usernamere=[]
     63 
     64     while keyre==[]:
     65         key=str(raw_input('请输入key“: '))
     66         keyre=re.findall('S+',key)
     67         if len(keyre) > 1:
     68             keyre=[]    
     69 
     70     ipadd=str(name)+','+str(ip)+','+str(port)+','+str(pw)+','+str(username)+','+str(key)+'
    '
     71     ip_new.write(ipadd)
     72     print ipadd+'添加成功!'
     73     exit()
     74    # ip_new.close()
     75    # file.close()
     76 
     77 
     78 #主菜单
     79 def menu():
     80     os.system('clear')
     81     print '**************************MENU*****************************'
     82     for key,value in ipaddress.items():
     83         print str(key)+'   '+str(value[0])+'        '+str(value[1][0])
     84     print "回车退出!"
     85     print '***********************************************************'
     86     name=int(raw_input('请输入机器编号: '))
     87     if name == '':
     88     exit()
     89     ssh_command(ipaddress[name][1][0],ipaddress[name][1][1],ipaddress[name][1][2],ipaddress[name][1][3],ipaddress[name][1][4].strip())
     90     
     91 
     92 #用户登陆
     93 def ssh_command(ipaddr,port,passwd,name,key):
     94     try:
     95     global ssh_key
     96         if key == '0':
     97             keys=''
     98             ssh_key=pexpect.spawn('ssh %s -p  %s %s@%s' % (keys,port,name,ipaddr)) 
     99             status=ssh_key.expect(['password'])
    100         else:
    101             keys='-i id_dsa_key'
    102             ssh_key=pexpect.spawn('ssh %s -p  %s %s@%s' % (keys,port,name,ipaddr))
    103             status=ssh_key.expect([pexpect.TIMEOUT,'id_dsa_key'])
    104         if status==1:
    105             ssh_key.sendline(passwd)
    106         elif status==0:
    107             ssh_key.sendline('yes
    ')
    108             ssh_key.expect('password:')
    109             ssh_key.sendline(passwd)
    110         signal.signal(signal.SIGWINCH, sigwinch_passthrough)
    111         size = getwinsize()
    112         ssh_key.setwinsize(size[0], size[1])
    113         ssh_key.interact()
    114     except Exception as e:
    115         print e
    116 
    117 #设置终端大小适合窗口
    118 def sigwinch_passthrough (sig, data):
    119     winsize = getwinsize()
    120     global ssh_key
    121     ssh_key.setwinsize(winsize[0],winsize[1])
    122 #获取终端屏幕大小
    123 def getwinsize():
    124     if 'TIOCGWINSZ' in dir(termios):
    125         TIOCGWINSZ = termios.TIOCGWINSZ
    126     else:
    127         TIOCGWINSZ = 1074295912L # Assume
    128     s = struct.pack('HHHH', 0, 0, 0, 0)
    129     x = fcntl.ioctl(sys.stdout.fileno(), TIOCGWINSZ, s)
    130     return struct.unpack('HHHH', x)[0:2]
    131   
    132 
    133 if __name__ == "__main__":
    134     try:
    135     if len(sys.argv) == 2:
    136             if sys.argv[1]=='ipadd':
    137             ip_name()
    138                 ipadd()
    139         else:
    140             print '请输入参数"ipadd"'
    141     elif len(sys.argv) == 1:
    142             ip_name()
    143             menu()
    144     else:
    145         print '请重新输入!'
    146     except:
    147     pass
  • 相关阅读:
    python sys.argv[]
    python 继承
    python 类/对象
    Formily教程 | formily是中后台复杂场景的表单解决方案
    如何保障消息100%投递成功?如何保证消息幂等性
    rabbitmq延时重试队列
    IO多路复用之select、poll、epoll详解
    构建PHP微服务生态
    flutter dio 处理200以为的错误状态码
    [git] 如何查看 .patch 文件
  • 原文地址:https://www.cnblogs.com/zenghui940/p/4281086.html
Copyright © 2020-2023  润新知