Простой способ запустить ssh-agent и ssh-add при входе по SSH.

Вопрос или проблема

Я пытаюсь сделать так, чтобы следующие команды автоматически выполнялись при входе на мой сервер через ssh:

ssh-agent /bin/bash
ssh-add ~/.ssh/id_rsa

Мой ssh-ключ защищен фразой-паролем, и меня устраивает вводить её один раз за вход.

Я попробовал добавить это в файл .bashrc, однако, я думаю, что ssh-agent запускает новую сессию bash. Когда я пытаюсь войти, имея это в .bashrc, процесс зависает, и мне нужно ввести ‘exit’, чтобы увидеть запрос ‘введите пароль для разблокировки ключа’

Есть ли другие предложения?

Сервер работает на Ubuntu LTS

Вы можете попробовать добавить следующее:

eval $(ssh-agent -s)
ssh-add ~/.ssh/id_rsa

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

Как указано в комментарии, возможно, вам не нужно запускать агент вообще на удаленном хосте, а лучше запустить его на машине, с которой вы работаете, и использовать

ssh -A remote-host

для перенаправления служб вашего локального ssh-агента на remote-host.

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

Другой альтернативой является добавление этого в ваш .bashrc. Это имеет то же преимущество, что и ответ Эрика (обеспечивает единственный экземпляр), но не требует дополнительного пакета.

# SSH Agent должен работать один раз
runcount=$(ps -ef | grep "ssh-agent" | grep -v "grep" | wc -l)
if [ $runcount -eq 0 ]; then
    echo Запуск SSH Agent
    eval $(ssh-agent -s)
fi

Это запускает ssh-add, если не загружен ни один ключ, и устанавливает таймаут ключа на 1 день:

ssh-add -l &>/dev/null
if ! [ "$?" == 0 ]; then
     echo Добавление ключей...
     ssh-add -t 1d
fi

Одной из альтернатив является использование Keychain от Funtoo. Затем вы можете вставить эту однострочную команду в вашу bash-оболочку:

eval $(keychain --eval id_rsa)

Это делает то же самое (запускает ssh-агент и т. д.), но при этом не запускает процесс ssh-agent для каждой подсоветы. Вместо этого он ищет “уже запущенные” экземпляры, которые вам принадлежат, и подключает вас к ним.

Тот же ответ, что и у @womblerone, но немного короче:

Запустите ssh-агент (если он еще не запущен):

# SSH Agent должен работать один раз
if ! ps -ef | grep "[s]sh-agent" &>/dev/null; then
    echo Запуск SSH Agent
    eval $(ssh-agent -s)
fi

Добавьте ssh-ключ, если еще нет добавленных ключей

if ! ssh-add -l &>/dev/null; then
     echo Добавление ключей...
     ssh-add -t 1d
fi

Если вы использовали как zsh (Oh-my-zsh), так и bash, я написал этот маленький скрипт, который совместим с этим.

SHORT_HOST="${HOSTNAME/.*/}"
ssh_env_cache="$HOME/.ssh/environment-$SHORT_HOST"

# Скрипт для запуска ssh-agent, совместимый с Oh-my-zsh
function _start_agent() {
    if [[ -f "$ssh_env_cache" ]]; then
        . "$ssh_env_cache" > /dev/null
    fi

    if [[ -S "$SSH_AUTH_SOCK" ]]; then
      return 0
    fi

    echo "Запуск ssh-agent ..."
    ssh-agent -s | sed '/^echo/d' > "$ssh_env_cache"
    chmod 600 "$ssh_env_cache"
    . "$ssh_env_cache" > /dev/null
}
_start_agent

unset ssh_env_cache
unset -f _start_agent

ssh-add ~/.ssh/id_rsa

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

Также имейте в виду, что если у вас включено поддержание соединения ssh, вам нужно удалить существующие файлы соединений перед тем, как -A вступит в силу. Удалите любые файлы соединений ssh в /tmp/[host].

Чистый способ запустить ssh-agent — это systemd: https://gist.github.com/magnetikonline/b6255da90606fe9c5c25d3333c98c90d

добавьте следующее в ваш ~/.bashrc или ~/.zshrc

export SSH_AUTH_SOCK="$XDG_RUNTIME_DIR/ssh-agent.socket"
if ! ssh-add -l &>/dev/null; then
     echo Добавление ключей...
     ssh-add -t 1d ~/.ssh/id_rsa
fi

выйдите и войдите обратно

создайте файл /etc/systemd/user/ssh-agent.service с содержимым:

[Unit]
Description=SSH authentication agent

[Service]
ExecStart=/usr/bin/ssh-agent -a %t/ssh-agent.socket -D
Type=simple

[Install]
WantedBy=default.target

и выполните эту команду с вашей учетной записью:

systemctl --user enable --now ssh-agent

проверьте, сработало ли:

ssh-add -Lexport SSH_AUTH_SOCK="$XDG_RUNTIME_DIR/ssh-agent.socket"

if ! ssh-add -l &>/dev/null; then
echo Добавление ключей…
ssh-add -t 1d /.personal
fi

Если вы хотите разблокировать ключ:

  1. не более одного раза за вход
  2. по запросу (т.е. когда вы действительно собираетесь использовать ключ)

Вы можете сделать следующее (тестировалось на Ubuntu):

apt install keychain

в вашем .bashrc/.zshrc добавьте:

eval $(keychain --eval --quiet)

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

Затем, в вашем .ssh/config добавьте AddKeysToAgent yes. Это загружает ключ в ssh-agent в первый раз, когда мы его используем. Ваш конфигурационный файл должен выглядеть примерно так:

Host *
    AddKeysToAgent yes
Host my-server
    HostName example.com
    IdentityFile ~/.ssh/id_rsa
    IdentitiesOnly yes

Ответ или решение

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

Шаги по настройке

  1. Открытие конфигурационного файла:
    Откройте файл .bashrc или .zshrc в вашем домашнем каталоге. Вы можете использовать текстовый редактор, например nano или vim:

    nano ~/.bashrc
  2. Добавление конфигурации:
    Вставьте следующий код в конце файла:

    # Запустить ssh-agent если он не запущен
    if ! pgrep -u "$USER" ssh-agent > /dev/null; then
       echo "Запуск ssh-agent..."
       eval "$(ssh-agent -s)"
    fi
    
    # Проверка на наличие загруженных ключей; если нет, добавить ключ
    if ! ssh-add -l > /dev/null; then
       echo "Добавление SSH-ключа..."
       ssh-add ~/.ssh/id_rsa
    fi

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

  3. Сохранение изменений:
    Сохраните изменения и выйдите из редактора. Если вы использовали nano, нажмите CTRL + X, затем Y и Enter.

  4. Применение изменений:
    Чтобы изменения вступили в силу, перезапустите терминал или выполните:

    source ~/.bashrc

Заметки по безопасности

  • Убедитесь, что ваша SSH-ключа защищена надёжной паролем.
  • Используйте перенаправление SSH-агента, если вы подключаетесь к другим серверам. Это делается с помощью опции -A:
    ssh -A user@remote-host

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

Альтернативные методы

  1. Использование keychain:
    Установка keychain позволяет управлять ключами более эффективно. Установите его:

    sudo apt install keychain

    Затем добавьте в файл конфигурации:

    eval $(keychain --eval --quiet)

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

  2. Использование systemd для ssh-agent:
    Также вы можете настроить ssh-agent как systemd сервис для более удобного управления. Это немного сложнее, но может быть целесообразно в многопользовательской среде.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...