主要实行使用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())



