• python自动化远程传输文件,远程执行命令


    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # @Date    : 2019-12-13 16:35:33
    # @Author  : Zhongyi Qiao 
    # @Link    : ${link}
    # @Version : $Id$
    import sys,os,getopt
    import paramiko
    import threading
    import configparser
    from scp import SCPClient
    
    def getConnection(ip,username,password,command,port=22,local_filename="",remotepath="",remote_filename="",localpath=""):
        """
        :param ip: 服务器的ip
        :param username:  服务器的用户名称
        :param password:  服务器的密码
        :param CMD:  服务器的命令
        :param port:  服务器的端口
        """
        ssh = paramiko.SSHClient()
        policy = paramiko.AutoAddPolicy()
        ssh.set_missing_host_key_policy(policy)
        ssh.connect(
            hostname = ip,  # 服务器的ip
            port = port,  # 服务器的端口
            username = username,  # 服务器的用户名
            password = password  # 用户名对应的密码
        )
    
    #传输文件
        if command:
            stdin, stdout, stderr = ssh.exec_command(command)
            result = stdout.read().decode()
            error = stderr.read().decode()
            print("+++++++++++++++++++++++start++++++++++++++++++++")
            print("[connect success] | ip : %s" % ip)
            print("result: 
     %s"%result)
            if error != " ":
                print("error: 
     %s"%error)
            print("+++++++++++++++++++++++done++++++++++++++++++++")
        if all([local_filename,remotepath]):
            scpclient=SCPClient(ssh.get_transport(), socket_timeout=15.0)
            scpclient.put(local_filename, remotepath)
        if all([remote_filename,localpath]):
            scpclient=SCPClient(ssh.get_transport(), socket_timeout=15.0)
            scpclient.get(remote_filename,localpath)
        ssh.close()
    #读取配置文件
    def read_conf(config):
        cf = configparser.ConfigParser()
        filename = cf.read(config)
        opt = cf.options("hosts")
        host_list = []
        for ooo in opt:
            tmp_host = cf.get("hosts",ooo)
            host_list.append(tmp_host.split(","))
        return host_list
    
    #采用多线程
    def multi_thread(thread_target,args_lists):
        thread_list = []
        for args_tuple in args_lists:
            #args_tuple=[(ip.strip(),username.strip(),password.strip(),command,"local_filename=","remote_filename=","remote_filename=","localpath=")]
            thread = threading.Thread(target = thread_target, args = args_tuple)
            thread_list.append(thread)
        for tmp_argv in thread_list:
            tmp_argv.start()
        for tmp_argv in thread_list:
            tmp_argv.join()
    
    
    def main():
        #初始化参数
        ip=""
        username=""
        password=""
        config=""
        conf=""
        command=""
        local_filename=""
        remotepath=""
        remote_filename=""
        localpath=""
        #获取外参
        opts,args = getopt.getopt(sys.argv[1:], "hH:U:P:f:c:p:u:g:d:", ["help","host=","username","password","conf","command","local_filename","remotepath","remote_filename","localpath"])
        for o,a in opts:
            if o in ("-h", "--help") or not o:
                print ('Usage:python3 remote_cmd.py  [options]... ')
                print ("""Script supports remote command execution, file upload and file download
                    The script supports remote command execution, file upload and file download;
                    the host can be a target or multiple hosts; 
                    the single host uses the - H IP - U username - P password parameter; 
                    the multiple hosts use the format of the configuration file host.ini; 
                    the content of the host.ini file takes [host] as the first line, 
                    the second line uses the format of id = IP, username, passwd. 
                    Examples are as follows:
                  -H  :host ip -H 192.168.11.11
                  -U  :-U uername  
                  -P  :-P passwd
                  -f  :config file host.ini配置如下
                      [hosts]
                      ###hostname=ip,username,password
                      1 = 192.168.152.131,root,123456
                      2 = 192.168.152.132,autotest,123456
                      3 = 192.168.152.133,root,123456
                      4 = 192.168.152.134,root,123456
                  -c  :command  -c 'ls ~/'
                  -p  :local filename -u  :remote path
                  -g  :remote filename  -d  :local path
                Usage :python3 remote_cmd.py -f /home/host.ini -c 'pwd' #remote hosts execute command , the list of host in the host.ini
                        python3 remote_cmd.py -f /home/conf/host.ini -p test.py -u /home/autotest ##Upload files to remote host
                        python3 remote_cmd.py -H '192.168.152.131' -U 'autotest' -P 'qia'  -g ~/Videos.tar -d /home/autotest/test/ ###get remote file download /home/autotest/tests
                        python3 remote_cmd.py -H '192.168.152.131' -U 'autotest' -P 'qia' -c 'pwd' ##remotehost execute command
                """)
                sys.exit()
            if o in ("-H","--host"):
                ip=a
               # print(ip)
            if o in ("-U","--username"):
                username=a
               # print(username)
            if o in ("-P","--password"):
                password=a
               # print(password)
            if o in ("-f","--conf"):
                config=a
                #print(config)
            if o in ("-c","--command"):
                command=a
                #print(command)
            if o in ("-p","--local_filename"):
                local_filename=a
              #  print(local_filename)
            if o in ("-u","--remotepath"):
                remotepath=a
              #  print(remotepath)
            if o in ("-g","--remote_filename"):
                remote_filename=a
                #print(remote_filename)
            if o in ("-d","--localpath"):
                localpath=a
               # print(localpath)
        #判断是读参数还是读配置文件
        host_list=[]
        if all([ip,username,password]) and not config:
             host_list=[(ip,username,password)]
        elif  config:
            host_list=read_conf(config)
        args_lists=[]
        if not host_list:
            print("Usage:python3 remote_cmd.py -h")
        for ip,username,password in host_list:
            args_lists.append([ip.strip(),username.strip(),password.strip(),command,22,local_filename,remotepath,remote_filename,localpath])
        multi_thread(getConnection,args_lists)
    
    
    
    if __name__ == "__main__":
    
        main()
  • 相关阅读:
    Linux下vim中文乱码问题
    phoniex初始化
    [Android] 修改ImageView的图片颜色
    [osx] android studio下修改avd的hosts文件
    [osx] 设置crontab
    [osx] 查看端口被占用
    [Ubuntu] change mouse scrolling between standard and natural
    [Vuejs] 关于vue-router里面的subRoutes
    [nodejs] Error: unable to verify the first certificate
    [SublimeText] 安装包管理
  • 原文地址:https://www.cnblogs.com/jonyq/p/13063590.html
Copyright © 2020-2023  润新知