栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

python paramiko操作服务器,文件(夹)上转下载、命令执行

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python paramiko操作服务器,文件(夹)上转下载、命令执行

主要实行使用paramiko操作服务器简单操作,例如登录断开,命令执行,以及文件、文件夹的上转或者下载

代码如下:

import os
import stat
import traceback

import paramiko


class SSh(object):
    def __init__(self, host, port, username, pwd):
        self.host = host
        self.port = port
        self.username = username
        self.pwd = pwd

        transport = paramiko.Transport((self.host, self.port))
        transport.connect(username=self.username, password=self.pwd)
        self.transport = transport

    def close(self):
        self.transport.close()

    # 执行命令
    def cmd(self, command):
        ssh = paramiko.SSHClient()
        ssh._transport = self.transport
        # 执行命令
        _, stdout, _ = ssh.exec_command(command, get_pty=True)
        # 获取命令结果
        result = (str(stdout.read(), encoding='utf-8'))
        return result

    # 从本地上传文件到远程服务器
    def upload(self, local_path, server_path):
        sftp = paramiko.SFTPClient.from_transport(self.transport)
        sftp.put(local_path, server_path)

    # 从远程服务器获取文件到本地
    def download(self, server_path, local_path):
        sftp = paramiko.SFTPClient.from_transport(self.transport)
        sftp.get(server_path, local_path)

    # 递归遍历远程服务器指定目录下的所有文件
    def _get_server_files(self, sftp, remote_dir):
        all_files = list()
        if remote_dir[-1] == '/':
            remote_dir = remote_dir[0:-1]

        files = sftp.listdir_attr(remote_dir)
        for file in files:
            filename = remote_dir + '/' + file.filename
            
            if stat.S_ISDIR(file.st_mode):  # 如果是文件夹的话递归处理
                all_files.extend(self._get_server_files(sftp, filename))
            else:
                all_files.append(filename)

        return all_files
    
    # 从远程服务器获取文件夹到本地
    def download_dir(self, server_dir, local_dir):
        sftp = paramiko.SFTPClient.from_transport(self.transport)
        all_files = self._get_server_files(sftp, server_dir)
        
        try:
            for file in all_files:
                local_filename = file.replace(server_dir, local_dir)
                local_filepath = os.path.dirname(local_filename)
                
                if not os.path.exists(local_filepath):
                    os.makedirs(local_filepath)
                    
                sftp.get(file, local_filename)
                
        except Exception:
            print('ssh get dir from master failed.')
            print(traceback.format_exc())

    # 递归遍历本地服务器指定目录下的所有文件
    def _get_local_files(self, local_dir):
        all_files = list()
        for root, dirs, files in os.walk(local_dir, topdown=True):
            for file in files:
                filename = os.path.join(root, file)
                all_files.append(filename)
        return all_files

    # 从本地上转文件夹到远程服务器
    def sftp_put_dir(self, local_dir, server_dir):
        sftp = paramiko.SFTPClient.from_transport(self.transport)
        if server_dir[-1] == "/":
            server_dir = server_dir[0:-1]
        all_files = self._get_local_files(local_dir)
        
        try:
            for file in all_files:
                remote_filename = file.replace(local_dir, server_dir)
                remote_path = os.path.dirname(remote_filename)

                try:
                    sftp.stat(remote_path)
                except baseException:
                    # os.popen('mkdir -p %s' % remote_path)
                    self.cmd('mkdir -p %s' % remote_path)  # 使用这个远程执行命令

                sftp.put(file, remote_filename)

        except baseException:
            print('ssh get dir from master failed.')
            print(traceback.format_exc())

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/706054.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号