Совместное использование одного и того же `ssh-agent` среди нескольких сеансов входа

62

Есть ли удобный способ гарантировать, что все логины от данного пользователя (т.е. меня) используют один и тот же ssh-agent? Я взломал сценарий, чтобы сделать эту работу большую часть времени, но я все время подозревал, что есть какой-то способ сделать это, что я только что пропустил. Кроме того, с тех пор были достигнуты удивительные успехи в области компьютерных технологий, как, например, этот веб-сайт.

Итак, цель в том, чтобы

  • всякий раз, когда я вхожу в ящик, независимо от того, идет ли он через SSH, или в графическом сеансе, запущенном из gdm / kdm / etc, или в консоли:
    • если мое имя пользователя в данный момент не ssh-agentзапущено, оно запускается, переменные среды экспортируются и ssh-addвызываются.
    • в противном случае координаты существующего агента экспортируются в переменные среды сеанса входа в систему.

Это средство особенно ценно, когда рассматриваемый ящик используется как точка ретрансляции при sshвходе в третий ящик. В этом случае он избегает необходимости вводить парольную фразу закрытого ключа каждый раз, когда вы входите в 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;

Пожалуйста, скажите мне, что есть лучший способ сделать это. Также, пожалуйста, не придирайтесь к несоответствиям / оплошностям (например, добавляя varвещи etc); Я написал это некоторое время назад и с тех пор многому научился.

созерцаемое
источник
1
KeyError: 'DWTFYWT' не найден; Вы имели в виду WTFPLv2 ?
благодарность
@ Grawity: спасибо за эту ссылку, их часто задаваемые вопросы сделали мой день: Кстати, с WTFPL, я могу также ... О, но да, конечно, вы можете. Но могу ли я ... Да, вы можете. Может ... Да! хахахахахаха
шарлатан-кихот
@ Grawity: Нет, это именно то, что я хотел, чтобы вы думали, мвахахаха.
интуитивно

Ответы:

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.

Zed
источник
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

Я думаю, что это может быть то, что вы ищете. Используйте ключ -A при запуске ssh forward вашего ssh-agent. Вот пример использования:

У меня есть удаленный сервер, на котором есть некоторые git-репозитории с удаленным указателем на github. Без ssh-agent, запущенного в сеансе экрана, я должен ввести ключевую фразу для своего ключа, чтобы сделать «мастер происхождения git pull». Booo! Кроме того, у меня должен быть установлен мой закрытый ключ на удаленном сервере - больше Boooo!

Вместо этого, просто используя ssh -A [user@]remotehostпроходы по моему локально работающему ssh-agent. Теперь мне больше не нужен мой личный ключ, чтобы существовать даже на удаленном хосте. Я не верю, что вам нужно делать какие-либо скрипты с ssh-agent.

h355ian
источник
4
Не знал об этом, но оказалось, что именно то, что я искал, когда подошел к этому вопросу.
Уилл Маккатчен
1
Это даже лучше, чем я искал! Отличный ответ!
WhyNotHugo
1
Смотрите также man 5 ssh_configдля ForwardAgentнастройки конфигурации. Он включает переадресацию агента по умолчанию, устраняя необходимость в -Aаргументе. Перед использованием переадресации агента следует помнить, что существует угроза безопасности, при которой другие привилегированные пользователи на удаленном компьютере могут получить доступ к перенаправленному сокету агента. Это также упоминается на странице руководства. Это хорошо объяснено здесь .
звездный день
Я думаю, что параметр AllowAgentForwarding должен быть установлен на да на сервере, хотя
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

vonhogen
источник
Также хорошо работает с Git Bash (mingw64) для Windows
Dolphin
1
${SSH_ENV}должно быть, "${SSH_ENV}"если в вашем имени пользователя Windows есть пробел
rgvcorley
Этот ответ, кажется, скачет по интернету. Здесь речь идет о гораздо большем потоке stackoverflow . Лучший / самый простой подход ИМХО.
Люк Дэвис
6

Я недавно начал использовать:

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

Все, что мне нужно сделать, это добавить:

  alias ssh=/path/to/ssh-ident

В моем файле .bashrc. Сценарий заботится о:

  • создание агента, когда это необходимо
  • загрузить необходимые ключи по требованию
  • обмениваться агентами через несколько сеансов входа
  • управлять несколькими агентами, по одному на каждую «личность», которую я использую в сети, и использовать правильного агента на основе хоста, к которому я подключаюсь, или текущего рабочего каталога.
MarkMo
источник
ssh-идент это фантастика! Он разблокирует ключ и загружает агент, когда я пытаюсь выполнить ssh, вместо того, чтобы разблокировать ключ заранее. Это делает ключевые тайм-ауты полезными. Что еще более важно, он сохраняет мои агенты отдельно для разных целей (серьезная
угроза
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
grawity
источник
Приятно. Я несколько упростил это в своем ответе (ниже).
эфир
2

В моем случае у меня есть шикарно-ГИТ установка в PowerShell и хотел Cygwin использовать тот же SSH-агент. Мне пришлось сделать некоторые манипуляции с путями, поскольку они используют разные папки tmp, и был создан файл .env UTF16 с BOM и CR \ LF, так что было интересно иметь дело. Добавление следующего к .bashrc, используемому cygwin, должно работать:

# 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) Вторые, третьи и четвертые (и так далее) сеансы наследуют SSH-агент и ключи, добавленные в первый.

3) Если агент убит или аварийно завершает работу, первый последующий сеанс создаст нового агента, перезапишет файл агента новым - и снова запросит ключевую фразу-пароль. Созданные впоследствии сеансы будут вести себя как сценарий 2), пока новый агент SSH продолжает работать.

