Запуск ssh-агента при входе в систему

у меня есть сайт как удаленный РЕПО git, тянущий из Bitbucket.com использование псевдонима SSH. Я могу вручную запустить ssh-агент на своем сервере, но я должен делать это каждый раз, когда я вхожу в систему через SSH.

Я вручную запускаю ssh-агент:

eval ssh-agent $SHELL

затем я добавляю агент:

ssh-add ~/.ssh/bitbucket_id

затем он появляется, когда я делаю:

ssh-add -l

и я готов идти. Есть ли способ автоматизировать этот процесс, чтобы мне не приходилось делать это каждый раз при входе в систему? Сервер работает в RedHat 6.2 (Сантьяго).

10 ответов


пожалуйста, пройдите через эту статью. Вы можете найти это очень полезно:

http://mah.everybody.org/docs/ssh

на всякий случай, если вышеуказанная ссылка исчезнет когда-нибудь, я захватываю основную часть решения ниже:

данное решение от Reagle Джозеф М. путем Дэниел уставился:

добавьте это в свой .bash_profile

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 -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
        start_agent;
    }
else
    start_agent;
fi

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


в Arch Linux следующие работы действительно великолепны (должны работать на всех дистрибутивах на основе systemd):

создайте службу пользователя systemd, поместив следующее в ~/.config/systemd/user/ssh-agent.service:

[Unit]
Description=SSH key agent

[Service]
Type=forking
Environment=SSH_AUTH_SOCK=%t/ssh-agent.socket
ExecStart=/usr/bin/ssh-agent -a $SSH_AUTH_SOCK

[Install]
WantedBy=default.target

Setup shell, чтобы иметь переменную среды для сокета (.bash_profile, .zshrc, ...):

export SSH_AUTH_SOCK="$XDG_RUNTIME_DIR/ssh-agent.socket"

включите службу, поэтому она будет запущена автоматически при входе в систему и запустите ее:

systemctl --user enable ssh-agent
systemctl --user start ssh-agent

добавьте следующий параметр конфигурации в файл конфигурации ssh ~/.ssh/config (эта работает с SSH 7.2):

AddKeysToAgent  yes

это проинструктирует клиента ssh всегда добавлять ключ к работающему агенту, поэтому нет необходимости ssh-добавлять его заранее.


принятое решение имеет следующие недостатки:

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

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

exec ssh-agent $BASH -s 10<&0 << EOF
    ssh-add ~/.ssh/your_key1.rsa \
            ~/.ssh/your_key2.rsa &> /dev/null
    exec $BASH <&10-
EOF

Он имеет следующие преимущества:

  • гораздо более простое решение;
  • сеанс агента заканчивается, когда сеанс bash заканчивается.

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

  • интерактивные ssh-add команда будет влиять только на один сеанс, что на самом деле является проблемой только в очень нетипичных обстоятельствах;
  • непригодно, если требуется ввести пароль;
  • начатая оболочка становится не-логином (который не влияет ни на что AFAIK).

обратите внимание, что несколько ssh-agent процессы не являются недостатком, потому что они не занимают больше памяти или времени процессора.


старый вопрос, но я столкнулся с подобной ситуацией. Не думайте, что приведенный выше ответ полностью достигает того, что необходимо. Недостающая часть -keychain; установите его, если он еще не установлен.

sudo apt-get install keychain

затем добавьте следующую строку в ваш ~/.bashrc

eval $(keychain --eval id_rsa)

запуск ssh-agent если он не работает, подключитесь к нему, если это так, загрузите ssh-agent переменные среды в вашу оболочку и загрузите ключ ssh.

изменить id_rsa в зависимости от того, что частная ключ ~/.ssh вы хотите загрузить.

ссылка

https://unix.stackexchange.com/questions/90853/how-can-i-run-ssh-add-automatically-without-password-prompt


добавьте это в ваш ~/.bashrc:

if [ ! -S ~/.ssh/ssh_auth_sock ]; then
  eval `ssh-agent`
  ln -sf "$SSH_AUTH_SOCK" ~/.ssh/ssh_auth_sock
fi
export SSH_AUTH_SOCK=~/.ssh/ssh_auth_sock
ssh-add -l | grep "The agent has no identities" && ssh-add

Это должно запрашивать пароль только при первом входе в систему после каждой перезагрузки. Он будет продолжать повторно использовать ssh-agent пока он работает.


поэтому я использовал описанные выше подходы, но я предпочитаю, чтобы агент умер, когда закончится мой последний сеанс bash. Это немного дольше, чем другие решения, но это мой предпочтительный подход. Основная идея заключается в том, что первый сеанс bash запускает ssh-агент. Затем каждый дополнительный сеанс bash проверяет файл конфигурации (~/.ssh/.agent_env). Если это есть, и есть сеанс работает, то источник среды и создать жесткую ссылку на файл сокета в /tmp (должен быть на та же файловая система, что и исходный файл сокета). По мере завершения сеансов bash каждый удаляет свою собственную жесткую ссылку. Последний сеанс для закрытия обнаружит, что жесткие ссылки имеют 2 ссылки (hardlink и оригинал), удаление собственного сокета процессов и убийство процесса приведет к 0, оставив чистую среду после закрытия последнего сеанса bash.

