序言

在入手MacBook Pro前,我的开发环境主要是一个运行在VirtualBox中的Mint发行版。在这个系统中,只要运行一次git push并输入passphrase(下称密码)后,之后便不再需要输入了——即使ssh登录远程机器也是如此。

但用上Mac后发现,这里的ssh没有这个方便的特性——每次运行git pushssh,都需要输入密码,颇不方便。

为了避免一遍又一遍地输入密码,每次登录后,我都会运行ssh-add来一劳永逸地解决问题

ssh-add ~/.ssh/id_rsa

自从升级到macOS Catalina后,如果在合盖睡眠前没有注销的话,下次开盖唤醒极有可能卡死在登录界面。无奈之下,我每天都需要注销并在第二天重新登录,以至于每天都得运行ssh-add并输入密码。久而久之,这也挺烦人的。

一次失败的优化

为了省却每次都输入长达14个字符的密码的烦恼,我想到了expect(1),这是一种可以交互式地控制其它命令的脚本语言。遗憾的是,经过一番折腾,仍然没办法成功让expect把密码输入给ssh-add,我只好继续寻找其它的办法。

一次成功的优化

某天在阅读ssh-addman文档时,了解到原来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实现自动输入密码的,还望不吝赐教;)

阅读原文


用户bPGfS
169 声望3.7k 粉丝