主要实行使用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())
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)