Оливер Джонс
источник
0

(это относится к посту 2 выше, я не смог добавить комментарий)

@raghavan: Ваш пример полезен, но предлагает изменить две строки, которые имеют

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 существует.
  • Что вам нужен только один сокет ssh-agent для каждого пользователя в системе.
  • Что переменная окружения HOME установлена ​​(потому что почему бы и нет, верно?).
  • Что вы будете вручную обрабатывать ситуацию, в которой запущен процесс, но по какой-то причине он не использует указанный файл сокета.

В общем, я думаю, что это похоже на простое решение.

user946031
источник
0

Я обнаружил, что у меня часто ssh-agentвыполнялось несколько процессов, и что PID внутри имени файла сокета никогда не совпадал с PID работающего ssh-agent, поэтому я взломал что-то, чтобы попытаться восстановиться после этих условий, основываясь на многочисленных приведенных выше примерах.

Это отдельная функция, она использует переменную Zsh для идентификатора пользователя, если она там есть, и пытается тратить меньше времени на разбор, возможно, огромных /tmpкаталогов, ограничивая find(1)немного больше.

Вероятно, он все еще подвержен ошибкам и запутан, но некоторые поверхностные тесты показывают, что он в основном работает для моих сценариев использования, так что вот так:

attach_ssh_agent () {
  if [-n "$ SSH_AGENT_PID"]; тогда
    ssh-add -l> / dev / null
    RET = $?
    if [$ ret -ge 2]; тогда
      echo "Agent pid $ SSH_AGENT_PID меньше, чем полезно (ret = $ ret) - убийство ..."
      убить $ SSH_AGENT_PID
      unset $ SSH_AGENT_PID
    elif [$ ret = 1]; тогда
      echo "Agent pid $ SSH_AGENT_PID менее чем полезен (ret = $ ret) - будет заполнять его ..."
    еще
      echo "Agent pid $ SSH_AGENT_PID"
      вернуть
    фи
  фи
  if [-S "$ SSH_AUTH_SOCK"]; тогда
    ssh-add -l> / dev / null
    RET = $?
    если [$ ret = 2]; тогда
      echo "Сокет $ SSH_AUTH_SOCK мертв - удаление ..."
      rm -f $ SSH_AUTH_SOCK
      сбросить SSH_AUTH_SOCK
    elif [$ ret = 1]; тогда
      echo "Сокет $ SSH_AUTH_SOCK указывает на агента без ключей ..."
      SSH-добавить
    еще
      echo "Найден ssh-агент $ SSH_AUTH_SOCK (ret = $ ret)"
      вернуть
    фи
  фи
  для sf в $ (найти / tmp / -mindepth 2 -maxdepth 2 -uid $ {UID: - $ (id -u)} -path '/tmp/ssh-*/agent.*' -type s); делать
    test -r $ sf || Продолжить
    экспорт SSH_AUTH_SOCK = $ sf
    SSH_AGENT_PID = $ (базовое имя $ SSH_AUTH_SOCK | вырезать -d. -F2)
    # гонки с другими процессами, аааа
    попробовать = 50
    while [$ try -gt 0]; делать
      попробовать = $ (($ примерки 1))
      export 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
        Продолжить
      фи
      if echo "$ ssh_agent_running" | \
           awk '$ 1 ==' $ SSH_AGENT_PID '{
                  FOUND = 1;
                  Выход (0);
              }
              КОНЕЦ {
                  если (! найдено) {
                      print "не нашел запущенный PID '$ SSH_AGENT_PID'";
                      выход (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-добавить
          если ! ssh-add -l> / dev / null; тогда
            echo "Сокет $ SSH_AUTH_SOCK по-прежнему содержит ссылку на менее полезный агент в $ SSH_AGENT_PID - прерывание."
            вернуть
          еще
            сломать
          фи
        еще
          сломать
        фи
      еще
# echo "Не удалось сопоставить сокет $ SSH_AUTH_SOCK с идентификатором агента $ SSH_AGENT_PID - пропуск ..."
        Продолжить
      фи
    сделанный
    if [$ try -gt 0]; тогда
      echo "Найден ssh-агент $ SSH_AUTH_SOCK"
      echo "Agent pid $ SSH_AGENT_PID"
      вернуть
    фи
  сделанный
  if [-n "$ try" -a -n "$ SSH_AUTH_SOCK" -a -n "$ ssh_agent_running"]; тогда
    echo "Мы пробовали много раз, но не смогли сопоставить $ SSH_AUTH_SOCK ни с одним из работающих агентов, вздох"
    echo "$ ssh_agent_running"
    echo "Оставить эти остатки и запустить нового агента ..."
  фи
  eval $ (ssh-agent -t 28800)
  SSH-добавить
}
Иосип Роден
источник
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
AX Labs
источник
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

источник

wisbucky
источник