LoginSignup
2
3

More than 5 years have passed since last update.

GitHubのパスフレーズを省略するコードをconfig置いても大丈夫にした

Last updated at Posted at 2013-05-16

この記事( https://help.github.com/articles/working-with-ssh-key-passphrases )のスクリプトを改良してみました。

これでconfigを置いていてもssh-addが動くはず。

会社ではMysysGitとCygwin上で自分でコンパイルしたGitのために使っています。

普通にSSH使う場合も便利かもしれない。

※複数のHostで使うキーをConfigに指定していた場合不具合を修正しました。

#! /bin/bash

SSH_CONFIG="$HOME/.ssh/config"
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
    add_key
    if [ $? -ne 0 ]; then
        echo "[Error] Fail to add_key..."
        stop_agent
        return 1
    fi
}

function stop_agent {
    ps -f -u $USERNAME | grep "$SSH_AGENT_PID" | grep ssh-agent > /dev/null
    if [ $? -ne 0 ]; then
       return 1
    fi
    echo "Stop Agent..."
    echo "PID:$SSH_AGENT_PID"
    rm $SSH_ENV
    kill $SSH_AGENT_PID
    SSH_AGENT_PID=
    return 0
}

function add_key {
    echo "Adding keys."
    local ssh_add_cmd=""
    if [ -f "$SSH_CONFIG" ]; then
        echo "Search config"
        ssh_add_cmd=`cat $SSH_CONFIG |
                     grep "IdentityFile" |
                     sed -e "s/IdentityFile/ssh-add/g ;
                             s/[    ]\+/ /g ;
                             s/ ~/ ${HOME//\//\\/}/"`
    fi

    if [ "$ssh_add_cmd" = "" ]; then
      echo "ssh-add with default keys."
      ssh-add
      if [ $? -ne 0 ]; then
          return 1
      fi
      return 0
    else
      echo "config found. ssh-add with your setting keys."
      echo $ssh_add_cmd | bash
      return 0
    fi
    return 1
}

# 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
        add_key
        # $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 -f -u $USERNAME | 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 -f -u $USERNAME | grep "$SSH_AGENT_PID" | grep ssh-agent > /dev/null
    if [ $? -eq 0 ]; then
        test_identities
    else
        start_agent
    fi
fi
2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3