web-dev-qa-db-ja.com

ssh-agentがすでにbashで実行されているかどうかを確認する方法は?

Linux環境にshスクリプトのサンプルがあります。これは基本的にssh-agent現在のシェルに対して、キーを追加し、2つのgitコマンドを実行します。

#!/bin/bash
eval "$(ssh-agent -s)"
ssh-add /home/duvdevan/.ssh/id_rsa

git -C /var/www/duvdevan/ reset --hard Origin/master
git -C /var/www/duvdevan/ pull Origin master

スクリプトは実際には正常に動作しますが、実行するたびに新しいプロセスが取得されるため、パフォーマンスの問題になり、無駄なプロセスが発生する可能性があります。

出力の例:

Agent pid 12109
Identity added: /home/duvdevan/.ssh/custom_rsa (rsa w/o comment)

また、これらすべてに加えて、既存のssh-agent処理してキーを追加しますか?

23
omerowitz

いいえ、本当に、ssh-agentがすでにbashで実行されているかどうかを確認する方法は?

これまでの回答は、元の質問に答えているようには見えません...

ここに私のために働くものがあります:

if ps -p $SSH_AGENT_PID > /dev/null
then
   echo "ssh-agent is already running"
   # Do something knowing the pid exists, i.e. the process with $PID is running
else
eval `ssh-agent -s`
fi

これは、から取られました https://stackoverflow.com/a/15774758

25
AndrewD

スクリプトの終了直後に削除する場合は、eval行の後にこれを追加できます。

trap "kill $SSH_AGENT_PID" exit

または:

trap "ssh-agent -k" exit

$SSH_AGENT_PIDssh-agent -sの評価に設定されます。

/tmp/ssh-*をスキャンし、そこからSSH_AGENT変数(SSH_AUTH_SOCKおよびSSH_AGENT_PID)を再構築することで、実行中のssh-agentを見つけることができるはずです。

8
Friek

また、これらすべてに加えて、既存のssh-agentプロセスを見つけてキーを追加することは可能ですか?

はい。接続情報をファイルに保存できます:

# Ensure agent is running
ssh-add -l &>/dev/null
if [ "$?" == 2 ]; then
    # Could not open a connection to your authentication agent.

    # Load stored agent connection info.
    test -r ~/.ssh-agent && \
        eval "$(<~/.ssh-agent)" >/dev/null

    ssh-add -l &>/dev/null
    if [ "$?" == 2 ]; then
        # Start agent and store agent connection info.
        (umask 066; ssh-agent > ~/.ssh-agent)
        eval "$(<~/.ssh-agent)" >/dev/null
    fi
fi

# Load identities
ssh-add -l &>/dev/null
if [ "$?" == 1 ]; then
    # The agent has no identities.
    # Time to add one.
    ssh-add -t 4h
fi

このコードは sshエージェントの落とし穴 からのもので、現在実行していることの落とし穴、このアプローチの落とし穴、および ssh-ident を使用してこれを行う方法の両方を説明していますあなたのために。


Ssh-agentが実行されていない場合にのみ実行し、それ以外は何もしない場合:

if [ $(ps ax | grep [s]sh-agent | wc -l) -gt 0 ] ; then
    echo "ssh-agent is already running"
else
    eval $(ssh-agent -s)
    if [ "$(ssh-add -l)" == "The agent has no identities." ] ; then
        ssh-add ~/.ssh/id_rsa
    fi

    # Don't leave extra agents around: kill it on exit. You may not want this part.
    trap "ssh-agent -k" exit
fi

ただし、これはssh-agentにアクセスできることを保証しません(実行しているからといって、ssh-addが接続する$ SSH_AGENT_PIDがあるわけではありません)。

8
idbrii

Ubuntu 14.04では、受け入れられた答えがうまくいきませんでした。

使用する必要があるssh-agentが実行されているかどうかを確認するテストは次のとおりです。

[[ ! -z ${SSH_AGENT_PID+x} ]]

そして、私はssh-agentを起動しています:

exec ssh-agent bash

それ以外の場合は、SSH_AGENT_PIDは設定されていません。

以下はUbuntu 14.04と18.04の両方で動作するようです。

#!/bin/bash
sshkey=id_rsa
# Check ssh-agent
if [[ ! -z ${SSH_AGENT_PID+x} ]]
then
    echo "[OK] ssh-agent is already running with pid: "${SSH_AGENT_PID}
else
    echo "Starting new ssh-agent..."
    `exec ssh-agent bash`
    echo "Started agent with pid: "${SSH_AGENT_PID}
