序言
在入手MacBook Pro前,我的开发环境主要是一个运行在VirtualBox中的Mint发行版。在这个系统中,只要运行一次git push
并输入passphrase(下称密码)后,之后便不再需要输入了——即使ssh登录远程机器也是如此。
但用上Mac后发现,这里的ssh没有这个方便的特性——每次运行git push
或ssh
,都需要输入密码,颇不方便。
为了避免一遍又一遍地输入密码,每次登录后,我都会运行ssh-add
来一劳永逸地解决问题
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
ssh-add -K ~/.ssh/id_rsa
并输入密码——这将会是在Mac上的最后一次输入。再用-A
选项调用ssh-add
#!/bin/bash
ssh-add -A ~/.ssh/id_rsa
我把上面这段代码保存为文件/Users/liutos/SourceCode/shell/auto_ssh_add/auto_ssh_add.sh
,它很快就会被用到。最后,写一个Launchd的配置文件~/Library/LaunchAgents/com.liutos.tools.sshAdd.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.liutos.tools.sshAdd</string>
<key>Program</key>
<string>/Users/liutos/SourceCode/shell/auto_ssh_add/auto_ssh_add.sh</string>
<key>RunAtLoad</key>
<true/>
<key>StandardOutPath</key>
<string>/tmp/auto_ssh_add.log</string>
<key>StandardErrorPath</key>
<string>/tmp/auto_ssh_add.err</string>
</dict>
</plist>
从现在起,再也不需要一遍又一遍地输入ssh的密码了——一次也不需要。
后记
要是有哪些读者朋友成功地用expect
实现自动输入密码的,还望不吝赐教;)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。