# Start ssh-agent to keep you logged in with keys, use `ssh-add` to log in
agent=`pgrep ssh-agent -u $USER` # get only your agents           
if [[ "$agent" == "" || ! -e ~/.ssh/.agent_env ]]; then
    # if no agents or environment file is missing create a new one
    # remove old agents / environment variable files
    kill $agent running
    rm ~/.ssh/.agent_env 

    # restart
    eval `ssh-agent` 
    echo 'export SSH_AUTH_SOCK'=$SSH_AUTH_SOCK >> ~/.ssh/.agent_env             
    echo 'export SSH_AGENT_PID'=$SSH_AGENT_PID >> ~/.ssh/.agent_env             
fi

# create our own hardlink to the socket (with random name)           
source ~/.ssh/.agent_env                                                    
MYSOCK=/tmp/ssh_agent.${RANDOM}.sock                                        
ln -T $SSH_AUTH_SOCK $MYSOCK                                                
export SSH_AUTH_SOCK=$MYSOCK                                                

end_agent()                                                                     
{
    # if we are the last holder of a hardlink, then kill the agent
    nhard=`ls -l $SSH_AUTH_SOCK | awk '{print }'`                             
    if [[ "$nhard" -eq 2 ]]; then                                               
        rm ~/.ssh/.agent_env                                                    
        ssh-agent -k                                                            
    fi                                                                          
    rm $SSH_AUTH_SOCK                                                           
}                                                                               
trap end_agent EXIT                                                             
set +x              

извините за опоздание:

пользователи рыбы оболочки можно использовать скрипт сделать то же самое.

# content has to be in .config/fish/config.fish
# if it does not exist, create the file
setenv SSH_ENV $HOME/.ssh/environment

function start_agent                                                                                                                                                                    
    echo "Initializing new SSH agent ..."
    ssh-agent -c | sed 's/^echo/#echo/' > $SSH_ENV
    echo "succeeded"
    chmod 600 $SSH_ENV 
    . $SSH_ENV > /dev/null
    ssh-add
end

function test_identities                                                                                                                                                                
    ssh-add -l | grep "The agent has no identities" > /dev/null
    if [ $status -eq 0 ]
        ssh-add
        if [ $status -eq 2 ]
            start_agent
        end
    end
end

if [ -n "$SSH_AGENT_PID" ] 
    ps -ef | grep $SSH_AGENT_PID | grep ssh-agent > /dev/null
    if [ $status -eq 0 ]
        test_identities
    end  
else
    if [ -f $SSH_ENV ]
        . $SSH_ENV > /dev/null
    end  
    ps -ef | grep $SSH_AGENT_PID | grep -v grep | grep ssh-agent > /dev/null
    if [ $status -eq 0 ]
        test_identities
    else 
        start_agent
    end  
end

чтобы добавить еще одно решение: P, я пошел с комбинацией решений @spheenik и @collin-anderson.

 # Ensure that we have an ssh config with AddKeysToAgent set to true
 if [ ! -f ~/.ssh/config ] || ! cat ~/.ssh/config | grep AddKeysToAgent | grep yes > /dev/null; then
     echo "AddKeysToAgent  yes" >> ~/.ssh/config
 fi
 # Ensure a ssh-agent is running so you only have to enter keys once
 if [ ! -S ~/.ssh/ssh_auth_sock ]; then
   eval `ssh-agent`
   ln -sf "$SSH_AUTH_SOCK" ~/.ssh/ssh_auth_sock
 fi
 export SSH_AUTH_SOCK=~/.ssh/ssh_auth_sock

может быть немного более элегантным, но простым и читаемым. Это решение:

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

комментарии приветствуются :)


Я решил это, добавив это в/etc / profile - system wide (или к локальному пользователю .профиль или. файл).

# SSH-AGENT 
#!/usr/bin/env bash
SERVICE='ssh-agent'
WHOAMI=`who am i |awk '{print }'`

if pgrep -u $WHOAMI $SERVICE >/dev/null
then
echo $SERVICE running.
else
echo $SERVICE not running.
echo starting
ssh-agent > ~/.ssh/agent_env
fi
. ~/.ssh/agent_env

это запускает новый ssh-агент, если он не работает для пользователя, или повторно устанавливает параметр ssh-agent env при запуске.


Как ваши ответы большое. Он сделал работу из cygwin / linux хозяева намного проще. Я объединил функции start и end, чтобы сделать его безопасным.

SSH_ENV="$HOME/.ssh/.agent_env"

function start_agent {
    echo "Initialising new SSH agent..."

    eval `/usr/bin/ssh-agent`
    echo 'export SSH_AUTH_SOCK'=$SSH_AUTH_SOCK >> ${SSH_ENV}
    echo 'export SSH_AGENT_PID'=$SSH_AGENT_PID >> ${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 -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
        start_agent;
    }
else
    start_agent;
fi

# create our own hardlink to the socket (with random name)
MYSOCK=/tmp/ssh_agent.${RANDOM}.sock
ln -T $SSH_AUTH_SOCK $MYSOCK
export SSH_AUTH_SOCK=$MYSOCK

end_agent()
{
    # if we are the last holder of a hardlink, then kill the agent
    nhard=`ls -l $SSH_AUTH_SOCK | awk '{print }'`
    if [[ "$nhard" -eq 2 ]]; then
        rm ${SSH_ENV}
        /usr/bin/ssh-agent -k
    fi
    rm $SSH_AUTH_SOCK
}
trap end_agent EXIT
set +x

еще раз спасибо