![如何使用类似 wget 的工具从 public.me.com 复制其他人的文件夹?](https://linux22.com/image/20105/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E7%B1%BB%E4%BC%BC%20wget%20%E7%9A%84%E5%B7%A5%E5%85%B7%E4%BB%8E%20public.me.com%20%E5%A4%8D%E5%88%B6%E5%85%B6%E4%BB%96%E4%BA%BA%E7%9A%84%E6%96%87%E4%BB%B6%E5%A4%B9%EF%BC%9F.png)
如何从中复制文件夹http://public.me.com/(与以下相关的服务磁盘, 或者移动我)使用 Unix 工具(例如获取,命令行非交互式工具)?
问题是 Web 界面实际上是一个复杂的基于 Javascript 的东西,而不是简单地公开文件。 (甚至w3m无法浏览,例如https://public.me.com/rudchenko.)
我的目标是不时以非交互方式更新本地副本,并将下载文件的命令放入脚本中,以便其他人可以运行该脚本并下载文件。
A获取-喜欢 (同步-喜欢,git拉-like)工具适合我,或者通过 FUSE 安装网络文件系统然后使用标准 Unix 命令复制目录的组合也可以。
我读过苹果提供的维基百科文章(我在上面提到过)WebDAV 访问这些服务,我也读过尸体, A获取- 就像 WebDAV 客户端,但我不知道应该使用哪个地址来访问文件夹http://public.me.com/只读(匿名)。
也许 Gilles 的评论(即 WebDAV 目前未被使用)是正确的,但在幕后似乎仍存在一些 WebDAV 的东西:传递给浏览器用于下载带有目录的档案的 URL(按下 Web 界面顶部的“下载选定的文件”按钮后)如下所示:
https://public.me.com/ix/rudchenko/SEM%20Sep21%201%20TO%20PRINT.zip?webdav-method=ZIPGET&token=1g3s18hn-363p-13fryl0a20-17ial2zeu00&disposition=download
-- 请注意,它提到了“WebDAV”。 (如果您好奇,我尝试重新使用此 URL 作为参数获取,但失败了:
$ LC_ALL=C wget 'https://public.me.com/ix/rudchenko/SEM%20Sep21%201%20TO%20PRINT.zip?webdav-method=ZIPGET&token=1g3s18hn-363p-13fryl0a20-17ial2zeu00&disposition=download'
--2011-11-21 01:21:48-- https://public.me.com/ix/rudchenko/SEM%20Sep21%201%20TO%20PRINT.zip?webdav-method=ZIPGET&token=1g3s18hn-363p-13fryl0a20-17ial2zeu00&disposition=download
Resolving public.me.com... 23.32.106.105
Connecting to public.me.com|23.32.106.105|:443... connected.
HTTP request sent, awaiting response... 404 Not Found
2011-11-21 01:21:48 ERROR 404: Not Found.
$
)
(我使用的是 GNU/Linux 系统。)
答案1
该服务器显然正在运行部分或损坏的 WebDAV 实现。请注意,您需要连接到类似以下的 URLhttps://public.me.com/ix/rudchenko,不是普通的URLhttps://public.me.com/rudchenko。我尝试了几个客户端:
- 使用普通的 HTTP 下载器(例如 wget 或 curl),我可以下载知道其名称的文件(例如
wget https://public.me.com/ix/rudchenko/directory/filename
),但无法获取目录列表。 - 熔断器DAV,这本来是我的第一选择,无法应对一些丢失的命令。它显然设法列出根目录(在输出中可见
fusedav -D
),但最终运行一些返回“PROPFIND failed: 404 Not Found”的请求并锁定。 - 钕缺少列表命令。
尸体效果很好,但缺少递归检索命令。您可以使用它来获取列表,然后如上所述检索单个文件。
它并不完美,在这种情况下特别存在一个问题:尸体的
mget
无法处理带有通配符的 args,这些通配符扩展为带有空格的文件名。- 达夫文件系统2效果很好。我可以挂载该共享并从中复制文件。唯一的缺点是这不是 FUSE 文件系统,您需要 root 才能挂载它或
/etc/fstab
. 基于FUSE的数据文件系统-1.4.2-替代0.M51.1在这种情况下工作得很好,不需要root(仅需要权限
/dev/fuse
)。mkdir viewRemote wdfs https://public.me.com/ix/rudchenko/ viewRemote rsync -a viewRemote/SEM*TO\ PRINT* ./ fusermount -u viewRemote rmdir viewRemote
(当然,在本示例中,使用简单的cp
替代方案rsync
效果很好;rsync
选择它只是为了在更新副本时对差异进行额外诊断。)
(除了 wdfs 之外,我在 Debian squeeze 系统上尝试了这些命令。您的情况可能会有所不同。)
答案2
还有一些特殊的脚本和一个工具(wget-warc
)来下载内容https://public.me.com/用户的文件夹——https://github.com/ArchiveTeam/mobileme-grab/blob/master/dld-me-com.sh(并查看包含的存储库)。 (通过发现http://archiveteam.org/index.php?title=MobileMe#How_to_help_archiving.)
在内部,该脚本似乎组成 WebDAV 请求并使用响应,例如:
# step 1: download the list of files
if [[ "$domain" =~ "public.me.com" ]]
then
# public.me.com has real WebDAV
# PROPFIND with Depth: infinity lists all files
echo -n " - Discovering urls (XML)..."
curl "https://public.me.com/ix/${username}/" \
--silent \
--request PROPFIND \
--header "Content-Type: text/xml; charset=\"utf-8\"" \
--header "Depth: infinity" \
--data '<?xml version="1.0" encoding="utf-8"?><DAV:propfind xmlns:DAV="DAV:"><DAV:allprop/></DAV:propfind>' \
--user-agent "${USER_AGENT}" \
> "$userdir/webdav-feed.xml"
result=$?
if [ $result -ne 0 ]
then
echo " ERROR ($result)."
exit 1
fi
echo " done."
# grep for href, strip <D:href> and prepend https://public.me.com
grep -o -E "<D:href>[^<]+" "$userdir/webdav-feed.xml" | cut -c 9- | awk '/[^\/]$/ { print "https://public.me.com" $1 }' > "$userdir/urls.txt"
count=$( cat "$userdir/urls.txt" | wc -l )
elif
是的,他们也使用“https://public.me.com/ix/${用户名}/”,注意“/九/" URL 中的中缀!不是普通 URL --吉尔斯在他的回答中发现了同样的事情。