常常會有人須要從遠程服務器下載一些文件資源,下載個別小文件能夠直接用sz等命令,可是,須要下載一個文件夾呢?sz就不行了,這時候固然能夠先壓縮文件夾,而後下載,這樣也是能夠的,只要文件不是很大,那麼,有沒有其餘辦法下載文件夾呢?辦法固然是有的,就是寫Python腳本,而後經過paramiko模塊就能夠從遠程傳輸下載文件夾到本地了,是否是很方便呢…… python
paramiko模塊提供了ssh及sftp進行遠程登陸服務器執行命令和上傳下載文件的功能。這是一個第三方的軟件包,使用以前須要先進行安裝,咱們這裏主要利用sftp進行下載傳輸文件 bash
就像下圖中的運行,能夠一個一個的循環下載文件 !服務器
下面的這些信息須要本身配置一下,即初始化一些參數,包括服務器信息以及遠程文件和本地文件的存放路徑配置ssh
# 服務器鏈接信息
host_name = '127.0.0.1'
user_name = 'root'
password = 'root'
port = 22
# 遠程文件路徑(須要絕對路徑)
remote_dir = '/data/nfs/zdlh/pdf/2018/07/31'
# 本地文件存放路徑(絕對路徑或者相對路徑均可以)
local_dir = 'file_download/'複製代碼
#!/usr/bin/env python
# -*- coding: utf-8 -*-
""" 經過paramiko從遠處服務器下載文件資源到本地 author: gxcuizy time: 2018-08-01 """
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 = '127.0.0.1'
user_name = 'root'
password = 'root'
port = 22
# 遠程文件路徑(須要絕對路徑)
remote_dir = '/data/nfs/zdlh/pdf/2018/07/31'
# 本地文件存放路徑(絕對路徑或者相對路徑均可以)
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()
複製代碼
在Python中,能夠很好地利用Parmmiko的sftp完成文件傳輸操做。你們有什麼疑問或者想法,能夠留言或者聯繫我。
ui