複数のログインセッション間で同じ「ssh-agent」を共有する


61

特定のユーザー(つまり、私)からのすべてのログインが同じssh-agentを使用するようにする便利な方法はありますか?ほとんどの場合、この作業を行うためにスクリプトをハックしましたが、今まで見逃していた方法があると疑っていました。さらに、それ以来、たとえばこのWebサイトのように、コンピューティングテクノロジーの驚くべき進歩がありました。

だからここの目標は

  • SSH経由であるか、gdm / kdm / etcから開始されたグラフィカルセッションであるか、またはコンソールであるかに関係なく、ボックスにログインするたびに:
    • ユーザー名が現在ssh-agent実行されていない場合は、ユーザー名が開始され、環境変数がエクスポートされ、ssh-add呼び出されます。
    • それ以外の場合、既存のエージェントの座標はログインセッションの環境変数にエクスポートされます。

この機能は、問題のボックスがssh3番目のボックスに入るときに中継ポイントとして使用される場合に特に役立ちます。この場合、sshを実行するたびに秘密鍵のパスフレーズを入力し、その後、たとえばgit push何かをする必要がなくなります。

Xがクラッシュし、別のグラフィカルセッションを開始したときに最近失敗したものの、以下のスクリプトはほとんど確実にこれを行います。その場合、他のねじれが起こっている可能性があります。

これが、私が悪いと思うスクリプトです。私はこれを私のソースから入手し.bashrcます。

# ssh-agent-procure.bash
# v0.6.4
# ensures that all shells sourcing this file in profile/rc scripts use the same ssh-agent.
# copyright me, now; licensed under the DWTFYWT license.

mkdir -p "$HOME/etc/ssh";

function ssh-procure-launch-agent {
    eval `ssh-agent -s -a ~/etc/ssh/ssh-agent-socket`;
    ssh-add;
}

if [ ! $SSH_AGENT_PID ]; then
  if [ -e ~/etc/ssh/ssh-agent-socket ] ; then
    SSH_AGENT_PID=`ps -fC ssh-agent |grep 'etc/ssh/ssh-agent-socket' |sed -r 's/^\S+\s+(\S+).*$/\1/'`; 
    if [[ $SSH_AGENT_PID =~ [0-9]+ ]]; then
      # in this case the agent has already been launched and we are just attaching to it. 
      ##++  It should check that this pid is actually active & belongs to an ssh instance
      export SSH_AGENT_PID;
      SSH_AUTH_SOCK=~/etc/ssh/ssh-agent-socket; export SSH_AUTH_SOCK;
    else
      # in this case there is no agent running, so the socket file is left over from a graceless agent termination.
      rm ~/etc/ssh/ssh-agent-socket;
      ssh-procure-launch-agent;
    fi;
  else
    ssh-procure-launch-agent;
  fi;
fi;

これを行うより良い方法があることを教えてください。また、不整合/失theを軽視しないでください(例:varものを入れるetc)。私はこれを少し前に書いて以来、多くのことを学びました。


1
KeyError: 'DWTFYWT'が見つかりません。あなたはWTFPLv2を意味しましたか?
悲しみ

@grawity:おかげでそのリンクのために、彼らのFAQは私の一日を作った 私はまた、WTFPLで、ところですることができます... ああしかし、はい、もちろんあなたのことができ。 しかし、私は... はい、できます。 できる… はい! HAHAHAHAHAHA
いんちきキホーテ

@grawity:いいえ、それは私があなたに考えてほしかったことです、mwahahaha。
直観

回答:


25

独自のバリエーションをミックスに追加することもできます。

function sshagent_findsockets {
    find /tmp -uid $(id -u) -type s -name agent.\* 2>/dev/null
}

