Прямой способ запустить 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
сессия.