Вопрос или проблема
У меня есть скрипт, который собирает информацию с нескольких SSH-хостов одновременно, поэтому необходимо разблокировать и загрузить ssh-пароль в ssh-agent до того, как будут созданы соединения параллельно. Все хосты имеют установленный открытый ключ.
Сбор удаленной информации параллельно осуществляется следующим образом, при наличии списка хостов в $hostlist
:
remote_infos=$(while read -r host; do
ssh -nTq "$host" "$some_command" &
done <<< "$hostlist";
wait)
Однако, если ssh-пароль не был разблокирован, он будет запрашиваться для всех хостов, а не только для первого, и вывод запросов паролей будет неаккуратным.
Есть ли быстрый способ разблокировать этот пароль из скрипта, только если он еще не разблокирован?
Я могу просто выполнить ssh -nTq "$host" true
на первом хосте заранее, но это кажется слишком многим (и медленным), чтобы устанавливать полное SSH-соединение только для этого.
В качестве альтернативы я могу выполнить ssh-add
, но это потребует ввода пароля даже если он уже был добавлен. Я мог бы, может быть, разобрать ssh-add -l
, чтобы избежать этого, но есть ли лучший способ?
Вопрос по желанию: существует ли решение для аутентификации по паролю? Я видел упоминания о sshpass
, но это кажется не очень безопасным.
Ответ или решение
Для решения вашей задачи по разблокировке SSH-пароля и загрузке его в ssh-agent, если он ещё не добавлен, существует несколько подходов. Давайте рассмотрим правильный и эффективный метод.
Разблокировка SSH-пароля
-
Проверка статуса ключа в ssh-agent: Для начала, вы можете использовать
ssh-add -l
, чтобы проверить, добавлен ли ваш ключ уже в агент. Если вывод этой команды пуст, это значит, что ключ не загружен, и понадобится ввод пароля. -
Добавление ключа в ssh-agent: Если ключ не добавлен, вы можете использовать
ssh-add
для его загрузки. Чтобы избежать запроса пароля при каждом запуске, можно предварительно проверить наличие ключа, как показано ниже:
# Проверка, есть ли ключи в ssh-agent
if ssh-add -l &>/dev/null; then
echo "Ключ уже добавлен в ssh-agent."
else
echo "Добавляем ключ в ssh-agent. Пожалуйста, введите пароль."
ssh-add /path/to/your/private_key # Укажите путь к вашему закрытому ключу
fi
Запуск удалённых команд
После того, как вы разблокируете ключ и добавите его в ssh-agent (если это необходимо), вы можете точно так же запускать ваши команды на удалённых хостах в параллельном режиме, как вы описали:
remote_infos=$(while read -r host; do
ssh -nTq "$host" "$some_command" &
done <<< "$hostlist"; wait)
Таким образом, вы избежите многократного запроса пароля при параллельном подключении к нескольким хостам.
Альтернативное решение для аутентификации по паролю
Хотя вы правильно отметили, что использование sshpass
может быть небезопасным, это всё же один из вариантов для автоматизации ввода пароля. Однако, если вы хотите избежать его использования, лучше всего настроить SSH-ключи, поскольку это более безопасный и удобный способ аутентификации.
Если вы по каким-то причинам не можете использовать SSH-ключи, рассмотрите возможность использования более безопасного метода, такого как:
- Управление паролями: Используйте менеджеры паролей, такие как
pass
, которые могут интегрироваться с вашим скриптом. Это позволит вам хранить пароли более безопасно и получать их по запросу.
Заключение
Итак, лучший способ разблокировки SSH-пароля включает в себя проверку, добавлен ли ключ в ssh-agent, и его добавление только в случае необходимости. Это позволит избежать множества запросов пароля и упростит выполнение ваших задач на удалённых серверах. Использование SSH-ключей является наилучшей практикой для безопасной аутентификации.
Если у вас есть дополнительные вопросы или нужны примеры, дайте знать!