function sshagent_testsocket {
    if [ ! -x "$(which ssh-add)" ] ; then
        echo "ssh-add is not available; agent testing aborted"
        return 1
    fi

    if [ X"$1" != X ] ; then
        export SSH_AUTH_SOCK=$1
    fi

    if [ X"$SSH_AUTH_SOCK" = X ] ; then
        return 2
    fi

    if [ -S $SSH_AUTH_SOCK ] ; then
        ssh-add -l > /dev/null
        if [ $? = 2 ] ; then
            echo "Socket $SSH_AUTH_SOCK is dead!  Deleting!"
            rm -f $SSH_AUTH_SOCK
            return 4
        else
            echo "Found ssh-agent $SSH_AUTH_SOCK"
            return 0
        fi
    else
        echo "$SSH_AUTH_SOCK is not a socket!"
        return 3
    fi
}

function sshagent_init {
    # ssh agent sockets can be attached to a ssh daemon process or an
    # ssh-agent process.

    AGENTFOUND=0

    # Attempt to find and use the ssh-agent in the current environment
    if sshagent_testsocket ; then AGENTFOUND=1 ; fi

    # If there is no agent in the environment, search /tmp for
    # possible agents to reuse before starting a fresh ssh-agent
    # process.
    if [ $AGENTFOUND = 0 ] ; then
        for agentsocket in $(sshagent_findsockets) ; do
            if [ $AGENTFOUND != 0 ] ; then break ; fi
            if sshagent_testsocket $agentsocket ; then AGENTFOUND=1 ; fi
        done
    fi

    # If at this point we still haven't located an agent, it's time to
    # start a new one
    if [ $AGENTFOUND = 0 ] ; then
        eval `ssh-agent`
    fi

    # Clean up
    unset AGENTFOUND
    unset agentsocket

    # Finally, show what keys are currently in the agent
    ssh-add -l
}

alias sagent="sshagent_init"

そして、ログインするたびに、エージェントを接続したい場合(常に接続するとは限りません)、単に入力しsagentます。


2
if [ ! -x "$(which ssh-add)" ];if ! which ssh-add;またはに置き換える必要がありますif ! command -v ssh-add。(覚えておいてください、[ただのコマンドです)
grawity

まあ、あなたはそれを行うことができますが、実際にif ! which ssh-add > /dev/nullはパスが印刷されないようにする必要があります。
ゼッド

基本的に答えはノーです。くだらない。まあ、これは私のハックよりも進化しているように見えるので、おそらく役に立つでしょう。奇妙なことに、これを行うためのより構造化された方法はなく、非常に有用なもののようです。
直観

私は最近すべてをレポジトリ化するのにふさわしいので、スクリプト用にgithubリポジトリを設定しました。再度、感謝します。私はライセンスで十分に正式であったことを望みます:〜/
直観

私は気にしません。ただし、誰かが改善を提出した場合はここにコメントしてください。
ゼド

36

ssh -A [user@]remotehost

これがあなたが探しているものかもしれないと思う。sshをssh-agentに転送するときに-Aスイッチを使用します。ユースケースは次のとおりです。

リモートサーバーにgitリポジトリがあり、リモートがgithubを指しているリモートサーバーがあります。スクリーンセッションでssh-agentを実行せずに、「git pull origin master」を実行するには、キーのパスフレーズを入力する必要があります。ブー!さらに、リモートサーバーに秘密キーをインストールする必要があります-さらにBoooo!

代わりssh -A [user@]remotehostに、ローカルで実行中のssh-agentに沿ってパスを使用するだけです。これで、リモートホスト上に秘密鍵が存在する必要さえなくなりました。ssh-agentでスクリプトを作成する必要はまったくないと思います。


4
これについては知りませんでしたが、この質問に答えたときに探していたものであることがわかりました。
ウィルマッカッテン

1
これは私が探していたものよりも優れています!素晴らしい答えです!
WhyNotHugo

1
参照man 5 ssh_config用にForwardAgentコンフィグ設定。デフォルトでエージェント転送を有効にし、-A引数の必要性を取り除きます。エージェント転送を使用する前に、リモートマシン上の他の特権ユーザーが転送されたエージェントソケットにアクセスできるというセキュリティリスクがあることに注意してください。これはmanページにも記載されています。これはここでよく説明されます
14年

私はAllowAgentForwardingオプションはいえ、サーバー上のyesに設定する必要がありますだと思う
Ziofil

20

Cygwinでも同様に機能する非常に素晴らしいものを次に示します。

SSH_ENV=$HOME/.ssh/environment

function start_agent {
     echo "Initialising new SSH agent..."
     /usr/bin/ssh-agent | sed 's/^echo/#echo/' > ${SSH_ENV}
     echo succeeded
     chmod 600 ${SSH_ENV}
     . ${SSH_ENV} > /dev/null
     /usr/bin/ssh-add;
}

# Source SSH settings, if applicable

if [ -f "${SSH_ENV}" ]; then
     . ${SSH_ENV} > /dev/null
     #ps ${SSH_AGENT_PID} doesn't work under cywgin
     ps -efp ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
         start_agent;
     }
