在入手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
實現自動輸入密碼的,還望不吝賜教;)