Compartilhando o mesmo `ssh-agent` entre várias sessões de login


58

Existe uma maneira conveniente de garantir que todos os logins de um determinado usuário (ou seja, eu) usem o mesmo ssh-agent? Eu hackeei um script para fazer este trabalho a maior parte do tempo, mas eu suspeitava o tempo todo que havia alguma maneira de fazer isso que eu tinha acabado de perder. Além disso, desde então, houve avanços surpreendentes em tecnologia de computação, como por exemplo este site.

Então o objetivo aqui é que

  • sempre que eu fizer login na caixa, independentemente de ser via SSH ou em uma sessão gráfica iniciada a partir do gdm / kdm / etc, ou em um console:
    • se meu nome de usuário não tiver atualmente um ssh-agent executando, um é iniciado, as variáveis ​​de ambiente são exportadas e ssh-add chamado.
    • caso contrário, as coordenadas do agente existente serão exportadas nas variáveis ​​de ambiente da sessão de login.

Esta facilidade é especialmente valiosa quando a caixa em questão é usada como um ponto de ssh em uma terceira caixa. Neste caso, evita ter que digitar a frase secreta da chave privada toda vez que você digitar ssh e, por exemplo, desejar fazer git push ou alguma coisa.

O roteiro dado abaixo faz isso de forma mais confiável, embora tenha fracassado recentemente quando o X travou e eu iniciei outra sessão gráfica. Pode ter havido outro mal-estar acontecendo nesse caso.

Aqui está meu roteiro ruim é bom. Eu obtenho isso do meu .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;

Por favor, me diga que há uma maneira melhor de fazer isso. Também, por favor, não critique as inconsistências / gafes (por exemplo, colocando var coisas em etc ); Eu escrevi isso há um tempo e desde então aprendi muitas coisas.


1
KeyError: 'DWTFYWT' não encontrado; você quis dizer WTFPLv2 ?
grawity

@grawity: obrigado por esse link, suas perguntas frequentes fizeram o meu dia: By the way, com o WTFPL, eu também posso ... Ah, mas sim, claro que você pode. Mas eu posso… Sim você pode. Pode… Sim! hahahahahaha
quack quixote

@grawity: Não, é exatamente o que eu queria que você pensasse, mwahahaha.
intuited

Respostas:


24

Eu poderia jogar minha própria variação na mixagem:

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"

E então toda vez que eu fizer login, se eu quer um agente anexado (o que eu nem sempre), eu apenas digito sagent.


