很久很久以前,我介绍过在多服务器间用 rsync 同步网站证书的方案,一直没更新。但是基本内容没有变化,如果 Let's Encrypt 支持签发泛域名证书了我会考虑重新写一份。当然现在我是不会动手的辣,不过有一点上次没说到——如果你的密钥加密了,那么直接跑那个脚本是不行的。所以这次要解决的就是这个问题。
本次事件的起因是 Xshell 曝出存在后门可能导致登陆用户名密码等信息泄露,虽然我一直是用密钥,但是为了保险起见能换掉的还是换掉比较稳妥。这次换用了 ECDSA 算法,生成和部署就不说了,需要注意的是删掉旧密钥对的时候留一个 ssh 连接,省得打错字连不上机器。然后问题来了,前述证书同步也是靠 ssh 通道传输,但是密钥是加密过的,因此每次建立连接时必须输入密码。我已经忘掉之前是怎么弄的没输密码也一样同步成功了,于是这次必须从头再来。幸亏成熟的解决方案有不少,比如 Keychain。
首先安装,sudo apt install keychain
,然后按需求配置密码缓存。按照 ArchWiki 的办法,我选择在第一次连接时需要输入密码启动ssh-agent
进程守护。向~/.bashrc
中添加如下内容:
alias ssh='eval $(/usr/bin/keychain --eval --agents ssh -Q --quiet ~/.ssh/id_ecdsa) && ssh'
如果没有把公钥扔进.ssh
中,第一次 ssh 连接其他机器可能会提示找不到公钥,无视即可,然后添加缓存:
ssh-add ~/.ssh/id_ecdsa
这步不清楚是否必须,因为 wiki 上也没写清楚,但在我这里需要缓存一次密码。这样就可以正常免密码使用 ssh 方式同步文件了。
那么等淘到更大的固态的时候就换 WSL,原生方案并没有什么不好(还是淘个洋垃圾 ThinkPad 装 Linux 清真)。
参考资料:
有一样东西叫 expect
但是 expect 会泄露明文密码(
放在自己的电脑上有什么关系
这部“电脑”不在自己手边上,多做一步没有坏处。
不在手边就算了