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.103.51.11' user_name = 'test' password = '123456' port = 22 # 遠程文件路徑(需要絕對路徑) remote_dir = '/home/test/syslogin.log' # 本地文件存放路徑(絕對路徑或者相對路徑都可以) local_dir = r'D:\mypython\test' # 連接遠程服務器 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()
報錯:
PermissionError: [Errno 13] Permission denied:
查看官方文檔
get(remotepath, localpath=None, callback=None, preserve_mtime=False)
注意:這里的remotepath和localpath為:“文件所在目錄 + '/' + 文件名”這樣形式的完整的文件路徑,而不是只有文件的目錄
put(localpath, remotepath=None, callback=None, confirm=True, preserve_mtime=False)
注意:這里的remotepath和localpath為:“文件所在目錄 + '/' + 文件名” 完整的文件路徑,不是只有文件的目錄
解決:
local_dir = r'D:\mypython\test\syslogin.log'