1、使用paramiko上传文件
使用paramiko 可以实现文件上传,代码如下,
import paramiko from paramiko import SSHClient #文件下载 def download_file_ftp(host, username, password, local_path, remote_path): #与服务器创建ssh连接,transport方法建立通道,以元组的方式写服务器信息 ssh_ftp = paramiko.Transport((host, 60317)) ssh_ftp.connect(username=username, password=password) #创建连接后,使用sftpclient类和from_transport(括号里写上边创建的Transport通道)基于上边ssh连接创建一个sftp连接,定义成ftp_client变量后边方便引用 ftp_client = paramiko.SFTPClient.from_transport(ssh_ftp) #下载文件 #ftp_client.get("目标文件", r"保存位置,写到文件名") ftp_client.get(remote_path, local_path) #关闭ssh连接 ssh_ftp.close() #文件上传 def upload_file_ftp(host, username, password, local_path, remote_path): #与服务器创建ssh连接,transport方法建立通道,以元组的方式歇服务器信息 ssh_ftp = paramiko.Transport((host, 60317)) ssh_ftp.connect(username=username, password=password) #创建连接后,使用sftpclient类和from_transport(括号里写上边创建的Transport通道)基于上边ssh连接创建一个sftp连接,定义成ftp_client变量后边方便引用 ftp_client = paramiko.SFTPClient.from_transport(ssh_ftp) #上传文件 ftp_client.put(local_path, remote_path) #关闭ssh连接 ssh_ftp.close() download_file_ftp("192.168.31.11","root","admin","/root/server.py","/home/data/server.py") upload_file_ftp("192.168.31.11","root","admin","./server.py","/home/data/server.py")
2、使用paramiko上传文件夹
使用paramiko 可以通过递归的方式实现文件夹上传,也可以直接上传文件,代码如下,
import paramiko import os from stat import S_ISDIR as isdir # 递归上传文件夹,也可以上传文件 def down_from_remote(sftp_obj, remote_dir_name, local_dir_name): """远程下载文件""" remote_file = sftp_obj.stat(remote_dir_name) if isdir(remote_file.st_mode): # 文件夹,不能直接下载,需要继续循环 check_local_dir(local_dir_name) print('开始下载文件夹:' + remote_dir_name) for remote_file_name in sftp.listdir(remote_dir_name): sub_remote = os.path.join(remote_dir_name, remote_file_name) sub_remote = sub_remote.replace('\\', '/') sub_local = os.path.join(local_dir_name, remote_file_name) sub_local = sub_local.replace('\\', '/') down_from_remote(sftp_obj, sub_remote, sub_local) else: # 文件,直接下载 print('开始下载文件:' + remote_dir_name) sftp.get(remote_dir_name, local_dir_name) def check_local_dir(local_dir_name): """本地文件夹是否存在,不存在则创建""" if not os.path.exists(local_dir_name): os.makedirs(local_dir_name) if __name__ == "__main__": """程序主入口""" # 服务器连接信息 host_name = '192.168.31.11' user_name = 'root' password = 'cjavapy' port = 22 # 远程文件路径(需要绝对路径) remote_dir = '/data/www-data' # 本地文件存放路径(绝对路径或者相对路径都可以) local_dir = 'file_download/' # 连接远程服务器 t = paramiko.Transport((host_name, port)) t.connect(username=user_name, password=password) sftp = paramiko.SFTPClient.from_transport(t) # 远程文件开始下载 down_from_remote(sftp, remote_dir, local_dir) # 关闭连接 t.close()