你如何使用paramiko传输完整的目录?我正在尝试使用:
sftp.put("/Folder1","/Folder2")
Run Code Online (Sandbox Code Playgroud)
这给了我这个错误 -
Error : [Errno 21] Is a directory
Run Code Online (Sandbox Code Playgroud)
sko*_*oll 16
您可以继承paramiko.SFTPClient并向其添加以下方法:
import paramiko
import os
class MySFTPClient(paramiko.SFTPClient):
def put_dir(self, source, target):
''' Uploads the contents of the source directory to the target path. The
target directory needs to exists. All subdirectories in source are
created under target.
'''
for item in os.listdir(source):
if os.path.isfile(os.path.join(source, item)):
self.put(os.path.join(source, item), '%s/%s' % (target, item))
else:
self.mkdir('%s/%s' % (target, item), ignore_existing=True)
self.put_dir(os.path.join(source, item), '%s/%s' % (target, item))
def mkdir(self, path, mode=511, ignore_existing=False):
''' Augments mkdir by adding an option to not fail if the folder exists '''
try:
super(MySFTPClient, self).mkdir(path, mode)
except IOError:
if ignore_existing:
pass
else:
raise
Run Code Online (Sandbox Code Playgroud)
要使用它:
transport = paramiko.Transport((HOST, PORT))
transport.connect(username=USERNAME, password=PASSWORD)
sftp = MySFTPClient.from_transport(transport)
sftp.mkdir(target_path, ignore_existing=True)
sftp.put_dir(source_path, target_path)
sftp.close()
Run Code Online (Sandbox Code Playgroud)
小智 6
适合我做这样的事情,所有文件夹和文件都复制到远程服务器。
parent = os.path.expanduser("~")
for dirpath, dirnames, filenames in os.walk(parent):
remote_path = os.path.join(remote_location, dirpath[len(parent)+1:])
try:
ftp.listdir(remote_path)
except IOError:
ftp.mkdir(remote_path)
for filename in filenames:
ftp.put(os.path.join(dirpath, filename), os.path.join(remote_path, filename))
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
import errno
import os
import stat
def download_files(sftp_client, remote_dir, local_dir):
if not exists_remote(sftp_client, remote_dir):
return
if not os.path.exists(local_dir):
os.mkdir(local_dir)
for filename in sftp_client.listdir(remote_dir):
if stat.S_ISDIR(sftp_client.stat(remote_dir + filename).st_mode):
# uses '/' path delimiter for remote server
download_files(sftp_client, remote_dir + filename + '/', os.path.join(local_dir, filename))
else:
if not os.path.isfile(os.path.join(local_dir, filename)):
sftp_client.get(remote_dir + filename, os.path.join(local_dir, filename))
def exists_remote(sftp_client, path):
try:
sftp_client.stat(path)
except IOError, e:
if e.errno == errno.ENOENT:
return False
raise
else:
return True
Run Code Online (Sandbox Code Playgroud)
你需要像在python本地一样(如果你没有使用shutils).
结合os.walk()
,与sftp.mkdir()
和sftp.put()
.您可能还想检查每个文件和目录,os.path.islink()
具体取决于您是否要解析符号链接.
这一切都可以使用 paramiko 轻松完成。
以下代码的高级摘要是:
- 连接到 SFTP(步骤 1 到 3)
- 指定您的源文件夹和目标文件夹。(第 4 步)
- 将它们一一复制到您喜欢的任何位置(我已将它们发送到 /tmp/)。(第 5 步)
import paramiko
# 1 - Open a transport
host="your-host-name"
port = port_number
transport = paramiko.Transport((host, port))
# 2 - Auth
password="sftp_password"
username="sftp_username"
transport.connect(username = username, password = password)
# 3 - Go!
sftp = paramiko.SFTPClient.from_transport(transport)
# 4 - Specify your source and target folders.
source_folder="some/folder/path/on/sftp"
inbound_files=sftp.listdir(source_folder)
# 5 - Download all files from that path
for file in inbound_files :
filepath = source_folder+file
localpath = "/tmp/"+file
sftp.get(filepath, localpath)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
28976 次 |
最近记录: |