在入手MacBook Pro前,个人开发环境主要是一个运行在VirtualBox中的Mint发行版。在这个系统中,只要运行一次git push
并输入passphrase(下称密码)后,以后便再也不须要输入了——即便ssh登陆远程机器也是如此。git
但用上Mac后发现,这里的ssh没有这个方便的特性——每次运行git push
或ssh
,都须要输入密码,颇不方便。github
为了不一遍又一遍地输入密码,每次登陆后,我都会运行ssh-add
来一劳永逸地解决问题shell
ssh-add ~/.ssh/id_rsa
自从升级到macOS Catalina后,若是在合盖睡眠前没有注销的话,下次开盖唤醒极有可能卡死在登陆界面。无奈之下,我天天都须要注销并在次日从新登陆,以致于天天都得运行ssh-add
并输入密码。长此以往,这也挺烦人的。bash
为了省却每次都输入长达14个字符的密码的烦恼,我想到了expect(1)
,这是一种能够交互式地控制其它命令的脚本语言。遗憾的是,通过一番折腾,仍然没办法成功让expect把密码输入给ssh-add
,我只好继续寻找其它的办法。app
某天在阅读ssh-add
的man
文档时,了解到原来ssh-add
有一个-K
选项,能够在添加身份到ssh-agent
时,将密码存储到用户的keychain中。同时还有一个-A
选项,可让ssh-add
使用来自于keychain的密码——这意味着能够不用一遍又一遍地输入!ssh
那么接下来要作的事情已经很清楚了。先手动运行一次带-K
选项的ssh-add
优化
ssh-add -K ~/.ssh/id_rsa
并输入密码——这将会是在Mac上的最后一次输入。再用-A
选项调用ssh-add
code
#!/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
<?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
实现自动输入密码的,还望不吝赐教;)