免除频繁输入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实现自动输入密码的,还望不吝赐教;)

阅读原文

相关文章
相关标签/搜索