因为工作原因,经常需要用一台远程服务器,之前一直可以联网,就通过rclone备份数据,git pull同步文件。直到某一天,数据中心以安全为由把网给掐了,只留下ssh端口可以通过跳板机中转连接,给我整傻眼了。不过经过不懈努力,终于曲线救国实现了差不多的功能,这里记录一下。
Rclone备份
由于只有ssh可以用嘛,我没有找到建立反向ssh连接的方法,所以本机中转可以PASS掉了,只能依靠本机到远程服务器的连接实现,于是我想到了sshfs,即把远程服务器通过ssh挂载到本地。先安装一下(所有操作均在Ubuntu 20.04实现):
$ sudo apt install fuse sshfs
假设你已经配置好了ssh连接,使用下面的方法挂载远程目录到/mnt/remote(以pubkey登录为例,<>圈起来的部分根据实际修改):
$ sudo mkdir /mnt/remote
$ sudo sshfs -p <PORT> <USERNAME>@<REMOTE_HOST>:<DIR> /mnt/remote -o IdentityFile=<PRIV_KEY> -o allow_other
在/mnt/remote应该可以看到远程服务器的文件,然后就可以用rclone备份了:
$ rclone sync /mnt/remote <RCLONE_HOST>:<DIR> --ignore-existing --progress
测试没问题的话,写个脚本放cron里就可以了,sshfs偶尔会掉线,脚本里最好先加个判定。
git pull
同步文件同样依赖sshfs,原理上讲很简单,但是实操中遇到了很多问题。比如说,中转节点做了负载均衡,每次连接的时候都要接受新密钥,解决方法也比较简单,在~/.ssh/config里加入两行即可,总的结构是这样的:
Host <HOSTNAME>
HostName <REMOTE_HOST>
Port <PORT>
User <USERNAME>
IdentityFile <PRIV_KEY>
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
然后ssh <HOSTNAME>
应该就可以跳过了,当然这个操作很不安全,能不使用还是不要使用了。
另外一个问题是我用来操作的小鸡在国内,访问github丢包能丢到90%,基本不可用,参照这篇文章修改/etc/hosts即可,之后用sudo systemd-resolve --flush-caches
刷新缓存,就快很多了。至于如何获取合适的IP,如果你的小鸡可以用远程桌面,按照文中操作即可,不能的话我们还有万能的curl(以github.com为例):
$ curl https://github.com.ipaddress.com/ > github.html
然后把github.html下载下来,在本机打开就看到IP了。
同步的操作就变成了:
$ git pull
$ rclone sync <LOCAL_DIR> /mnt/remote/<DIR> --checksum --progress
理论上讲也可以git clone
在sshfs挂载的远程目录下,然后直接git pull
就好了,但是为了稳妥起见我还是在本地中转了一下。
文章评论