• 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
  • 相关阅读:
    Visual Studio 进行单元测试时如何附加被测试文件的方法总结
    PowerDesigner实体模型CDM中关于建立Entity之间关系的备忘
    【转帖】C# 与 C++ 数据类型对照
    【转帖】解决继承窗体或用户控件时“visual继承当前被禁用,因为基类引用设备特定的组件或包含 p/invoke”问题
    【Winform窗体控件开发】之五 实现类型转换器TypeConverterAttribute
    SQL 使用CONVERT函数 格式化日期
    【转帖】const 与 readonly 的区别
    【转帖】C#与C Windows API数据类型对应关系
    【.Net Compact Framework开发】 使用 Visual Studio 对移动项目进行Unit Testing的方法总结
    【部署】Visual Studio 2008 打包部署.Net Framework 2.0 应用程序提示需要安装.Net Framework 3.5的解决方法
  • 原文地址:https://www.cnblogs.com/yexiaochong/p/5459489.html
Copyright © 2020-2023  润新知