else
     start_agent;
fi

それを.bash_profileまたは.bashrcに追加します

ソース:http : //www.cygwin.com/ml/cygwin/2001-06/msg00537.html


また、Windows用のGit Bashの(にMinGW64)で正常に動作します
ドルフィン

1
${SSH_ENV}"${SSH_ENV}"Windowsユーザー名にスペースが含まれているかどうかを確認する必要があります
-rgvcorley

この答えはインターネット上で跳ね返っているようです。ここでは、はるかに大きなstackoverflowスレッド上にあります。私見のベスト/最も簡単なアプローチ。
ルークデイビス


6

私は最近使用を開始しました:

https://github.com/ccontavalli/ssh-ident

追加するだけです:

  alias ssh=/path/to/ssh-ident

私の.bashrcファイル。スクリプトは次の処理を行います。

  • 最初に必要なときにエージェントを作成する
  • オンデマンドで必要なキーをロードする
  • 複数のログインセッションでエージェントを共有する
  • オンラインで使用する「ID」ごとに1つの複数のエージェントを管理し、接続しているホストまたは現在の作業ディレクトリに基づいて適切なエージェントを使用します。

ssh-identは素晴らしいです!事前にキーをロック解除する代わりに、sshを試みると、キーがロック解除され、エージェントがロードされます。これにより、キーのタイムアウトが便利になります。さらに重要なことは、エージェントを使用目的ごとに分離することです(重大なセキュリティリスク。1台のマシンのルートは、現在のエージェントがキーを持っている他のすべてのマシンへのアクセスレベルを持っています!)
00prometheus

5