fi
# Check ssh-key
if [[ $(ssh-add -L | grep ${sshkey} | wc -l) -gt 0 ]]
then
    echo "[OK] SSH key already added to ssh-agent"
else
    echo "Need to add SSH key to ssh-agent..."
    # This should Prompt for your passphrase
    ssh-add ~/.ssh/${sshkey}
fi
2
SveborK

ps -p $SSH_AGENT_PID > /dev/null || eval "$(ssh-agent -s)"

単一行コマンド。初めて実行すると、ssh-agentが起動します。 2回目の実行では、ssh-agentは開始されません。シンプルでエレガントなメイト!!!

2
iceman

$SSH_AGENT_PIDを使用すると、ssh-agentのみをテストできますが、まだ追加されていない場合はIDが失われます

$ eval `ssh-agent`
Agent pid 9906
$ echo $SSH_AGENT_PID
9906
$ ssh-add -l
The agent has no identities.

したがって、以下の例のように expect script を指定してssh-add -lでチェックすると節約できます。

$ eval `ssh-agent -k`
Agent pid 9906 killed
$ ssh-add -l
Could not open a connection to your authentication agent.
$ ssh-add -l &>/dev/null
$ [[ "$?" == 2 ]] && eval `ssh-agent`
Agent pid 9547
$ ssh-add -l &>/dev/null
$ [[ "$?" == 1 ]] && expect $HOME/.ssh/agent
spawn ssh-add /home/user/.ssh/id_rsa
Enter passphrase for /home/user/.ssh/id_rsa: 
Identity added: /home/user/.ssh/id_rsa (/home/user/.ssh/id_rsa)
$ ssh-add -l
4096 SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX /home/user/.ssh/id_rsa (RSA)

したがって、ssh-agentssh-add -lの両方がbashスクリプトで実行されるようになっている場合:

#!/bin/bash
ssh-add -l &>/dev/null
[[ "$?" == 2 ]] && eval `ssh-agent`
ssh-add -l &>/dev/null
[[ "$?" == 1 ]] && expect $HOME/.ssh/agent

次に、接続が実行されていることを常に確認して保証します。

$ ssh-add -l
4096 SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX /home/user/.ssh/id_rsa (RSA)

do while を使用して、上記のスクリプトでコマンドの繰り返しをエミュレートすることもできます

1
Chetabahana

ここのすべての答えに感謝します。私はこのスレッドを長年にわたって数回使用して、アプローチを微調整しました。 LinuxおよびOSXで動作する現在のssh-agent.shチェッカー/ランチャースクリプトを共有したかった。

次のブロックは私の$HOME/.bash.d/ssh-agent.shです

function check_ssh_agent() {
  if [ -f $HOME/.ssh-agent ]; then
    source $HOME/.ssh-agent > /dev/null
  else
    # no agent file
    return 1
  fi

  if [[ ${OSTYPE//[0-9.]/} == 'darwin' ]]; then
    ps -p $SSH_AGENT_PID > /dev/null  
    # gotcha: does not verify the PID is actually an ssh-agent
    # just that the PID is running
    return $?
  fi

  if [ -d /proc/$SSH_AGENT_PID/ ]; then
    # verify PID dir is actually an agent
    grep ssh-agent /proc/$SSH_AGENT_PID/cmdline  > /dev/null  2> /dev/null; 
    if [ $? -eq 0 ]; then
      # yep - that is an agent
      return 0
    else
      # nope - that is something else reusing the PID
      return 1
    fi
  else
    # agent PID dir does not exist - dead agent
    return 1
  fi 
}

function launch_ssh_agent() {
  ssh-agent > $HOME/.ssh-agent
  source $HOME/.ssh-agent
  # load up all the pub keys
  for I in $HOME/.ssh/*.pub ; do
    echo adding ${I/.pub/}
    ssh-add ${I/.pub/}
  done
}

check_ssh_agent
if [ $? -eq 1 ];then
  launch_ssh_agent
fi

上記を.bashrcから起動します:

if [ -d $HOME/.bash.d ]; then
  for I in $HOME/.bash.d/*.sh; do
    source $I  
  done
fi

これが他の人がすぐに立ち上がって行くのに役立つことを願っています.

私と一緒にこれをハック/改善したい場合は、公開の要点を作成しました: https://Gist.github.com/dayne/a97a258b487ed4d5e9777b61917f0a72

0
Dayne Broderson

行1を次のように変更できます。

PID_SSH_AGENT=`eval ssh-agent -s | grep -Po "(?<=pid\ ).*(?=\;)"`

そして、スクリプトの最後で次のことができます。

kill -9 $PID_SSH_AGENT
0
alok