zoukankan      html  css  js  c++  java
  • 我的第一个Python随笔

      自学Python也很长时间了,注册博客园写了第一篇随笔。之前想过很多次,但是始终不知道该怎么开始,内容如何,现在想想,随笔嘛,是自己的想法,也自己的实践,又是自己的锻炼。话不多说,开始今天的正式内容。

    Python的paramiko模块。

      paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接。由于使用的是python这样的能够跨平台运行的语言,所以所有python支持的平台,如Linux, Solaris, BSD, MacOS X, Windows等,paramiko都可以支持,因此,如果需要使用SSH从一个平台连接到另外一个平台,进行一系列的操作时,paramiko是最佳工具之一。  

    SSHClient

    用于连接远程服务器并执行基本命令

    基于用户名密码连接:

    import paramiko
      
    # 创建SSH对象
    ssh = paramiko.SSHClient()
    # 允许连接不在know_hosts文件中的主机
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    # 连接服务器
    ssh.connect(hostname='192.168.30.129', port=22, username='sunqi', password='43797189')
      
    # 执行命令
    stdin, stdout, stderr = ssh.exec_command('df')
    # 获取命令结果
    result = stdout.read()
      
    # 关闭连接
    ssh.close()

     

    示例代码:

     1 import paramiko
     2 
     3 ssh = paramiko.SSHClient()
     4 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy)
     5 ssh.connect(hostname='192.168.30.129',port=22,username='root',password='43797189')#测试机器为Linux虚拟机(CentOS 7)
     6 while True:
     7     cmd = input('>>:')
     8     stdin,stdout,stderr = ssh.exec_command(cmd)
     9     result = stdout.read()
    10     if stdout:
    11         print(str(result,'utf8'))
    12     else:
    13         print(str(stderr.read(),'utf8'))
    14 
    15 ssh.close()

    SFTPClient

    用于连接远程服务器并执行上传:

    import paramiko
    
    '''
    从windows上传文件到Linux虚拟机
    IP地址: 192.168.30.129
    端口:22
    '''
    host = '192.168.30.129'
    port = 22
    
    t = paramiko.Transport((host,port))
    t.connect(username="root",password='43797189',)
    sftp = paramiko.SFTPClient.from_transport(t)
    target_path = '/var/log/windows.log'
    local_path = 'E:\sunqi.log'
    sftp.put(local_path,target_path)
    t.close()

    最后将多线程和这个paramiko模块综合起来写了一个批量主机管理程序

    请看到的朋友原谅我的混乱代码规范,我会加倍努力的!

    批量主机管理系统远程连接主机实现命令的执行文件的上传下载:

    主机列表:

    示例代码:host_dir.py

    host_dic = {
        'group1':{
                'C1':{'host':'192.168.30.129','port':22,'username':'root','password':'43797189'},
                'C2':{'host':'192.168.30.130','port':22,'username':'root','password':'43797189'},
                'C3':{'host':'192.168.30.131','port':22,'username':'root','password':'43797189'}
        },
        'group2':{
                'C4':{'host':'192.168.30.132','port':22,'username':'root','password':'43797189'},
                'C5':{'host':'192.168.30.134','port':22,'username':'root','password':'43797189'},
                'C6':{'host':'192.168.30.135','port':22,'username':'root','password':'43797189'},
        }
    }

    运行代码:run_code.py

    import threading
    import paramiko
    import os
    from paramiko模块.批量主机管理小项目.host_dir import host_dic
    
    '''
    主机批量管理程序
    实现多个主机的同时管理
    利用多线程以及paramiko模块
    实现多个主机同时执行命令,上传或下载文件
    '''
    class host_manage():
        def __init__(self,host,port,username,password):
            self.host = host
            self.port = port
            self.username = username
            self.password = password
        def command(self,cmd):
            ssh = paramiko.SSHClient()
            ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy)
            ssh.connect(hostname=self.host,port=self.port,username=self.username,password=self.password)
            #cmd = input(">>:")
            stdin, stdout, stderr = ssh.exec_command(cmd)
            result = stdout.read()
            if stdout:
                print(str(result, 'utf8'))
            else:
                print(str(stderr.read(), 'utf8'))
    
        def upload(self):
            t = paramiko.Transport(self.host,self.port)
            t.connect(username=self.username,password=self.password)
            sftp = paramiko.SFTPClient.from_transport(t)
            target_path = '/var/log/windows.log'
            local_path = 'E:\sunqi.log'
            sftp.put(local_path,target_path)
            t.close()
            pass
        def download(self):
            pass
    def choose_group():
        print('可管理主机分组')
        for k in host_dic:
            print(k)
            for i in host_dic[k]:
                print(host_dic[k][i])
        group_num = input('>>:选择主机编号')
        return  group_num
    def run():
        num = choose_group()
        print('已选组号:%s' %num)
        selected = input(">>:输入即将进行的操作:command、upload、download")
        if selected =="command":
            cmd = input('>>:请输入要批量操作的命令:')
        thread_conut = []
        for i in host_dic[num]:
            func = host_manage(host=host_dic[num][i]['host'],port=host_dic[num][i]['port'],username=host_dic[num][i]['username'],password=host_dic[num][i]['password'])
            if hasattr(func,selected):
                p = threading.Thread(target=getattr(func,selected),args=(cmd,))
                thread_conut.append(p)
                p.start()
        for i in thread_conut:
            i.join()
    
    
    if __name__ == '__main__':
        run()

      

  • 相关阅读:
    JavaBean 与 EJB 的区别
    MFC选项卡的实现
    MFC的图片按钮
    windows 下使用 MinGW + msys 编译 ffmpeg
    在windows使用vs2008编译live555
    C89 和 C99 标准比较
    11.求二元查找树的镜像[MirrorOfBST]
    10.排序数组中和为给定值的两个数字[Find2NumbersWithGivenSum]
    9.链表中倒数第k个结点[FindReverseKthLinkedListNode]
    8.另类方法求1+2+...+n[AnotherMethodOfCalculateSumN]
  • 原文地址:https://www.cnblogs.com/SunQi-Tony/p/8494908.html
Copyright © 2011-2022 走看看