できるだけシンプルにすることを好みます:(スニペットから~/.profile

check-ssh-agent() {
    [ -S "$SSH_AUTH_SOCK" ] && { ssh-add -l >& /dev/null || [ $? -ne 2 ]; }
}

# attempt to connect to a running agent
check-ssh-agent || export SSH_AUTH_SOCK="$(< ~/.tmp/ssh-agent.env)"
# if agent.env data is invalid, start a new one
check-ssh-agent || {
    eval "$(ssh-agent -s)" > /dev/null
    echo "$SSH_AUTH_SOCK" > ~/.tmp/ssh-agent.env
}

私は-a前に使用することを考えていませんでしたが、それは簡単かもしれません:

check-ssh-agent || export SSH_AUTH_SOCK=~/.tmp/ssh-agent.sock
check-ssh-agent || eval "$(ssh-agent -s -a ~/.tmp/ssh-agent.sock)" > /dev/null

いいね 私は私の答えでそれをいくぶん単純化しました(以下)。
エーテル

2

私の場合、PowerShellでposh-gitをセットアップしており、cygwinで同じssh-agentを使用することを望んでいました。異なるtmpフォルダーを使用するため、パス操作を行う必要があり、作成された.envファイルはBOMとCR \ LFを含むUTF16であったため、対処が楽でした。cygwinが使用する.bashrcに次を追加すると機能するはずです。

# Connect to ssh-agent started by posh-git
SSH_AGENT_ENV=$(cygpath "$LOCALAPPDATA\Temp")
if [ -z $SSH_AUTH_SOCK ] && [ -z $SSH_TTY ]; then  # if no agent & not in ssh
  if [ -f "$SSH_AGENT_ENV/.ssh/SSH_AUTH_SOCK.env" ]; then
    AUTH_SOCK=$(iconv -c -f UTF-16LE -t US-ASCII "$SSH_AGENT_ENV/.ssh/SSH_AUTH_SOCK.env" | tr -d '\r\n')
    export SSH_AUTH_SOCK="${AUTH_SOCK/\/tmp/$SSH_AGENT_ENV}"
    ssh-add -l > /dev/null
    if [ $? = 2 ] ; then
      echo "Failed to setup posh-git ssh-agent using $AUTH_SOCK"
      unset SSH_AUTH_SOCK
    else
      echo "Found posh-git ssh-agent $AUTH_SOCK"
    fi
  else #Start new agent if you want (not shared by posh-git)
    echo "failed to setup posh-git ssh-agent"
    #eval `ssh-agent -s` > /dev/null
  fi
fi

1

ここでも、すぐに.bash_profileに入れて、ログオン時にデフォルトキーを追加するように要求する例です。私の場合、転送はオプションではありませんでした。

do-ssh-agent() {
  # function to start the ssh-agent and store the agent details for later logon
  ssh-agent -s > ~/.ssh-agent.conf 2> /dev/null
  . ~/.ssh-agent.conf > /dev/null
}

# set time a key should be kept in seconds
keyage=3600

if [ -f ~/.ssh-agent.conf ] ; then
  . ~/.ssh-agent.conf > /dev/null
  ssh-add -l > /dev/null 2>&1
  # $?=0 means the socket is there and it has a key
  # $?=1 means the socket is there but contains no key
  # $?=2 means the socket is not there or broken
  stat=$?
  if [ $stat -eq 1 ] ; then
    ssh-add -t $keyage > /dev/null 2>&1
  elif [ $stat -eq 2 ] ; then
    rm -f $SSH_AUTH_SOCK
    do-ssh-agent
    ssh-add -t $keyage > /dev/null 2>&1
  fi
else
  do-ssh-agent
  ssh-add -t $keyage > /dev/null 2>&1
fi

1

これは私のソリューションであり、https://superuser.com/a/141233/5255(このスレッド内)から改変されています

# attempt to connect to a running agent - cache SSH_AUTH_SOCK in ~/.ssh/
sagent()
{
    [ -S "$SSH_AUTH_SOCK" ] || export SSH_AUTH_SOCK="$(< ~/.ssh/ssh-agent.env)"

    # if cached agent socket is invalid, start a new one
    [ -S "$SSH_AUTH_SOCK" ] || {
        eval "$(ssh-agent)"
        ssh-add -t 25920000 -K ~/.ssh/id_rsa
        echo "$SSH_AUTH_SOCK" > ~/.ssh/ssh-agent.env
    }
}

1

作成ファイル〜/ ssh-agent.sh

agent_out_file="$HOME/ssh-agent.out"

function initialize {
    pgrep ssh-agent && kill $(pgrep ssh-agent)
    ssh-agent -s > $agent_out_file 
    . $agent_out_file
}

pgrep ssh-agent
if [ $? -eq 0 ]; then # ssh agent running
    ssh-add -l > /dev/null 2>&1
    status=$?
    if [ $status -eq 0 ]; then # can connect to ssh agent and keys available
        echo nothing to do
    elif [ $status -eq 1 ]; then # can connect to ssh agent and no keys available
        echo nothing to do
    elif [ $status -eq 2 ]; then # cannot connect to ssh agent
        . $agent_out_file
    fi
else # ssh agent not running
    initialize   
fi

ファイルを.bashrcに含める

. ~/ssh-agent.sh

0

これは私が追加したもので、私にとっては有効です。最初に、実行中のエージェントがあるかどうかを確認し、はいの場合は適切な環境を設定し、そうでない場合は作成します。また、余分なエージェントを作成する必要がなくなります。

それをあなたの .bashrc

function start_agent() {
    killall ssh-agent  2> /dev/null
    ssh-agent | sed 's/ Agent pid//' > $SSH_ENV
    . $SSH_ENV > $SSH_PID_FILE
    ssh-add ~/.ssh/bb_readonly_rsa 2> /dev/null
}

mkdir -p "$HOME/.ssh/agent"
SSH_ENV="$HOME/.ssh/agent/env"
SSH_PID_FILE="$HOME/.ssh/agent/pid"

if [[ -e $SSH_PID_FILE ]]; then
    SSH_PID=$(< $SSH_PID_FILE) 
    PROCESS=$(ps -p $SSH_PID -o comm=)

    if [[ $PROCESS == 'ssh-agent' ]]; then
        . $SSH_ENV > $SSH_PID_FILE
    else 
        start_agent
    fi  
else
    start_agent
fi

0

.bashrcから直接取得したこの問題のバリエーションもあります。

# File for storing SSH agent information
OSH=".agent.${HOSTNAME}"

# Test if an agent file exists
if [ -f ${OSH} ];

    # We have one, so let's use it
    then eval `cat ${OSH}` >/dev/null

else

    # No file exists, so we must spawn a new agent
    eval `ssh-agent | tee ${OSH}` >/dev/null

fi

# Try to list agent keys
ssh-add -l &>/dev/null

# Determine the agent status
case $? in

    # Current and SSH keys installed, nothing to do here
    0) ;;

    # Current but no SSH keys installed, so we must add them
    1) ssh-add ;;

    # Stale, so we must redo from scratch with a new agent, then add keys
    *) eval `ssh-agent | tee ${OSH}` >/dev/null && ssh-add ;;

