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

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

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

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

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

Любые другие предложения?

Сервер работает под управлением Ubuntu LTS

6 ответов

Решение

Вы можете попробовать добавить это:

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

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

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

ssh -A remote-host

направить службы вашего локального агента ssh на удаленный хост.

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

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

# SSH Agent should be running, once
runcount=$(ps -ef | grep "ssh-agent" | grep -v "grep" | wc -l)
if [ $runcount -eq 0 ]; then
    echo Starting SSH Agent
    eval $(ssh-agent -s)
    ssh-add ~/.ssh/id_rsa
fi

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

eval $(keychain --eval id_rsa)

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

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

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

      # SSH Agent should be running, once
if ! ps -ef | grep "[s]sh-agent" &>/dev/null; then
    echo Starting SSH Agent
    eval $(ssh-agent -s)
fi

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

      if ! ssh-add -l &>/dev/null; then
     echo Adding keys...
     ssh-add -t 1d
fi

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

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

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

# Oh-my-zsh compatible bash ssh-agent start script
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 "Starting 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сессия.

Другие вопросы по тегам