Базовое подключение
ssh user@host # по паролю или ключу из ~/.ssh
ssh -p 2222 user@host # нестандартный порт
ssh -i ~/.ssh/special_key user@host # конкретный приватный ключ
ssh -v user@host # verbose: видим какой ключ пробуется, какой алгоритм
Ключевая аутентификация (правильно)
Парольная - небезопасна (brute force). Ключи - стандарт:
ssh-keygen -t ed25519 -C "alice@laptop" # сгенерировать пару (ed25519 - современный)
▸создаст ~/.ssh/id_ed25519 (приватный) и ~/.ssh/id_ed25519.pub (публичный)
ssh-copy-id user@host # положить .pub в ~user/.ssh/authorized_keys на host
▸теперь ssh user@host работает без пароля
Файл ~/.ssh/authorized_keys на сервере содержит публичные ключи
которым разрешён вход. Права жёсткие - иначе sshd откажется:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
# см. [[file-permissions]]
~/.ssh/config - алиасы и опции
Host prod
HostName 10.20.30.40
User deploy
Port 2222
IdentityFile ~/.ssh/prod_key
Host bastion
HostName bastion.example.com
User alice
Host internal-*
ProxyJump bastion # ходить через бастион автоматически
User deploy
Теперь ssh prod или ssh internal-db1 работает без флагов.
Port forwarding
# Local forward: localhost:8080 → host:80 ЧЕРЕЗ ssh
ssh -L 8080:localhost:80 user@host
▸теперь curl http://localhost:8080 идёт на удалённый :80
# Remote forward: на сервере открыть порт, направить ко мне локально
ssh -R 9090:localhost:3000 user@host
▸на удалённой машине localhost:9090 = моя локальная :3000
# Dynamic (SOCKS proxy)
ssh -D 1080 user@host
▸SOCKS5 proxy на localhost:1080, весь трафик идёт через host
Полезно для доступа к внутренним сервисам без VPN.
SSH agent
Чтобы не вводить passphrase ключа каждый раз:
eval "$(ssh-agent)" # запустить агент
ssh-add ~/.ssh/id_ed25519 # добавить ключ - passphrase спросят раз
ssh user@host # теперь без пароля
ssh-add -l # что в агенте
Agent forwarding (ssh -A) - рискованная фича: пробрасывает агент
на удалённый хост. Не использовать на не-доверенных серверах
(root там может подписать что угодно от твоего имени).
scp / sftp / rsync
Копирование файлов через тот же канал:
scp file.txt user@host:/path/ # старая школа, простая
scp -r dir/ user@host:/path/ # рекурсивно
rsync -avzP file.txt user@host:/path/ # современный: incremental, прогресс, сжатие
sftp user@host # интерактивный FTP-like
Используй rsync для всего нетривиального - резюмирует прерванное.
Серверная сторона
Конфиг - /etc/ssh/sshd_config:
Port 22
PermitRootLogin no # не пускать root напрямую
PasswordAuthentication no # только ключи
PubkeyAuthentication yes
AllowUsers alice bob
После правки:
sudo sshd -t # синтаксис-проверка
sudo systemctl reload ssh # применить (HUP signal - не разорвёт текущие сессии)
Безопасность
- Только ключи, не пароли
- Не root:
PermitRootLogin no - fail2ban или аналог - блокировать brute-force
- Нестандартный порт - снижает шум, но НЕ заменяет защиту
- Известные хосты:
~/.ssh/known_hosts- проверка fingerprint'а сервера; warning «host key changed» - повод остановиться и проверить