esac

このソリューションは、SSHエージェント情報のコピーをホームディレクトリに保存します。複数のホスト間で共有される可能性のあるNFS自動マウントホームディレクトリがある場合、ホスト名はファイル名の一部として使用されてホストを区別するため、あるマシンからログインすると、使用中のエージェントファイルが別のホストで上書きされません。

動作:

1)初回のユーザーセッションでは、キーパスフレーズの入力が求められます。

2)2番目、3番目、4番目(et cetera)のセッションは、最初に追加されたSSHエージェントとキーを継承します。

3)エージェントが強制終了またはクラッシュした場合、最初の後続のセッションで新しいエージェントが作成され、エージェントファイルが新しいエージェントファイルで上書きされ、キーパスフレーズの入力が再度求められます。新しいSSHエージェントが実行されている限り、その後作成されるセッションはシナリオ2)のように動作します。


0

(これは投稿2の上位を指し、コメントを追加できませんでした)

@raghavan:あなたの例は便利ですが、持っている2行を変更することをお勧めします

pgrep ssh-agent

pgrep -u $ USER ssh-agent> / dev / null

そのため、現在のユーザーで実行されているエージェントのみが検出され、pidは画面にエコーされません(クリーナー)。

また、$ HOME / ssh-agent.outを$ HOME / .ssh-agent.outに変更します

よろしく


0

元のソリューションといくつかの推奨ソリューションを読みましたが、自分で使用するためにプロセスを簡素化することにしました。これは私自身の.bashrcに追加したものです:

    # get active ssh-agent, or launch new
    SSH_AGENT_PID=$(ps -fC ssh-agent | grep "ssh-agent -a ${HOME}/.ssh/ssh-agent-socket" | awk '{print $2}')
    if [ -z "${SSH_AGENT_PID}" ]; then
      # If there is no ssh-agent running, we'll make sure one hasn't left a socket file dangling
      rm ${HOME}/.ssh/ssh-agent-socket &> /dev/null
      # And of course start one
      eval $(ssh-agent -a ${HOME}/.ssh/ssh-agent-socket)
    else
      # We found a process matching our requirements, so sticking with that
      export SSH_AGENT_PID
      export SSH_AUTH_SOCK="${HOME}/.ssh/ssh-agent-socket"
    fi

