Вопрос или проблема
Я пытаюсь сделать так, чтобы следующие команды автоматически выполнялись при входе на мой сервер через 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
Если вы хотите разблокировать ключ:
- не более одного раза за вход
- по запросу (т.е. когда вы действительно собираетесь использовать ключ)
Вы можете сделать следующее (тестировалось на 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
.
Шаги по настройке
-
Открытие конфигурационного файла:
Откройте файл.bashrc
или.zshrc
в вашем домашнем каталоге. Вы можете использовать текстовый редактор, напримерnano
илиvim
:nano ~/.bashrc
-
Добавление конфигурации:
Вставьте следующий код в конце файла:# Запустить 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
. -
Сохранение изменений:
Сохраните изменения и выйдите из редактора. Если вы использовалиnano
, нажмитеCTRL + X
, затемY
иEnter
. -
Применение изменений:
Чтобы изменения вступили в силу, перезапустите терминал или выполните:source ~/.bashrc
Заметки по безопасности
- Убедитесь, что ваша SSH-ключа защищена надёжной паролем.
- Используйте перенаправление SSH-агента, если вы подключаетесь к другим серверам. Это делается с помощью опции
-A
:ssh -A user@remote-host
Сообщите о потенциальных рисках безопасности, связанных с использованием этой функции, и ограничьте её использование только доверенными хостами.
Альтернативные методы
-
Использование
keychain
:
Установкаkeychain
позволяет управлять ключами более эффективно. Установите его:sudo apt install keychain
Затем добавьте в файл конфигурации:
eval $(keychain --eval --quiet)
keychain
автоматически запускаетssh-agent
и управляет загрузкой ключей по мере необходимости. -
Использование
systemd
дляssh-agent
:
Также вы можете настроитьssh-agent
какsystemd
сервис для более удобного управления. Это немного сложнее, но может быть целесообразно в многопользовательской среде.
Заключение
Данный подход позволяет вам автоматически запускать ssh-agent
и загружать ключи при каждом входе на сервер, экономя ваше время и усилия. Убедитесь, что вы протестировали вашу конфигурацию после внесения изменений.