2
if [ ! -x "$(which ssh-add)" ]; deve ser substituído por if ! which ssh-add; ou if ! command -v ssh-add. (Lembrar, [ é apenas um comando)
grawity

Bem, você pode fazer isso, mas na verdade precisaria ser if ! which ssh-add > /dev/null para evitar que o caminho seja impresso, ponto em que não tenho certeza se é mais claro, embora eu suponha que ele economize uma invocação de comando extra.
Zed

Então, basicamente, a resposta é não, então. porcaria. Bem, isso parece ser mais evoluído do que o meu hack, então provavelmente será útil. Estranho que não haja uma maneira mais estruturada de fazer isso, parece algo que seria bastante útil.
intuited

Eu estou em um ajuste de repositorifying tudo estes dias, então eu configurei um repo do github para o seu script. Obrigado novamente. Espero ter sido formal o suficiente com o licenciamento: ~ /
intuited

Eu não me importo. Por favor, comente aqui se alguém enviar melhorias para ele, no entanto.
Zed

34

ssh -A [user@]remotehost

Eu acho que isso pode ser o que você está procurando. Use a opção -A ao executar o ssh-forward em seu agente ssh. Aqui está um usecase:

Eu tenho um servidor remoto que tem alguns git repos nele com um apontador remoto para o github. Sem um agente ssh em execução em uma sessão de tela, eu tenho que inserir a frase secreta para a minha chave, a fim de fazer um "mestre de origem git pull". Booo! Além disso, devo ter meu privado chave instalada no servidor remoto - mais Boooo!

Em vez disso, simplesmente usando ssh -A [user@]remotehost passa o meu agente ssh a correr localmente. Agora, não preciso mais que minha chave privada exista no host remoto. Eu não acredito que você precise fazer nenhum script com o ssh-agent.


2
Isso é o que eu estava procurando, thc!
tmow

3
Não sabia sobre isso, mas acabou sendo exatamente o que eu estava procurando quando cheguei a essa questão.
Will McCutchen

1
Isso é ainda melhor do que eu estava procurando! Ótima resposta!
WhyNotHugo

1
Veja também man 5 ssh_config para o ForwardAgent configuração de configuração. Permite o encaminhamento de agentes por padrão, eliminando a necessidade de -A argumento. Antes de usar o encaminhamento de agente, saiba que existe um risco de segurança em que outros usuários privilegiados na máquina remota poderiam acessar o soquete do agente encaminhado. Isso também é mencionado na página man. Isso é explicado bem Aqui .
starfry

Eu acho que a opção AllowAgentForwarding deve ser definida como sim no servidor, embora
Ziofil

20

Aqui está uma muito legal que também funciona no 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

Adicione-o ao seu .bash_profile ou .bashrc

Fonte: http://www.cygwin.com/ml/cygwin/2001-06/msg00537.html


Também funciona bem com o Git Bash (mingw64) para windows
Dolphin

1
${SSH_ENV} precisa ser "${SSH_ENV}" se o seu nome de usuário do Windows tiver um espaço
rgvcorley

Esta resposta parece estar saltando pela internet. Aqui está em um encadeamento stackoverflow muito maior . A melhor / mais simples abordagem IMHO.
Luke Davis


6

Eu comecei recentemente usando:

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

Tudo o que tenho a fazer é adicionar:

  alias ssh=/path/to/ssh-ident

No meu arquivo .bashrc. O roteiro cuida de:

  • criando um agente quando é necessário pela primeira vez
  • carregar as chaves necessárias sob demanda
  • compartilhar agentes em várias sessões de login
  • gerenciar vários agentes, um para cada 'identidade' que eu uso on-line e usar o agente certo com base no host ao qual estou me conectando ou no diretório de trabalho atual.

ssh-ident é fantástico! Ele desbloqueia a chave e carrega o agente quando eu tentar ssh em vez de ter que desbloquear a chave com antecedência. Isso torna os tempos limites importantes úteis. Mais importante, ele mantém meus agentes separados para diferentes usos (um grande risco de segurança; o root em uma máquina tem meu nível de acesso a todas as outras máquinas para as quais o agente atual possui chaves!)
00prometheus

5

Eu prefiro manter as coisas o mais simples possível: (trecho de ~/.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
}

Eu não pensei em usar -a antes, mas pode ser mais fácil:

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

Agradável. Eu simplifiquei um pouco na minha resposta (abaixo).
Ether

2

No meu caso eu tenho posh-git instalação no PowerShell e queria que o cygwin usasse o mesmo ssh-agent. Eu tive que fazer alguma manipulação de caminho desde que eles usam pastas de tmp diferentes eo arquivo de .env criado era UTF16 com BOM e CR \ LF de forma que era divertido de lidar com. Adicionar o seguinte ao .bashrc usado pelo cygwin deve funcionar:

# 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

Novamente, um exemplo para colocar seu .bash_profile imediatamente e pedir para adicionar sua chave padrão no logon. Encaminhamento não era uma opção no meu caso.

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

Esta é a minha solução, adaptada de https://superuser.com/a/141233/5255 (neste thread):

# 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

criar arquivo ~ / 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

inclua o arquivo em .bashrc

. ~/ssh-agent.sh

0

Isso é algo que eu adicionei, que funciona para mim. Primeiro, ele verifica se você tem um agente em execução, se sim, ele irá definir os ambientes apropriados para isso, se não, ele irá criá-lo. Também elimina a criação de agentes extras:

Basta colocar na sua .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

Eu tenho uma variação deste problema, também, tirada diretamente do meu .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

Essa solução armazena uma cópia das informações do agente SSH em seu diretório inicial. Caso você tenha um diretório pessoal montado automaticamente pelo NFS que possa ser compartilhado entre vários hosts, o nome do host é usado como parte do nome do arquivo para diferenciá-los, portanto, o login de uma máquina não afeta o arquivo do agente em uso em outra.

Comportamento:

1) As sessões do usuário pela primeira vez são solicitadas por uma frase secreta chave.

2) As sessões de segundo, terceiro e quarto (et cetera) herdam o agente SSH e as chaves adicionadas no primeiro.

3) Se o agente for eliminado ou travar, a primeira sessão subsequente criará um novo agente, substituirá o arquivo do agente pelo novo - e solicitará uma frase secreta de chave novamente. As sessões criadas subseqüentemente se comportarão como o cenário 2), desde que o novo agente SSH continue sendo executado.


0

(isso se refere ao post 2 mais alto, não foi possível adicionar um comentário)

@raghavan: Seu exemplo é útil, mas sugeriria alterar as duas linhas que têm

pgrep ssh-agent

para

pgrep -u $ USER ssh-agent & gt; / dev / null

de modo que somente os agentes em execução no usuário atual sejam encontrados e o pid não seja exibido na tela (limpador).

Também sugeriria mudar $ HOME / ssh-agent.out para $ HOME / .ssh-agent.out

Saudações


0

Eu li sua solução original e algumas das sugeridas, mas decidi simplificar o processo para meu próprio uso. Isto é o que eu adicionei no meu próprio .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

Eu fiz algumas suposições aqui:

  • Que o diretório ~ / .ssh existe.
  • Que você quer apenas um soquete ssh-agent por usuário no sistema.
  • Que a variável de ambiente HOME está definida (porque por que não, certo?).
  • Que você manipulará manualmente uma situação em que há um processo em execução, mas, por algum motivo, não usa o arquivo de soquete designado.

