序言
在入手MacBook Pro前,我的开发环境主要是一个运行在VirtualBox中的Mint发行版。在这个系统中,只要运行一次git push
并输入passphrase(下称密码)后,之后便不再需要输入了——即使ssh登录远程机器也是如此。
但用上Mac后发现,这里的ssh没有这个方便的特性——每次运行git push
或ssh
,都需要输入密码,颇不方便。
为了避免一遍又一遍地输入密码,每次登录后,我都会运行ssh-add
来一劳永逸地解决问题
1 | ssh-add ~/.ssh/id_rsa |
自从升级到macOS Catalina后,如果在合盖睡眠前没有注销的话,下次开盖唤醒极有可能卡死在登录界面。无奈之下,我每天都需要注销并在第二天重新登录,以至于每天都得运行ssh-add
并输入密码。久而久之,这也挺烦人的。
一次失败的优化
为了省却每次都输入长达14个字符的密码的烦恼,我想到了expect(1)
,这是一种可以交互式地控制其它命令的脚本语言。遗憾的是,经过一番折腾,仍然没办法成功让expect把密码输入给ssh-add
,我只好继续寻找其它的办法。
一次成功的优化
某天在阅读ssh-add
的man
文档时,了解到原来ssh-add
有一个-K
选项,可以在添加身份到ssh-agent
时,将密码存储到用户的keychain中。同时还有一个-A
选项,可以让ssh-add
使用来自于keychain的密码——这意味着可以不用一遍又一遍地输入!
那么接下来要做的事情已经很清楚了。先手动运行一次带-K
选项的ssh-add
1 | ssh-add -K ~/.ssh/id_rsa |
并输入密码——这将会是在Mac上的最后一次输入。再用-A
选项调用ssh-add
1 | !/bin/bash |
我把上面这段代码保存为文件/Users/liutos/SourceCode/shell/auto_ssh_add/auto_ssh_add.sh
,它很快就会被用到。最后,写一个Launchd的配置文件~/Library/LaunchAgents/com.liutos.tools.sshAdd.plist
1 |
|
从现在起,再也不需要一遍又一遍地输入ssh的密码了——一次也不需要。
后记
要是有哪些读者朋友成功地用expect
实现自动输入密码的,还望不吝赐教;)