ssh是一个协议,OpenSSH是其中一个开源实现,paramiko是Python的一个库,实现了SSHv2协议(底层使用cryptography)。
有了Paramiko以后,我们就可以在Python代码中直接使用SSH协议对远程服务器执行操作,而不是通过ssh命令对远程服务器进行操作。
由于paramiko属于第三方库,所以需要使用如下命令先行安装
pip install paramiko
底层cryptography:加密解密模块,cryptography 的目标是成为“人类易于使用的密码学包cryptography for humans”,这个想法使你能够创建简单安全、易于使用的加密方案。需要先安装:
pip install cryptography
如果已经安装过,可以通过pip install --user -I cryptography
paramiko包含两个核心组件:SSHClient和SFTPClient。
SSHClient的作用类似于Linux的ssh命令,是对SSH会话的封装,该类封装了传输(Transport),通道(Channel)及SFTPClient建立的方法(open_sftp),通常用于执行远程命令。
SFTPClient的作用类似与Linux的sftp命令,是对SFTP客户端的封装,用以实现远程文件操作,如文件上传、下载、修改文件权限等操作。
# Paramiko中的几个基础名词:
1、Channel:是一种类Socket,一种安全的SSH传输通道;
2、Transport:是一种加密的会话,使用时会同步创建了一个加密的Tunnels(通道),这个Tunnels叫做Channel;
3、Session:是client与Server保持连接的对象,用connect()/start_client()/start_server()开始会话。
SFTPCLient作为一个sftp的客户端对象,根据ssh传输协议的sftp会话,实现远程文件操作,如上传、下载、权限、状态
put(self, localpath, remotepath, callback=None, confirm=True) 上传文件到服务器
get(self, remotepath, localpath, callback=None) 下载服务器的文件
remove(self, path) 删除服务器文件
rename(self, oldpath, newpath) 重命名服务器上的文件
mkdir(self, path, mode=o777) 在服务器创建文件夹
from datetime import datetime
import paramiko
import osclass SftpDeal():def __init__(self):self.hostname = 'ip'self.username = 'username 'self.password = 'password 'self.port = 22try:self.conn = paramiko.Transport((self.hostname, self.port)) # 获取Transport实例self.conn.connect(username=self.username, password=self.password) # 连接SSH服务端,使用passwordself.sftp_ob = paramiko.SFTPClient.from_transport(self.conn) # 获取SFTP实例except Exception as e:print(e)# 上传文件,local_file-本地目录;remote_path-远程目录def upload(self,local_file,remote_path):try:self.sftp_ob.put(local_file, remote_path)except Exception as e:self.sftp_ob.mkdir(os.path.split(remote_path)[0])self.sftp_ob.put(local_file, remote_path)print("从本地: %s 上传到: %s" % (local_file, remote_path))print(remote_path + ' 文件上传成功 %s ' % datetime.now().strftime('%Y-%m-%d %H:%M:%S'))#self.conn.close()def download(self,remote_path,local_file):try:self.sftp_ob.get(remote_path,local_file)except Exception as e:self.sftp_ob.mkdir(os.path.split(local_file)[0])self.sftp_ob.get(remote_path, local_file)print("从服务器: %s 下载到: %s" % (remote_path,local_file ))print(remote_path,'文件下载成功 %s ' % datetime.now().strftime('%Y-%m-%d %H:%M:%S'))self.conn.close()def remove(self,remote_path):try:self.sftp_ob.remove(remote_path)print(remote_path + ' 文件删除成功 %s ' % datetime.now().strftime('%Y-%m-%d %H:%M:%S'))except:print('服务器上面无文件:%s'% (remote_path))#self.conn.close()