前言
某些国外网站,虽然没有被墙,但是下载个东西,几十 KB 的网速很难顶。
于是想把东西下载服务器上,然后本地从服务器满速下载。这也就是离线下载的原理。
基础知识
后台运行也是非常重要的,我就一笔带过,将原本的命令改为 nohup <命令> &
即可后台执行(此时可以按 Ctrl+C
关掉 nohup
的前端)。
另外,如果服务器显示了“可以通过 127.0.0.1:8080
访问……”,表示的是服务器本机的 8080 端口,就可以在你的电脑访问 [服务器ip]:8080
(如 39.1.2.3:8080
)来访问对应的网站。后文不再赘述。
服务器下载文件
服务器下载 http(s) 直链,最常用、也是最无脑的就是 wget <Link>
了。
对付非直链的情况,我们有非直链的解决方案;
对于种子/磁力链,我们可以使用
wget 下载 Google Drive 文件
在时断时续的梯子上,Google Drive 的下载不是很方便,特别是需要下载一个大文件的时候。
但是 Google Drive 是可以获取直链的。很香。
服务器用 wget 从 Google Drive 下载小文件的命令为(需要替换链接中的 FILEID
):
1 | wget --no-check-certificate ‘https://docs.google.com/uc?export=download&id=FILEID’ |
对于大文件,无法通过安全查杀,所以要用别的命令(注意 FILEID
有两处):
1 | wget --load-cookies /tmp/cookies.txt "https://docs.google.com/uc?export=download&confirm=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate 'https://docs.google.com/uc?export=download&id=FILEID' -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\1\n/p')&id=FILEID" && rm -rf /tmp/cookies.txt |
其中,需要替换其中的 FILEID
为公开分享的文件 ID,下面是实例:
1 | https://drive.google.com/open?id=FILEID |
第二条的 1_wnCdMKB4_GQM9dtA4AOHxZ21NCGFNm9
即为 FILEID
。
就可以感受国外连服务器的 60M/s 的网速了。
wget 下载 mediafire.com 的文件
这个网站就属于一开始说那种的网站,没有被墙,但是国内访问速度平均不到 100 K/s。
不过这个网站又不像 Google Drive,可以直接找到直链,而是需要你访问网站,然后生成一个直链网页中(这些网站都挺良心,直接把直链放网站上,不像国内某云)。但是不同端登录给的直链时不一样的,所以我们要在服务器访问网站。
具体来说,就是在服务器用 wget
下载他分享的链接对应的 html,然后从 html 里面找到链接即可用 wget 下载。
假设我们的直链如下(注意统一用 https):
1 | https://www.mediafire.com/file/yrd1py7od5911zt/Catalina_Virtual_Disk_Image_by_Techsviewer.rar/file |
可以用以下命令:
1 | LINE=https://www.mediafire.com/file/yrd1py7od5911zt/Catalina_Virtual_Disk_Image_by_Techsviewer.rar/file |
得到类似下面的 Index_data
。其中 download
后的 2331
就是每个直链不同的地方。
1 | https://download2331.mediafire.com/chmg33d4airg/yrd1py7od5911zt/Catalina+Virtual+Disk+Image+by+Techsviewer.rar |
然后就可以 wget "$Index_data"
或手动 wget <网址>
进行下载。
如果需要后台下载,当然是用 nohup 了。这样,即使是几十 kb 的下载速度,服务器下个三天三夜,然后就可以以满速下到本地了。
1 | nohup wget "$Index_data" & |
下载的进度可以 tail nohup.out
查看输出文件的最后几行。
qbittorrent 下载磁力链/种子
1 | apt install qbittorrent |
安装 qbittorrent 以后,提供了两条命令 qbittorrent
和 qbittorrent-nox
的。前者是提供 GUI 的,后者是给命令行使用的(所谓 no X
)。
输入 qbittorent-nox
以后,就可以在本地通过访问对应的网站来管理服务器的 qbittorent 下载种子了。
如果需要后台执行,可以使用 qbittorrent-nox -d
。
服务器、本机互传文件
如果想要知道最方便的方法,请跳到 webdav 部分。
scp 命令:通过 ssh 在服务器和本地互传文件
1 | scp /home/work/source.txt work@192.168.0.10:/home/work/ |
python3 http.server 一行建立 http 文件服务器(不支持断点续传、密码验证)
1 | sudo apt-get install python3 |
需要更多的选项,可以使用 python3 -m http.server --help
看到 Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
以后即可。
就可以在互联网上通过打开访问到当前文件夹了。后台运行同样是 nohup
。
注意这是没有密码验证的,也不支持断点续传(毕竟 simple
),所以不要长期开放!!!
npm http-server 一行建立 http 文件服务器(支持断点续传,不支持密码验证)
1 | apt install npm |
其中 http-server
的常用参数为 http-server [path] [-p port]
。port
默认为 8080。
如果想要在后台运行,可以配合 nohup
使用:
1 | nohup http-server & |
如果想要守护进程(如果被 kill 就立刻重启),可以使用:
1 | apt install npm |
另外,实现同样功能的还有:https://github.com/lwsjs/local-web-server
不过,需要注意的是,如果连接线程太多,会消耗大量服务器内存。在我的测试中:
- 单线程下载一个文件,内存占用 36 MB
- 16 线程下载一个文件,内存占用 40 MB
- 下载三个文件,每个文件 128 线程,内存占用高达 250MB(不要问我为什么这么高,问就是某线程破解版下载软件默认)
给不支持密码验证的 http server 增加密码验证
这个方法是借助于 Nginx 的密码验证。实现思路是:
- 使用 Nginx 服务器,将
file.lyh543.cn
反向代理到lyh543.cn:8080
,其中8080
为上述http-server
的访问端口。方法可参考Nginx (萌新向)。 - 同时在
file.lyh543.cn
的配置文件中加入密码验证功能,可参考nginx配置访问密码。 - 最后为安全起见,可在防火墙中关掉
8080
端口,避免直接从端口访问服务器。可参考Linux 日常命令–防火墙。
webdav(支持断点续传、密码验证)
参考博客:https://blog.devzeng.com/blog/build-webdav-server-in-docker.html
我在 2020.6.14 发现了 webdav,最方便的应该就是 webdav 了。
首先安装 Docker,可参照这篇教程。
然后运行一行命令:
1 | docker run -d --name webdav -v /path/to/directory:/var/webdav -e USERNAME=test -e PASSWORD=test -p 8888:80 morrisjobke/webdav |
运行前修改上面的 /path/to/directory
为你的文件夹名;修改用户名和密码;修改端口为你想要的端口。
然后就可以在浏览器中访问 http://yourip:8888/webdav
(注意有个 webdav
),再进行账户密码验证即可进行下载。
对于支持 WebDAV 的应用,就可以用这个方法上传、下载了。
SMB
如果能使用 SMB,就可以把服务器的某个文件夹当做(Windows)本机的一个硬盘,上传下载都是非常的方便。
然而,SMB 配置起来比较麻烦,一是 SMB 通常用于局域网内,在外网使用会麻烦一点;二是 SMB 的默认端口 445 被阿里云、腾讯云等封禁了,需要使用别的端口。但是确实有人实现过。还是使用 scp
或 webdav 吧。
Syncthing
如果需要两个设备的某些文件夹保持完全同步,可以考虑使用 Syncthing。
这个软件可以让两个设备的文件夹保持完全同步,并且跨平台(Linux/Windows/macOS/FreeBSD/OpenBSD/NetBSD/Dragonfly BSD/Illumos/Solaris)。通过网页进行管理,非常方便。
给链接添加 HTTPS
上面都是通过 HTTP 协议 + 端口访问服务,如果需要 HTTPS,需要用 Nginx 做一次反向代理,参见 Nginx。