Запуск 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-агент и, если он не может его найти, запустит его и сохранит настройки, чтобы они были полезны при следующем запуске оболочки.
в 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
настройка оболочки, чтобы иметь переменную окружения для сокета (
.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-клиенту всегда добавлять ключ к работающему агенту,поэтому нет необходимости добавлять его заранее.
принятое решение имеет следующие недостатки:
- сложно поддерживать;
- он оценивает файл хранилища, который может привести к ошибкам или нарушению безопасности;
- он запускает агент, но не останавливает его, что близко эквивалентно оставлению ключа в зажигании.
если ваши ключи не требуют ввода пароля, я предлагаю следующее решение. Добавьте следующее к вашему
.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.
у него есть возможные недостатки:
- interactive
ssh-add
команда будет влиять только на один сеанс, что на самом деле является проблемой только в очень нетипичных обстоятельствах;- не используется, если требуется ввести пароль;
- начали оболочка становится не логин (который не влияет ни на что АФАИК).
обратите внимание, что несколько
ssh-agent
процессы не является недостатком, потому что они не занимают больше памяти или процессорного времени.
старый вопрос, но я действительно столкнулся с подобной ситуацией. Не думайте, что приведенный выше ответ полностью достигает того, что необходимо. Недостающая часть -
keychain
; установите его, если это еще не так.sudo apt-get install keychain
затем добавьте следующую строку в ваш
~/.bashrc
eval $(keychain --eval id_rsa)
запуск
ssh-agent
если он не работает, подключитесь к нему, если это так, загрузитеssh-agent
переменные среды в вашу оболочку и загрузите ключ ssh.изменить
id_rsa
в зависимости от того, что частная ключ в~/.ssh
вы хотите загрузить.ссылка
добавьте это в ваш
~/.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 ссылки (жесткая ссылка и оригинал), удаление собственного сокета процессов и убийство процесса приведет к 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-агент, если он еще не запустил один
комментарии приветствуются :)
Я решил это, добавив это в/etc / profile - system wide (или в user local .профиль или. файл).
# 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-агент, если он не работает для пользователя, или повторно устанавливает параметр env ssh-agent, если он запущен.
Как ваши ответы большое. Он сделал работу от
cygwin / linux
хозяева намного проще. Я объединил начальные и конечные функции, чтобы сделать его безопасным.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
еще раз спасибо