Спільний доступ до того ж `ssh-агента 'серед кількох сеансів входу


61

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

Отже, мета тут така

  • щоразу, коли я входжу в поле, незалежно від того, чи це через SSH, або в графічному сеансі, розпочатому з gdm / kdm / тощо, або на консолі:
    • якщо моє ім'я користувача зараз не ssh-agentпрацює, воно запускається, експортуються змінні середовища та ssh-addвикликаються.
    • в іншому випадку, існуючі координати агента експортуються в змінні середовища сеансу входу.

Цей засіб особливо цінний, коли розглянутий блок використовується як точка ретрансляції під час sshпереходу у третю коробку. У цьому випадку уникнути необхідності вводити парольну фразу приватного ключа кожен раз, коли ви впадаєте в систему, а потім хочете, наприклад, зробити git pushщось чи щось.

Сценарій, наведений нижче, робить це здебільшого надійно, хоча останнім часом він вийшов з ладу, і тоді я розпочав ще один графічний сеанс. Можливо, в цьому випадку виникала інша дурість.

Ось мій сценарій погано-добре Я джерело цього від мого .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

@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.


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 вперед вашого ssh-агента. Ось нагода:

У мене є віддалений сервер, який має деякі git repos на ньому з віддаленим вказівкою на github. Без ssh-агента, що працює на екрані, я повинен ввести парольну фразу для свого ключа, щоб зробити "майстра походження git pull origin". Буо! Крім того, у мене повинен бути встановлений мій приватний ключ на віддаленому сервері - більше Boooo!

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


4
Я не знав про це, але виявилося саме те, що я шукав, коли пробирався до цього питання.
Буде Маккутхен

1
Це навіть краще, ніж те, що я шукав! Чудова відповідь!
WhyNotHugo

1
Дивіться також man 5 ssh_configдля ForwardAgentнастройки конфігурації. Це дозволяє переадресацію агента за замовчуванням, усуваючи необхідність -Aаргументу. Перш ніж використовувати переадресацію агента, майте на увазі, що існує ризик безпеки, коли інші привілейовані користувачі на віддаленій машині можуть отримати доступ до розсиланого агента переадресації. Про це також йдеться на сторінці man. Це тут добре пояснено .
starfry

Я думаю, що для параметра 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


Також чудово працює з Git Bash (mingw64) для windows
Дельфін

1
${SSH_ENV}потрібно, "${SSH_ENV}"якщо у вашому імені користувача Windows є пробіл
rgvcorley

Ця відповідь, здається, підстрибує через Інтернет. Ось він знаходиться на значно більшій потоці stackoverflow . Кращий / найпростіший підхід ІМХО.
Люк Девіс


6

Я нещодавно почав використовувати:

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

Все, що мені потрібно зробити, це додати:

  alias ssh=/path/to/ssh-ident

У моєму файлі .bashrc. Сценарій дбає про:

  • створення агента, коли він вперше потрібен
  • завантажте необхідні клавіші на вимогу
  • ділитися агентами протягом декількох сеансів входу
  • керуйте кількома агентами, по одному для кожної «ідентичності», якою я користуюся в Інтернеті, і використовуйте потрібний агент на основі хоста, до якого я підключаюся, або поточного робочого каталогу.

ssh-ident - це фантастично! Він розблоковує ключ і завантажує агент, коли я намагаюся ssh, замість того, щоб розблокувати ключ заздалегідь. Це робить ключові тайм-аути корисними. Що ще важливіше, він тримає моїх агентів окремими для різних цілей (великий ризик безпеки; root на одній машині має мій рівень доступу до всіх інших машин, для яких у цього агента є ключі!)
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

У моєму випадку я маю налаштування posh-git в 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-агент

до

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

так що знайдені лише агенти, що працюють під поточним користувачем, а під не відлунюється до екрана (чистішого).

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

Взагалі я думаю, що це відчувається як просте рішення.


0

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

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

Це, мабуть, досі схильне до помилок і перекрут, але деякі побіжні тестування вказують, що він працює в основному для моїх випадків використання, тому тут йдеться:

attach_ssh_agent () {
  якщо [-n "$ SSH_AGENT_PID"]; тоді
    ssh-add -l> / dev / null
    ret = $?
    якщо [$ ret -ge 2]; тоді
      echo "Агент pid $ SSH_AGENT_PID менш корисний (ret = $ ret) - вбивство ..."
      вбити $ SSH_AGENT_PID
      зняти $ SSH_AGENT_PID
    elif [$ ret = 1]; тоді
      echo "Агент pid $ SSH_AGENT_PID менш корисний (ret = $ ret) - буде висівати його ..."
    ще
      ехо "Агент pid $ SSH_AGENT_PID"
      повернення
    фі
  фі
  якщо [-S "$ SSH_AUTH_SOCK"]; тоді
    ssh-add -l> / dev / null
    ret = $?
    якщо [$ ret = 2]; тоді
      echo "Socket $ SSH_AUTH_SOCK мертвий - видалення ..."
      rm -f $ SSH_AUTH_SOCK
      зняти SSH_AUTH_SOCK
    elif [$ ret = 1]; тоді
      echo "Socket $ SSH_AUTH_SOCK вказує на агента без клавіш ..."
      ssh-add
    ще
      echo "Знайдено ssh-агент $ SSH_AUTH_SOCK (ret = $ ret)"
      повернення
    фі
  фі
  для sf в $ (find / tmp / -mindepth 2 -maxdepth 2 -uid $ {UID: - $ (id -u)} -path '/tmp/ssh-*/agent.*' -тип s); робити
    тест -r $ sf || продовжувати
    експортувати SSH_AUTH_SOCK = $ sf
    SSH_AGENT_PID = $ (базове ім'я $ SSH_AUTH_SOCK | вирізати -d. -F2)
    # гонки з іншими вилами для процесу, арг
    спробуйте = 50
    в той час як [$ 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 "Socket $ SSH_AUTH_SOCK не містить посилання на будь-який запущений агент - видалення ..."
        rm -f $ SSH_AUTH_SOCK
        продовжувати
      фі
      якщо відлуння "$ ssh_agent_running" | \
           awk '$ 1 ==' $ SSH_AGENT_PID '{
                  знайдено = 1;
                  вихід (0);
              }
              КІНЦІ {
                  якщо (! знайдено) {
                      print "не знайшов запущений PID '$ SSH_AGENT_PID'";
                      вихід (1);
                  }
              } '; тоді
        ssh-add -l> / dev / null
        ret = $?
        якщо [$ ret -ge 2]; тоді
          echo "Socket $ SSH_AUTH_SOCK не містить посилання на корисний агент на $ SSH_AGENT_PID - видалення ..."
          rm -f $ SSH_AUTH_SOCK
          вбити $ SSH_AGENT_PID
          вимкнути SSH_AGENT_PID
          продовжити 2
        elif [$ ret = 1]; тоді
          echo "Socket $ SSH_AUTH_SOCK містить посилання на менш корисний агент на $ SSH_AGENT_PID - висівання ..."
          ssh-add
          якщо! ssh-add -l> / dev / null; тоді
            echo "Socket $ SSH_AUTH_SOCK все ще містить посилання на менш корисний агент на $ SSH_AGENT_PID - перериває."
            повернення
          ще
            перерва
          фі
        ще
          перерва
        фі
      ще
# echo "Не вдалося відповідати сокет $ SSH_AUTH_SOCK агенту PID $ SSH_AGENT_PID - пропуск ..."
        продовжувати
      фі
    зроблено
    якщо [$ try -gt 0]; тоді
      echo "Знайдено ssh-агент $ SSH_AUTH_SOCK"
      ехо "Агент pid $ SSH_AGENT_PID"
      повернення
    фі
  зроблено
  if [-n "$ try" -a -n "$ SSH_AUTH_SOCK" -a -n "$ ssh_agent_running"]; тоді
    ехо "Ми намагалися багато разів, але не змогли відповідати $ SSH_AUTH_SOCK жодному із запущених агентів, зітхніть"
    відлуння "$ ssh_agent_running"
    відлуння "Залишивши ці залишки позаду та запустивши нового агента ..."
  фі
  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-агент або запускає ssh-агент, якщо він не працює. Ключ полягає у використанні -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

джерело

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.