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

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

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())

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5704617.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存