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

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

Таким образом, цель здесь - это

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

Это средство особенно ценно, когда рассматриваемое поле используется в качестве ретрансляционного пункта когда sshлуг в третье поле. В этом случае это избегает необходимости тип в пароле закрытого ключа каждый раз Вы ssh в, и затем хотят, например, сделать git push или что-то.

Сценарий, данный ниже, делает это главным образом надежно, хотя он испортил недавно, когда X отказал, и я затем запустил другую графическую сессию. Возможно, была другая странность, продолжающаяся в том экземпляре.

Вот мой bad-is-good сценарий. Я получаю это от моего .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 ); я записал это только что и с тех пор изучил много вещей.

62
задан 14.05.2010, 10:33

5 ответов

Я мог бы также бросить свое собственное изменение в соединение:

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.

25
ответ дан 07.12.2019, 08:17

Я предпочитаю сохранять вещи максимально простыми: (отрывок от ~/.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
5
ответ дан 07.12.2019, 08:17

Попытайтесь использовать связку ключей, его сделанный для этого. http://www.gentoo.org/doc/en/keychain-guide.xml

10
ответ дан 07.12.2019, 08:17

Вот довольно хороший, который работает в 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

20
ответ дан 07.12.2019, 08:17

ssh -A [user@]remotehost

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

У меня есть удаленный сервер, который имеет некоторого мерзавца repos на нем с удаленным, указывающим на GitHub. Без ssh-агента, работающего на экранной сессии, я должен ввести пароль для своего ключа, чтобы сделать "ведущее устройство источника получения по запросу мерзавца". Booo! Кроме того, мне нужно было установить мой закрытый ключ на удаленном сервере - больше Boooo!

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

37
ответ дан 07.12.2019, 08:17

Теги

Похожие вопросы