免除頻繁輸入ssh密碼的煩惱

序言

在入手MacBook Pro前,個人開發環境主要是一個運行在VirtualBox中的Mint發行版。在這個系統中,只要運行一次git push並輸入passphrase(下稱密碼)後,以後便再也不須要輸入了——即便ssh登陸遠程機器也是如此。git

但用上Mac後發現,這裏的ssh沒有這個方便的特性——每次運行git pushssh,都須要輸入密碼,頗不方便。github

爲了不一遍又一遍地輸入密碼,每次登陸後,我都會運行ssh-add來一勞永逸地解決問題shell

ssh-add ~/.ssh/id_rsa

自從升級到macOS Catalina後,若是在合蓋睡眠前沒有註銷的話,下次開蓋喚醒極有可能卡死在登陸界面。無奈之下,我天天都須要註銷並在次日從新登陸,以致於天天都得運行ssh-add並輸入密碼。長此以往,這也挺煩人的。bash

一次失敗的優化

爲了省卻每次都輸入長達14個字符的密碼的煩惱,我想到了expect(1),這是一種能夠交互式地控制其它命令的腳本語言。遺憾的是,通過一番折騰,仍然沒辦法成功讓expect把密碼輸入給ssh-add,我只好繼續尋找其它的辦法。app

一次成功的優化

某天在閱讀ssh-addman文檔時,瞭解到原來ssh-add有一個-K選項,能夠在添加身份到ssh-agent時,將密碼存儲到用戶的keychain中。同時還有一個-A選項,可讓ssh-add使用來自於keychain的密碼——這意味着能夠不用一遍又一遍地輸入!ssh

那麼接下來要作的事情已經很清楚了。先手動運行一次帶-K選項的ssh-add優化

ssh-add -K ~/.ssh/id_rsa

並輸入密碼——這將會是在Mac上的最後一次輸入。再用-A選項調用ssh-addcode

#!/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.plistxml

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

閱讀原文

相關文章
相關標籤/搜索