ここでいくつかの仮定を立てました。

  • 〜/ .sshディレクトリが存在すること。
  • システム上のユーザーごとに1つのssh-agentソケットのみが必要であること。
  • HOME環境変数が設定されていること(なぜそうしないのですか?)。
  • 実行中のプロセスがある状況を手動で処理しますが、何らかの理由で指定されたソケットファイルを使用しません。

全体として、単純な解決策のように感じます。


0

複数のssh-agentプロセスが実行されていることが多く、ソケットファイル名内のPIDが実際には実行中のPIDと一致しないことがssh-agentわかったため、上記の多数の例に基づいて、これらの状態から回復しようと何かをハックしました。

単一の関数であり、ユーザーIDがある場合はZsh変数を使用し、もう少し/tmp制限find(1)することで、巨大なディレクトリの解析にかかる時間を短縮しようとします。

おそらくエラーが発生しやすく、複雑です。しかし、いくつかの大まかなテストでは、ほとんどの場合、私のユースケースで機能することが示されています。

attach_ssh_agent(){
  if [-n "$ SSH_AGENT_PID"]; それから
    ssh-add -l> / dev / null
    ret = $?
    if [$ ret -ge 2]; それから
      echo "エージェントpid $ SSH_AGENT_PIDは役に立たない(ret = $ ret)-killing ..."
      $ SSH_AGENT_PIDを強制終了します
      $ SSH_AGENT_PIDの設定を解除します
    elif [$ ret = 1]; それから
      echo "エージェントpid $ SSH_AGENT_PIDは役に立たない(ret = $ ret)-シードします..."
    他に
      echo "エージェントpid $ SSH_AGENT_PID"
      帰る
    fi
  fi
  if [-S "$ SSH_AUTH_SOCK"]; それから
    ssh-add -l> / dev / null
    ret = $?
    if [$ ret = 2]; それから
      echo "ソケット$ SSH_AUTH_SOCKは無効です-削除しています..."
      rm -f $ SSH_AUTH_SOCK
      SSH_AUTH_SOCKの設定を解除します
    elif [$ ret = 1]; それから
      echo "ソケット$ SSH_AUTH_SOCKはキーのないエージェントを指します..."
      ssh-add
    他に
      echo "ssh-agent $ SSH_AUTH_SOCKが見つかりました(ret = $ ret)"
      帰る
    fi
  fi
  sf for $(find / tmp / -mindepth 2 -maxdepth 2 -uid $ {UID:-$(id -u)} -path '/tmp/ssh-*/agent.*' -type s); 行う
    テスト-r $ sf || 持続する
    エクスポートSSH_AUTH_SOCK = $ sf
    SSH_AGENT_PID = $(ベース名$ SSH_AUTH_SOCK | cut -d。-f2)
    #他のプロセスフォークとの競合、argh
    try = 50
    while [$ try -gt 0]; 行う
      try = $(($ try-1))
      エクスポートSSH_AGENT_PID = $(($ SSH_AGENT_PID + 1))
      echo "$ SSH_AUTH_SOCKのテスト-> $ SSH_AGENT_PID"
      ssh_agent_running = $(ps -u $ USER | grep ssh-agent)
      if [-z "$ ssh_agent_running"]; それから
        echo "ソケット$ SSH_AUTH_SOCKには実行中のエージェントへのリンクが含まれていません-削除しています..."
        rm -f $ SSH_AUTH_SOCK
        持続する
      fi
      if echo "$ ssh_agent_running" | \
           awk '$ 1 ==' $ SSH_AGENT_PID '{
                  found = 1;
                  exit(0);
              }
              終わり {
                  if(!found){
                      print "実行中のPID '$ SSH_AGENT_PID'が見つかりませんでした";
                      exit(1);
                  }
              } '; それから
        ssh-add -l> / dev / null
        ret = $?
        if [$ ret -ge 2]; それから
          echo "ソケット$ SSH_AUTH_SOCKには、$ SSH_AGENT_PIDの有用なエージェントへのリンクが含まれていません-削除しています..."
          rm -f $ SSH_AUTH_SOCK
          $ SSH_AGENT_PIDを強制終了します
          SSH_AGENT_PIDの設定を解除します
          続ける2
        elif [$ ret = 1]; それから
          echo "ソケット$ SSH_AUTH_SOCKには、$ SSH_AGENT_PIDの有用ではないエージェントへのリンクが含まれています-シード中..."
          ssh-add
          もし!ssh-add -l> / dev / null; それから
            echo "ソケット$ SSH_AUTH_SOCKには、まだ$ SSH_AGENT_PIDの有用ではないエージェントへのリンクが含まれています-中止しています。"
            帰る
          他に
            ブレーク
          fi
        他に
          ブレーク
        fi
      他に
