Как да създадете и добавите SSH ключове на много сървъри ?

Наскоро ми се наложи да конфигурирам достъп до 25+ Linux сървъра. Първоначално го правех ръчно – въвеждах паролата за всеки, копирах ключа и проверявах дали всичко е наред. След третия сървър реших, че това не е сериозно. Нужно беше нещо автоматизирано, сигурно и разбираемо. Ето как го направих – и защо този метод е най-подходящият за повечето ситуации.
Защо SSH ключовете са задължителни
🔑 1. Какво са SSH ключовете и защо да ги ползваме
SSH ключовете са двойка файлове (частен и публичен), които ви позволяват да влизате в сървъри без парола.
Това е по-бързо, по-сигурно и удобно при управление на много машини.
- Частният ключ остава на вашия компютър.
- Публичният ключ се копира на сървъра (в
~/.ssh/authorized_keys). - Когато се свързвате, SSH проверява дали ключовете съвпадат и ви пуска без парола.
Защо SSH ключовете са задължителни
- Без пароли.
- По-безопасно от sudo su.
- Автоматизация без риск.
- Работи с Ansible, скриптове, CI/CD.
Подготовка: Създайте си SSH ключ (ако нямате)
Отворете терминал и напишете:
ssh-keygen -t ed25519 -f ~/.ssh/rezerven_kluch -C "rezerven-dostap"
-t ed25519– модерен и сигурен алгоритъм.-f– име на файла.-C– коментар за по-лесна идентификация.
Следвайте инструкциите и задайте силна парола.
Съвет: Използвайте ed25519 – по-бърз и по-сигурен от RSA.
Ще получите два файла:
~/.ssh/rezerven_kluch # частният ключ
~/.ssh/rezerven_kluch.pub # публичният ключ
Решение #1: Моята препоръка
Създайте файл servers.txt в същата папка, например:
# Списък на сървърите
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
Празни редове? Коментари? Табове? Няма проблем. Скриптът ще ги игнорира.
🧠 4. Скрипт за автоматично копиране на ключа
Създайте файл deploy-keys.sh със следното съдържание:
#!/bin/bash
KEY="$HOME/.ssh/rezerven_kluch.pub"
FILE="servers.txt"
[ -f "$KEY" ] || { echo "Грешка: Ключът не е намерен: $KEY" >&2; exit 1; }
[ -f "$FILE" ] || { echo "Грешка: Липсва файл $FILE" >&2; exit 1; }
echo "Стартиране на копиране на ключ: $KEY"
echo "----------------------------------------"
success=0; fail=0
while IFS= read -r host; do
[[ -z "$host" ]] && continue
echo "=== Копиране към: $host ==="
if ssh-copy-id -o StrictHostKeyChecking=no -o ConnectTimeout=10 -i "$KEY" "$host"; then
((success++))
else
((fail++))
fi
echo
done < <(tr -d '\r' < "$FILE" | grep -vE '^\s*(#|$)')
echo "----------------------------------------"
echo "✅ Успешно: $success | ❌ Неуспешно: $fail"
echo "Готово!"
Запишете го и направете го изпълним:
chmod +x deploy-keys.sh
./deploy-keys.shТози скрипт:
- Проверява дали публичният ключ съществува.
- Пропуска празни редове и коментари.
- Автоматично потвърждава първоначалното свързване.
- Изчаква максимум 10 секунди при проблемна връзка.
- Събира отчет за успешни и неуспешни копирания.
Най-хубавото – може да се пуска многократно, без риск от дублиране.ssh-copy-id сам проверява дали ключът вече е добавен в authorized_keys.
🚀 5. Алтернативни начини
✅ Ръчно (само за няколко сървъра)
ssh-copy-id -i ~/.ssh/rezerven_kluch.pub [email protected]
Бърз вариант, ако имате 1–2 машини.
✅ С xargs за по-кратка команда
grep -vE '^\s*(#|$)' servers.txt | xargs -n1 -I{} ssh-copy-id -i ~/.ssh/rezerven_kluch.pub "{}"
Полезно, но не толкова гъвкаво при грешки и таймаути.
✅ С sshpass (ако нямате ключове още)
sshpass -p "PASSWORD" ssh-copy-id -i ~/.ssh/rezerven_kluch.pub [email protected]
Удобно, но несигурно – паролата е в открит вид.
✅ С Ansible (ако го ползвате)
- hosts: all
tasks:
- authorized_key:
user: root
key: "{{ lookup('file', '~/.ssh/rezerven_kluch.pub') }}"
Често задавани въпроси
Ами ако сървърът не позволява парола?
Първо влезте ръчно, добавете ключа, после изключете паролата в sshd_config.
Ами ако порта не е 22?
Добавете в servers.txt: [email protected]:2222
Ами ако искам да копирам на потребител, не root?
🧩 6. Какво да запомните
- SSH ключовете са стандартът за сигурен достъп.
- Не споделяйте частния ключ никога.
- Скриптът по-горе е прост, но достатъчно стабилен за реална употреба.
- Можете да го пускате безопасно многократно – без дублиране.
- При повече от 20-30 сървъра, обмислете инструмент като Ansible или SaltStack.
🧭 Финални думи
Тази автоматизация ми спести часове досадна работа и стотици въвеждания на пароли.
Ако и вие често управлявате няколко Linux машини – отделете 5 минути и си изгответе подобен скрипт.
Ще оцените спокойствието, бързината и простотата на нещо толкова елегантно.
💡 Съвет:
Създайте си един „основен“ SSH ключ за администраторски достъп и го използвайте за всички ваши машини.
Пазете го добре и използвайте силна парола – защото сигурността започва от вас.
Благодарим ви за прочитането на статията! Ако намерихте информацията за полезна, можете да дарите посредством бутоните по-долу:
Donate ☕️ Дарете с PayPalDonate 💳 Дарете с Revolut








