- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我想使用 Python 2.7 使用 SFTP 将整个目录结构与文件和子文件夹递归地从 Linux 服务器复制到本地计算机(Windows 和 Linux)。
我能够 ping 服务器并使用 WinSCP 从同一台机器上下载文件。
我尝试了以下代码,在 Linux 上运行良好但在 Windows 上运行不正常。
我试过\
、/
、os.join
,都给我同样的错误,也检查了权限。
import os
import pysftp
cnopts = pysftp.CnOpts()
cnopts.hostkeys = None # disable host key checking.
sftp=pysftp.Connection('xxxx.xxx.com', username='xxx', password='xxx', cnopts=cnopts)
sftp.get_r('/abc/def/ghi/klm/mno', 'C:\pqr', preserve_mtime=False)
File "<stdin>", line 1, in <module> File "C:\Python27\lib\site-packages\pysftp_init_.py", line 311, in get_r preserve_mtime=preserve_mtime)
File "C:\Python27\lib\site-packages\pysftp_init_.py", line 249, in get self._sftp.get(remotepath, localpath, callback=callback)
File "C:\Python27\lib\site-packages\paramiko\sftp_client.py", line 769, in get with open(localpath, 'wb') as fl: IOError: [Errno 2] No such file or directory: u'C:\\pqr\\./abc/def/ghi/klm/mno/.nfs0000000615c569f500000004'
最佳答案
确实,pysftp get_r
在 Windows 上不起作用。它对远程 SFTP 路径使用 os.sep
和 os.path
函数,这是错误的,因为 SFTP 路径总是使用正斜杠。
但您可以轻松实现可移植替代。
import os
from stat import S_ISDIR, S_ISREG
def get_r_portable(sftp, remotedir, localdir, preserve_mtime=False):
for entry in sftp.listdir_attr(remotedir):
remotepath = remotedir + "/" + entry.filename
localpath = os.path.join(localdir, entry.filename)
mode = entry.st_mode
if S_ISDIR(mode):
try:
os.mkdir(localpath)
except OSError:
pass
get_r_portable(sftp, remotepath, localpath, preserve_mtime)
elif S_ISREG(mode):
sftp.get(remotepath, localpath, preserve_mtime=preserve_mtime)
像这样使用它:
get_r_portable(sftp, '/abc/def/ghi/klm/mno', 'C:\\pqr', preserve_mtime=False)
请注意,如果您不想使用 pysftp,可以轻松修改以上代码以直接使用 Paramiko。 Paramiko SFTPClient
class还有 listdir_attr
和 get
方法。唯一的区别是 Paramiko 的 get
没有 preserve_mtime
参数/功能(但如果需要,它可以很容易地实现)。
并且您应该使用 Paramiko 而不是 pysftp,因为 pysftp 似乎是一个死项目。参见 pysftp vs. Paramiko .
代码的可能修改:
有关 put_r
的类似问题,请参阅:
Python pysftp put_r does not work on Windows
旁注:不要“禁用主机 key 检查”。您正在失去针对 MITM attacks 的保护.
有关正确的解决方案,请参阅 Verify host key with pysftp .
关于来自 Linux 的 Python pysftp get_r 在 Linux 上运行良好但在 Windows 上运行不正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50118919/
我使用 pysftp(它是 paramiko 的包装器)。 import pysftp cnopts = pysftp.CnOpts() cnopts.hostkeys = None sftp=pys
我正在尝试使用 pysftp 连接到服务器传输文件。 每当我运行 con = pysftp.Connection('ftp.abc.com', username='user', password='m
我正在使用 Pysftp 来 sftp 放置大量文件,并且希望在它运行时获得一些进度输出,以便我知道它是如何做的。我可以使用详细选项(或等效选项)来获取该输出吗? 谢谢。 最佳答案 我可能在这里错误地
我尝试了以下三种更改目录的方法,但它永远不会改变。还有其他人遇到过这个问题吗? import pysftp cnopts = pysftp.CnOpts() cnopts.hostkeys = Non
我正在尝试使用以下脚本连接到服务器: import pysftp cnopts = pysftp.CnOpts() cnopts.hostkeys = None srv = pysftp.Connec
我在使用 pysftp 复制文件时遇到问题。这最初是一个有效的 WinSCP 脚本。我可以使用winscp.com 和filezilla 中下面的脚本中提供的凭据手动复制该文件。我已验证凭据是否正确并
我正在尝试编写一个脚本,以便在修改日期小于 24 小时的情况下从 SFTP 服务器检索文件。这是我迄今为止的尝试: cnopts = sftp.CnOpts() cnopts.hostkeys = N
我的代码: import pysftp s = pysftp.Connection(host='test.rebex.net', username='demo', password='password
使用 pysftp,我看到了如何在您已经连接后为任何命令设置超时,但我没有看到如何为连接本身设置超时。我觉得我在某处丢失了一些东西。只是为了尝试一下,我尝试添加 timeout=3到 Connecti
我想将我的实际私钥值作为参数传递,而不是提供文件路径。 到目前为止,我已经使用了以下代码: def upload_file_to_remote(hostname, port, username, pa
当我尝试连接时,我收到以下消息,需要一些帮助。我正在执行的脚本如下。关于如何解决此问题的任何建议? 此外,一旦我解决了这个问题,我就希望向此脚本添加监听功能,直到结果文件可用并从不同的远程目录下载它。
我正在尝试从远程服务器下载文件。为此,我需要定义“charset=ASCII”(我在 FileZilla 客户端中尝试过)。然后只有连接成功,我才能查看文件。否则我会从客户端收到“身份验证错误”(使用
我正在尝试建立到 sftp 服务器的测试连接。 (如 Python Pysftp Error 中所示)。我通过终端建立与服务器的第一个连接,从服务器获取了 key 。那工作完美无缺。但是,如果我运行
I am creating a backup script using pysftp module. I am able to upload and download files. When i am
我试图捕获 paramiko异常(exception),但它们仍被写入标准错误。 有没有办法停止在那里写? 编辑:它甚至发生在 paramiko 参与之前: import pysftp try:
我有一个用 Python 3 编写的小型服务,它使用 pysftp: with pysftp.Connection( host=host, username=connection_da
我正在使用 pysftp 库的 get_r 函数 ( https://pysftp.readthedocs.io/en/release_0.2.9/pysftp.html#pysftp.Connect
我是 Python 新手,正在编写一个使用 pysftp 模块的脚本。 pysftp 模块中有一个函数我遇到了问题——它是重命名函数。 这是电话 srv = pysftp.Connection(hos
我正在使用 python 3.3.2 和 pysftp 制作一个备份实用程序,该实用程序将文件副本存储在我网络上的另一台计算机上。 我已经知道如何使用 pysftp 来传输这些文件,但是我希望看到传输
我需要从服务器获取文件,然后将它们写入数据库。我使用: with pysftp.Connection(host, username=username, password=password, cnopt
我是一名优秀的程序员,十分优秀!