zoukankan      html  css  js  c++  java
  • Python 模块功能paramiko SSH 远程执行及远程下载

    模块 paramiko

    paramiko是一个用于做远程控制的模块,使用该模块可以对远程服务器进行命令或文件操作,值得一说的是,fabric和ansible内部的远程管理就是使用的paramiko来现实。

    1、下载安装

    # pycrypto,由于 paramiko 模块内部依赖pycrypto,所以先下载安装pycrypto
    
    # 下载安装 pycrypto
    wget http://files.cnblogs.com/files/wupeiqi/pycrypto-2.6.1.tar.gz
    tar -xvf pycrypto-2.6.1.tar.gz
    cd pycrypto-2.6.1
    python setup.py build
    python setup.py install
    
    # 进入python环境,导入Crypto检查是否安装成功
    
    # 下载安装 paramiko
    wget http://files.cnblogs.com/files/wupeiqi/paramiko-1.10.1.tar.gz
    tar -xvf paramiko-1.10.1.tar.gz
    cd paramiko-1.10.1
    python setup.py build
    python setup.py install

    代码远程下载模板

    def remote_scp(host_ip,remote_path,local_path,username,password):  
      
        t = paramiko.Transport((host_ip,22))  
      
        t.connect(username=username, password=password)  # 登录远程服务器  
      
        sftp = paramiko.SFTPClient.from_transport(t)   # sftp传输协议  
      
        src = remote_path   
      
        des = local_path  
      
        sftp.get(src,des)  
      
        t.close()  
    View Code

    远程执行命令 通过用户名密码

    #!/usr/bin/env python
    #coding:utf-8
    
    import paramiko
    
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect('ip address', 22, 'user', 'passwd')
    stdin, stdout, stderr = ssh.exec_command('df')
    print stdout.read()
    ssh.close();
    执行命令

    远程执行命令 通过秘钥

    import paramiko
    
    private_key_path = '/home/auto/.ssh/id_rsa'
    key = paramiko.RSAKey.from_private_key_file(private_key_path)
    
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect('主机名 ', 端口, '用户名', key)
    
    stdin, stdout, stderr = ssh.exec_command('df')
    print stdout.read()
    ssh.close()
    秘钥执行命令

    上传下载

    import os,sys
    import paramiko
    
    t = paramiko.Transport(('182.92.219.86',22))
    t.connect(username='wupeiqi',password='123')
    sftp = paramiko.SFTPClient.from_transport(t)
    sftp.put('/tmp/test.py','/tmp/test.py') 
    t.close()
    
    
    import os,sys
    import paramiko
    
    t = paramiko.Transport(('182.92.219.86',22))
    t.connect(username='wupeiqi',password='123')
    sftp = paramiko.SFTPClient.from_transport(t)
    sftp.get('/tmp/test.py','/tmp/test2.py')
    t.close()
    上传或者下载文件 - 通过用户名和密码
    import paramiko
    
    pravie_key_path = '/home/auto/.ssh/id_rsa'
    key = paramiko.RSAKey.from_private_key_file(pravie_key_path)
    
    t = paramiko.Transport(('182.92.219.86',22))
    t.connect(username='wupeiqi',pkey=key)
    
    sftp = paramiko.SFTPClient.from_transport(t)
    sftp.put('/tmp/test3.py','/tmp/test3.py') 
    
    t.close()
    
    import paramiko
    
    pravie_key_path = '/home/auto/.ssh/id_rsa'
    key = paramiko.RSAKey.from_private_key_file(pravie_key_path)
    
    t = paramiko.Transport(('182.92.219.86',22))
    t.connect(username='wupeiqi',pkey=key)
    
    sftp = paramiko.SFTPClient.from_transport(t)
    sftp.get('/tmp/test3.py','/tmp/test4.py') 
    
    t.close()
    上传或下载文件 - 通过密钥

    实战:

    公司发布代码更新服务器 远程部署  代码编写

    #!/usr/bin/env python
    #_*_ coding:utf-8 _*_
    __author__ = 'yiyezi'
    #导入模块
    import os
    import sys
    import paramiko
    import time
    import re
    #相应目录变量
    bak_cmd = 'tar zcvf /backup/web.tar.gz' 
    wget_dir = '/update'
    download = 'http://192.168.1.19/'
    app_dir = '/application/data'
    app_data = '/application/data/*'
    bak_time = time.strftime('%Y_%m_%d_%H:%M:%S')
    bak = bak_cmd + bak_time
    
    #ssh远程连接
    def ssh(ip,port,username,passwd,cmd):
        paramiko.util.log_to_file('/tmp/test')
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        ssh.connect(ip, port, username, passwd)
        stdin, stdout, stderr = ssh.exec_command(cmd)
        print stdout.read()
        ssh.close();
    #部署
    def app(apps):
        appname = re.split('d',apps)
        if '.war' in apps:
            de_cmd = "cd %s; %s %s;wget %s%s;rm -rf %s;unzip %s -d %s;/bin/sh /scripts/reboot.sh;" % (app_dir,bak,app_data,download,apps,appname[0],apps,appname[0])
            print (de_cmd)
        elif 'tar.gz' in apps:
            de_cmd = "cd %s;%s %s;wget %s%s;rm -rf %s;tar zxvf *.tar.gz;sh /scripts/restart.sh;" %(app_dir,bak,app_data,download,apps,appname[0])
        else:
            print ("请输入正确的包!")
            sys.exit()
        ssh("192.168.1.19",22,'root','123123',de_cmd)
        print ('==========================END========================================')
    
    
    def web(apps):
        appname = re.split('-d',apps)
        if '.war' in apps:
            de_cmd = "cd %s; %s %s;wget %s%s;rm -rf %s;unzip %s -d %s;/bin/sh /scripts/reboot.sh;" % (app_dir,bak,app_data,download,apps,appname[0],apps,appname[0])
            print (de_cmd)
    
        elif 'tar.gz' in apps:
            de_cmd = "cd %s;%s %s;wget %s%s;rm -rf %s;tar zxvf *.tar.gz;sh /scripts/restart.sh;" %(app_dir,bak,app_data,download,apps,appname[0])
    
        else:
            print ("请输入正确的包!")
            sys.exit()
        ssh("192.168.1.11",22,'root','123123',de_cmd)
        print ('==========================END========================================')
    
    
    
    
    
    IP = ["192.168.1.11","192.168.1.19"]
    
    
    def information():
        msg = '''
            33[35m----------------------select server update---------------------33[0m
            + 服务器编号        IP            应用                               
            +    1              %s            web                                
            +    2              %s            app                                
            33[35m---------------------------------------------------------------33[0m
     '''% (IP[0],IP[1])
        print(msg)
    
    
    if __name__ == '__main__':
        information()
        while True:
            num = raw_input("33[34m请输入你要更新的服务器编号 例如 1 >>33[0m")
            if num == '1':
                print('33[32m----------------------------------Update scripts start,please wait....................33[0m')
                time.sleep(5)
                
                web("web-2020.tar.gz")
                print('33[32m----------------------------------update Success!--------------------------------------33[0m')
            break
            elif num == '2':
                print('33[32m----------------------------------Update scripts start,please wait....................33[0m')
                time.sleep(5)
                app("web.war")
                print('33[32m----------------------------------update Success!--------------------------------------33[0m')
                break
            elif len(num) == 0:
                os.system("echo -e '7'")
                print("33[5;31m输入有误!请重新输入33[0m")
            else:
                os.system("echo -e '7'")
                print("33[5;31m请输入正确的编号33[0m")
    View Code
  • 相关阅读:
    C++中的new、operator new与placement new
    Eigen教程(11)
    Eigen教程(10)
    Eigen教程(9)
    Eigen教程(8)
    Eigen教程(5)
    Eigen教程(4)
    Eigen教程(3)
    makefile:n: *** missing separator. Stop
    jenkins X实践系列(3) —— jenkins X 安装拾遗
  • 原文地址:https://www.cnblogs.com/yexiaochong/p/5459489.html
Copyright © 2011-2022 走看看