zoukankan      html  css  js  c++  java
  • Python 基于Python实现的ssh兼sftp客户端(上)

    基于Python实现sshsftp客户端

     

    by:授客 QQ1033553122

     

    实现功能

    实现ssh客户端兼ftp客户端:实现远程连接,执行linux命令,上传下载文件

     

    测试环境

    Win7 64

     

    Python 3.3.4

     

    paramiko 1.15.2

    下载地址:

    https://pypi.python.org/pypi/paramiko/1.15.2

    https://pan.baidu.com/s/1i4SJ1CL

     

    cryptography-1.0-cp34-none-win_amd64.whl

    (如果paramiko可以正常安装完,则不需要安装该类库)

    下载地址:

    https://pypi.python.org/pypi/cryptography/1.0

    https://pan.baidu.com/s/1jIRBJvg

     

    安装好后,找到nt.py(本例中路径为:

    Libsite-packagespycrypto-2.6.1-py3.4-win-amd64.eggCryptoRandomOSRNG t.py),修改

    import winrandom

    from Crypto.Random.OSRNG import winrandom

    如下

    #import winrandom

    from Crypto.Random.OSRNG import winrandom

     

    以解决ImportError: No module named 'winrandom'错误

     

     

    VS2010

    因操作系统而异,可能需要安装VS2010,以解决包依赖问题

    Python <wbr>基于Python实现的ssh兼sftp客户端(上)




     

    代码实践

    mysshclient.py

     

    #!/usr/bin/env/ python
    # -*- coding:utf-8 -*-

    __author__ = 'shouke'

    import os
    from paramiko.client import AutoAddPolicy
    from paramiko.client import SSHClient
    from otherTools import OtherTools

    class MySSHClient:
        def __init__(self):
            self.ssh_client = SSHClient()

        # 连接登录
        def connect(self, hostname, port, username, password):
            try:
                print('正在远程连接主机:%s' % hostname)
                self.ssh_client.set_missing_host_key_policy(AutoAddPolicy())
                self.ssh_client.connect(hostname=hostname, port=port, username=username, password=password)
                return [True, '']
            except Exception as e:
                print('连接出错了%s' % e)
                return [False, '%s' % e]

        # 远程执行命令
        def exec_command(self, command):
            try:
                print('正在执行命令:'+ command)
                stdin, stdout, stderr = self.ssh_client.exec_command(command)
                print('命令输出:')
                print(stdout.read()) # 读取命令输出
                return [True, tuple]
            except Exception as e:
                print('执行命:%s令出错' % command)
                return [False,'%s' % e]

        # 下载文件(非目录文件)
        def download_file(self, remotepath, localpath):
            try:
                localpath = os.path.abspath(localpath)
                localpath = localpath.replace(' ', '/t').replace(' ', '/n').replace(' ', '/r').replace('', '/b') # 转换特殊字符
                localpath = localpath.replace('f', '/f')
                print('转换后的本地目标路径为:%s' % localpath)
                head, tail = os.path.split(localpath)
                if not tail:
                    print('下载文件:%s 到本地:%s失败,本地文件名不能为空' % (remotepath, localpath))
                    return [False, '下载文件:%s 到本地:%s失败,本地文件名不能为空' % (remotepath, localpath)]
                if not os.path.exists(head):
                    print('本地路径:%s不存在,正在创建目录' % head)
                    OtherTools().mkdirs_once_many(head)

                sftp_client = self.ssh_client.open_sftp()
                print('正在下载远程文件:%s 到本地:%s' % (remotepath, localpath))
                sftp_client.get(remotepath, localpath)
                sftp_client.close()
                return [True, '']
            except Exception as e:
                print('下载文件:%s 到本地:%s 出错:%s' % (remotepath, localpath, e))
                return [False, '下载文件:%s 到本地:%s 出错:%s' % (remotepath, localpath, e)]

        # 上传文件(非目录文件)
        def upload_file(self, localpath, remotepath):
            try:
                localpath = localpath.rstrip('\').rstrip('/')
                localpath = localpath.replace(' ', '/t').replace(' ', '/n').replace(' ', '/r').replace('', '/b') # 转换特殊字符
                localpath = localpath.replace('f', '/f')
                localpath = os.path.abspath(localpath)
                print('转换后的本地文件路径为:%s' % localpath)

                remotepath = remotepath.rstrip('\').rstrip('/')
                head, tail = os.path.split(localpath)
                if not tail:
                    print('上传文件:%s 到远程:%s失败,本地文件名不能为空' % (localpath, remotepath))
                    return [False, '上传文件:%s 到远程:%s失败,本地文件名不能为空' % (localpath, remotepath)]
                if not os.path.exists(head):
                    print( '上传文件:%s 到远程:%s失败,父路径不存在' % (localpath, remotepath, head))
                    return [False, '上传文件:%s 到远程:%s失败,父路径不存在' % (localpath, remotepath, head)]

                if not (remotepath.startswith('/') or remotepath.startswith('.')):
                    print('上传文件:%s 到远程:%s失败,远程路径填写不规范%s' % (localpath, remotepath,remotepath))
                    return [False, '上传文件:%s 到远程:%s失败,远程路径填写不规范%s' % (localpath, remotepath,remotepath)]
                sftp_client = self.ssh_client.open_sftp()
                head, tail = os.path.split(remotepath)

                head = sftp_client.normalize(head) # 规范化路径
                remotepath = head + '/' + tail
                print('规范化后的远程目标路径:', remotepath)

                print('正在上传文件:%s 到远程:%s' % (localpath, remotepath))
                sftp_client.put(localpath, remotepath)
                sftp_client.close()
                return [True, '']
            except Exception as e:
                print('上传文件:%s 到远程:%s 出错:%s' % (localpath, remotepath, e))
                return [False, '上传文件:%s 到远程:%s 出错:%s' % (localpath, remotepath, e)]

        def close(self):
            self.ssh_client.close()

    Python 基于Python实现的ssh兼sftp客户端(下)

     

  • 相关阅读:
    java之SpringBoot配置多数据源,使用dynamicdatasourcespringbootstarter和mybatisplusbootstarter,查了很多都不行,就这个可用。
    IntelliJ IDEA——数据库集成工具(Database)的使用
    opencv 截取视频
    linux 环境中cat命令进行关键字搜索
    composer 安装 指定php版本
    【高中经验分享】2021.11.29
    达梦数据库远程网页访问
    BERT代码阅读
    watchdog用于监测系统服务是否挂掉,挂掉则自动重启
    BERT模型+rabbitmq队列,进行实时预测,防止每次预测都重新加载图
  • 原文地址:https://www.cnblogs.com/shouke/p/10157532.html
Copyright © 2011-2022 走看看