Tudo somado, acho que parece uma solução simples.


0

Eu descobri que muitas vezes eu tinha múltiplos ssh-agent processos em execução e que o PID dentro do nome do arquivo de soquete nunca correspondeu realmente ao PID de um arquivo em execução. ssh-agent, então eu hackeei algo para tentar recuperar dessas condições, com base em vários exemplos acima.

É uma única função, ele usa uma variável Zsh para o ID do usuário, se estiver lá, e tenta gastar menos tempo analisando possivelmente enormes /tmp diretórios restringindo find(1) um pouco mais.

É provavelmente ainda propenso a erros, e complicado, mas alguns testes superficiais indicam que funciona principalmente para os meus casos de uso, então aqui vai:

attach_ssh_agent () {
  if [ -n "$SSH_AGENT_PID" ]; then
    ssh-add -l >/dev/null
    ret=$?
    if [ $ret -ge 2 ]; then
      echo "Agent pid $SSH_AGENT_PID is less than useful (ret=$ret) - killing..."
      kill $SSH_AGENT_PID
      unset $SSH_AGENT_PID
    elif [ $ret = 1 ]; then
      echo "Agent pid $SSH_AGENT_PID is less than useful (ret=$ret) - will be seeding it..."
    else
      echo "Agent pid $SSH_AGENT_PID"
      return
    fi
  fi
  if [ -S "$SSH_AUTH_SOCK" ]; then
    ssh-add -l > /dev/null
    ret=$?
    if [ $ret = 2 ]; then
      echo "Socket $SSH_AUTH_SOCK is dead - deleting..."
      rm -f $SSH_AUTH_SOCK
      unset SSH_AUTH_SOCK
    elif [ $ret = 1 ]; then
      echo "Socket $SSH_AUTH_SOCK points to an agent with no keys..."
      ssh-add
    else
      echo "Found ssh-agent $SSH_AUTH_SOCK (ret=$ret)"
      return
    fi
  fi
  for sf in $(find /tmp/ -mindepth 2 -maxdepth 2 -uid ${UID:-$(id -u)} -path '/tmp/ssh-*/agent.*' -type s); do
    test -r $sf || continue
    export SSH_AUTH_SOCK=$sf
    SSH_AGENT_PID=$(basename $SSH_AUTH_SOCK | cut -d. -f2)
    # races with other process forks, argh
    try=50
    while [ $try -gt 0 ]; do
      try=$(($try-1))
      export SSH_AGENT_PID=$(($SSH_AGENT_PID+1))
      echo "Testing $SSH_AUTH_SOCK -> $SSH_AGENT_PID"
      ssh_agent_running=$(ps -u $USER | grep ssh-agent)
      if [ -z "$ssh_agent_running" ]; then
        echo "Socket $SSH_AUTH_SOCK does not contain a link to any running agent - deleting..."
        rm -f $SSH_AUTH_SOCK
        continue
      fi
      if echo "$ssh_agent_running" | \
           awk '$1 == '$SSH_AGENT_PID' {
                  found=1;
                  exit(0);
              }
              END {
                  if (!found) {
                      print "did not find running PID '$SSH_AGENT_PID'";
                      exit(1);
                  }
              }'; then
        ssh-add -l > /dev/null
        ret=$?
        if [ $ret -ge 2 ]; then
          echo "Socket $SSH_AUTH_SOCK does not contain a link to a useful agent at $SSH_AGENT_PID - deleting..."
          rm -f $SSH_AUTH_SOCK
          kill $SSH_AGENT_PID
          unset SSH_AGENT_PID
          continue 2
        elif [ $ret = 1 ]; then
          echo "Socket $SSH_AUTH_SOCK contains a link to a less than useful agent at $SSH_AGENT_PID - seeding..."
          ssh-add
          if ! ssh-add -l > /dev/null; then
            echo "Socket $SSH_AUTH_SOCK still contains a link to a less than useful agent at $SSH_AGENT_PID - aborting."
            return
          else
            break
          fi
        else
          break
        fi
      else
#        echo "Could not match socket $SSH_AUTH_SOCK to agent PID $SSH_AGENT_PID - skipping..."
        continue
      fi
    done
    if [ $try -gt 0 ]; then
      echo "Found ssh-agent $SSH_AUTH_SOCK"
      echo "Agent pid $SSH_AGENT_PID"
      return
    fi
  done
  if [ -n "$try" -a -n "$SSH_AUTH_SOCK" -a -n "$ssh_agent_running" ]; then
    echo "We tried many times, but could not match $SSH_AUTH_SOCK to any of the running agents, sigh"
    echo "$ssh_agent_running"
    echo "Leaving these leftovers behind and starting a new agent..."
  fi
  eval $(ssh-agent -t 28800)
  ssh-add
}

0

Aqui está o meu giro sobre isso. EU ' fonte ' o abaixo roteiro do meu .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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.