zoukankan      html  css  js  c++  java
  • python 之 Paramiko学习

    paramiko模块,基于SSH用于连接远程服务器并执行相关操作。

    一、安装

    pip3 install paramiko

    二、使用

    SSHClient

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

    基于用户名密码连接:
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    # Author: DBQ(Du Baoqiang)
    
    import paramiko
    
    #创建ssh对象
    
    ssh = paramiko.SSHClient()
    
    #允许连接不在Know_hosts文件中的主机
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    
    #连接服务器
    ssh.connect(hostname='192.168.1.103',port=22,username='root',password='123456')
    
    #执行命令
    stdin,stdout,stderr = ssh.exec_command('ls /tmp/')
    
    #获取执行结果
    result = stdout.read()
    
    print(result.decode()) #返回的是bytes
    
    #关闭连接
    ssh.close()
    
    复制代码
    View Code
    基于公钥密钥连接:
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # auth : pangguoping
    
    import paramiko
    
    private_key = paramiko.RSAKey.from_private_key_file('/Users/daniel/.ssh/id_rsa')
    
    # 创建SSH对象
    ssh = paramiko.SSHClient()
    # 允许连接不在know_hosts文件中的主机
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    # 连接服务器
    ssh.connect(hostname='192.168.1.103', port=22, username='root', pkey=private_key)
    
    # 执行命令
    stdin, stdout, stderr = ssh.exec_command('df')
    # 获取命令结果
    result = stdout.read()
    print(result.decode())
    # 关闭连接
    ssh.close()
    View Code

    SFTPClient

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

    基于用户名密码 上传/下载
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    import paramiko
    
    
    transport = paramiko.Transport(('192.168.1.103',22))
    transport.connect(username='root',password='123456')
    
    sftp = paramiko.SFTPClient.from_transport(transport)
    
    #上传本地文件/Users/daniel/test/zhoulibo.mp4 上传到服务器的 /tmp/test.mp4
    sftp.put('/Users/daniel/test/test.mp4','/tmp/test.mp4')
    
    #将远端/tmp/zhoulibo.mp4 下载到 本地 /Users/daniel/test.mp4
    sftp.get('/tmp/zhoulibo.mp4','/Users/daniel/test.mp4')
    
    transport.close()
    View Code
    基于公钥/密钥的上传/下载:
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    import paramiko
    
    private_key = paramiko.RSAKey.from_private_key_file('/Users/daniel/.ssh/id_rsa')
    
    transport = paramiko.Transport(('192.168.1.103',22))
    transport.connect(username='root',pkey=private_key)
    
    sftp = paramiko.SFTPClient.from_transport(transport)
    
    #上传本地文件/Users/daniel/test/tt.mp4 上传到服务器的 /tmp/tt.mp4
    sftp.put('/Users/daniel/test/tt.mp4','/tmp/tt.mp4')
    
    #将远端/tmp/tt.mp4 下载到 本地 /Users/daniel/tt.mp4
    sftp.get('/tmp/tt.mp4','/Users/daniel/tt.mp4')
    
    transport.close()
    View Code
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    
    
    import paramiko,uuid
    
    class SSHConnection:
    
        def __init__(self,host='192.168.1.103',port=22,username='root',pwd='123456'):
            self.host = host
            self.port = port
            self.username = username
            self.pwd = pwd
            self.__k = None
    
        def create_file(self):
            file_name = str(uuid.uuid4())   #生成一个'46cad739-5937-4312-9156-00753b272581'的文件名 uuid并转换成str
            with open(file_name,'w') as f:  #打开文件,往里面写一个sb
                f.write('sb')
            return file_name
    
        def run(self):
            '''
            主方法
            :return:
            '''
            self.connect()
            self.upload('/tmp/test.py')   #调用upload方法,上传到服务器的/tmp/test.py
            self.rename('/tmp/test.py','/tmp/sb.py')  #改名为sb.py
            self.close()
    
        def connect(self):
            '''
            建立连接
            :return:
            '''
            transport = paramiko.Transport((self.host,self.port))
            transport.connect(username=self.username,password=self.pwd)
            self.__transport = transport
    
        def close(self):
            '''
            关闭连接
            :return:
            '''
            self.__transport.close()
    
        def upload(self,target_path):
            '''
            连接,上传
            :param target_path:
            :return:
            '''
            file_name = self.create_file()
            sftp = paramiko.SFTPClient.from_transport(self.__transport)
            #上传本地文件 到服务器的 test.py
            sftp.put(file_name, target_path)
    
        def rename(self, old_path, new_path):
            '''
            改名, 把/tmp/test.py 改名为 sb.py
            :param old_path:
            :param new_path:
            :return:
            '''
            ssh = paramiko.SSHClient()
            ssh._transport = self.__transport
            #执行命令
            cmd = "mv %s %s" %(old_path,new_path)
            stdin,stdout,stderr = ssh.exec_command(cmd)
            res = stdout.read()
    
        def cmd(self,command):
            '''
            可以执行其他命令
            :param command:
            :return:
            '''
            self.connect()
            ssh = paramiko.SSHClient()
            ssh._transport = self.__transport
            #执行命令
            stdin, stdout, stderr = ssh.exec_command(command)
            res = stdout.read()
            self.close()
            return res
    
    ha = SSHConnection()
    
    ha.run()
    res = ha.cmd('ls')
    print(res.decode())
    demo
  • 相关阅读:
    搭建Vmware Workstation 12 + Kylin 4.02(Ubuntu 16.04) + petalinux + Vivado
    dash 和 bash 切换
    centos的镜像下载
    docker部署redis,kafka
    Centos7下使用mail发送邮件配置
    实现内网主机既能访问yum源,又能curl通baidu,外网nginx的配置
    centos7下使用mysql离线安装包安装mysql5.7
    内网主机使用nginx代理访问阿里yum源
    配置阿里云yum源
    centos下查看cpu核数
  • 原文地址:https://www.cnblogs.com/pangguoping/p/5720657.html
Copyright © 2011-2022 走看看