#echo「ソケット$ SSH_AUTH_SOCKをエージェントPID $ SSH_AGENT_PIDと一致できませんでした-スキップしています...」
        持続する
      fi
    やった
    if [$ try -gt 0]; それから
      echo "ssh-agent $ SSH_AUTH_SOCKが見つかりました"
      echo "エージェントpid $ SSH_AGENT_PID"
      帰る
    fi
  やった
  if [-n "$ try" -a -n "$ SSH_AUTH_SOCK" -a -n "$ ssh_agent_running"]; それから
    echo「何度も試してみましたが、$ SSH_AUTH_SOCKを実行中のエージェントのいずれにも一致させることができませんでした、ため息」
    echo "$ ssh_agent_running"
    echo "残り物を残して新しいエージェントを開始する..."
  fi
  eval $(ssh-agent -t 28800)
  ssh-add
}

0

これについての私のスピンです。私は「ソース」以下.bash_profileからスクリプト

MYAGENTS=(`pgrep -U $USER -f ^ssh-agent$|sort -n`)

echo "Found ${#MYAGENTS[@]} ssh-agents."

# Let's try to take over the agents, like we do everynight Pinky!
if [[ "${MYAGENTS[@]}" ]];then
  KEEPER=${MYAGENTS[0]}
  echo KEEPER: $KEEPER
  OUTCAST=${MYAGENTS[@]:1}
  [[ "$OUTCAST" ]] && { echo "Goodbye agent $OUTCAST"; kill $OUTCAST; }
  SSH_AUTH_SOCK=`awk '/tmp\/ssh/ {print $NF}' /proc/$KEEPER/net/unix`
  export SSH_AUTH_SOCK;
  SSH_AGENT_PID=$KEEPER; export SSH_AGENT_PID;
else
  NEWAGENT="`ssh-agent`"
  echo $NEWAGENT;
  eval $NEWAGENT
fi

ssh-add -l | grep "The agent has no identities" && ssh-add

0

以下は、同じssh-agentを常に再利用するか、実行されていない場合はssh-agentを起動する簡単なスクリプトです。キーは使用することです-a、同じソケット名オプションを使用することです。それ以外の場合、デフォルトでは毎回ランダムなソケット名が選択されます。これらの3行を1行のエイリアスに簡単に結合することもできます。

# set SSH_AUTH_SOCK env var to a fixed value
export SSH_AUTH_SOCK=~/.ssh/ssh-agent.sock

# test whether $SSH_AUTH_SOCK is valid
ssh-add -l 2>/dev/null >/dev/null

# if not valid, then start ssh-agent using $SSH_AUTH_SOCK
[ $? -ge 2 ] && ssh-agent -a "$SSH_AUTH_SOCK" >/dev/null

ソース

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.