0%

小记:七牛云测试域名回收问题

问题

月初收到七牛云的邮件扫了一眼大概是关于测试域名回收的问题,由于我只是用到了七牛云存储来做博客图床也就没在意。今天一上博客发现有些图片已经刷不出来了,请求图片的链接返回:

1
{error: "no such domain"}

这不就很蛋疼了嘛,上后台一看,果然是测试域名的问题:测试域名使用规范,图片上传后生成域名以 clouddn.com 结尾的 URL 在域名回收后自然不能访问了。

官方给出的解决途径是绑定自定义域名,然而这个域名是需要在公安网备案的,对我来说为使用图床还得搞个备案的域名未免太麻烦,索性先不用七牛云的图床了。当我尝试点击下载文件时:

yun

网页的顶端给了我一个错误提示:

bucket_error

这就很尴尬了,域名被回收了直接下载都下载不了,怎么破呢?只好祭出 google 大法。

解决办法

搜索后发现原来七牛云提供了命令行辅助工具qrsctl来对存储资源进行操作,下载下来通过命令chmod +x qrsctl为文件添加可执行权限。然后使用如下命令进行操作

1
2
3
4
5
6
#登录
./qrsctl login <User> <Passwd>
#登录成功后查看所有存放资源的空间(buckets)
./qrsctl buckets
#列出bucket中以prefix开头的所有资源
./qrsctl listprefix <bucket> <prefix>

因为我们要获取所有的图片资源,所以prefix参数使用了''空字符串,所得结果如下图所示:

terminal_buckets

在获取到所有资源名称后,就可以调用qrsctl下载资源的接口了:

1
2
#key为资源文件的名称 destFile为下载的目标路径
./qrsctl get <Bucket> <Key> <DestFile>

使用下面的脚本来完成下载任务更加方便:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
#``反引号是命令替换,可以先执行其中的命令并暂时保存在变量 imgs 中,``的替换操作也可使用$()操作
imgs=`./qrsctl listprefix 176zane ''`
i=0
#打印$imgs执行结果 然后使用管道符合 | 将结果传给 tr 命令将空格转化为换行符,再将结果逐行读取到 line 变量
echo $imgs | tr " " "\n" | while read line
do
#(())用于算数运算比较,此处的判断用于将上面结果中第一行的 ‘marker:‘这个非资源名的信息打印过滤掉
if(($i>0))
then
echo $line
./qrsctl get 176zane $line ./$line
fi
i=$(($i+1))
done

虽然对shell脚本不是太熟悉,但是上面的逻辑还是挺简单的,尝试一下很简单就把图片资源下载下来了,但是检查了一下就发现并没有下载完所有的资源,其实这里面还有一个坑:tr " " "\n"命令将之前处理结果分成一行一行的字符串时也将文件名中带有空格的如上图中用绿框框起来的文件名给破坏了,在后台中删除了该文件命名中的空格后重新运行脚本就搞定了。当然这是简单的做法,当你有很多资源名中含有空格时,可以在获取资源名后,在后续的命令中对文件名加上引号来下载:

1
./qrsctl get 176zane '2018-07-12 10_40_14.gif' ./'2018-07-12 10_40_14.gif'

这样就拿回了所有保存在七牛云上的图片资源,鉴于暂时没找到合适的图床,索性就直接用 github 来保存吧,虽然加载速度会慢点,但还是比较可靠的。全局替换图床链接http://oztca4xvs.bkt.clouddn.com/为本地地址/images/后,将图片复制到source/images/目录下,重新部署即可。