GitHubにpush,pullするときのパスワード認証が鬱陶しいのでzshで何とかする
皆さんお馴染み The world’s leading software development platform · GitHub ですが、
パスワード付きの鍵を作ってしまうと、 push, pull のたびに認証を要求されてしまいます。
GitHub曰く「別にパスワード付けても凄くセキュアになるわけじゃないよ」だそうですが、
同時に「でもパスワード付ければちょっとはセキュアになるよ」とも言っています。
とても親切です。
でも認証が面倒くさいじゃん!!
という人が僕以外にも多数いたようで、公式のヘルプページにスクリプトが載ってました。
以下抜粋:
SSH_ENV="$HOME/.ssh/environment" # start the ssh-agent function start_agent { echo "Initializing new SSH agent..." # spawn ssh-agent ssh-agent | sed 's/^echo/#echo/' > "$SSH_ENV" echo succeeded chmod 600 "$SSH_ENV" . "$SSH_ENV" > /dev/null ssh-add } # test for identities function test_identities { # test whether standard identities have been added to the agent already ssh-add -l | grep "The agent has no identities" > /dev/null if [ $? -eq 0 ]; then ssh-add # $SSH_AUTH_SOCK broken so we start a new proper agent if [ $? -eq 2 ];then start_agent fi fi } # check for running ssh-agent with proper $SSH_AGENT_PID if [ -n "$SSH_AGENT_PID" ]; then ps -ef | grep "$SSH_AGENT_PID" | grep ssh-agent > /dev/null if [ $? -eq 0 ]; then test_identities fi # if $SSH_AGENT_PID is not properly set, we might be able to load one from # $SSH_ENV else if [ -f "$SSH_ENV" ]; then . "$SSH_ENV" > /dev/null fi ps -ef | grep "$SSH_AGENT_PID" | grep ssh-agent > /dev/null if [ $? -eq 0 ]; then test_identities else start_agent fi fi
どうやらフォーラムに投稿されたものらしいです。
で、これを .bashrc なり .profile なりに書けば自動的に ssh-agent が立ち上がるぞと。
試してみたら愛用している zsh でも動きました。
しかし問題がありまして、既に立ち上がってるssh-agentがあるとコケるんですね。
端末を閉じる前に毎度毎度
$ ps aux | grep ssh-agent $ kill $SSH_AGENT_PID $ kill $SSH_AGENT_PID $ kill ...
なんてやってたらパスワード認証よりも面倒くさい。
私は不精ですから(キリッ
というわけで zsh のコールバックを利用して、
「zshが終了するときに自動的にssh-agentを終了させる」
が実装できないかどうか調べてみたら、あっさり解決したのでメモメモ。
具体的には .zshrc の末尾(でもどこでもいいけど)に
TRAPEXIT() { ssh-agent -k }
と書くだけでした。
- 参考: zsh: 9 Functions
Signalについては詳しくないので TRAPINT のほうが確実かも知れませんが、
とりあえずこれで動いてくれているのでとりあえず良し。
でもこれ、端末を複数立ち上げるとまた問題になりそうですね…。
screenを使う手もあるんですが、窓が沢山無いと落ち着かない私。
どうしたものかしら…。