Основные команды SSH для системных администраторов
Изучите основные команды SSH для удаленного входа, ключей, конфигурационных файлов, передачи файлов, туннелирования, агентов и устранения неполадок.
Основные команды SSH для системных администраторов
Secure Shell (SSH) — это ежедневный инструмент удаленного доступа к серверам и сетевым устройствам. Если вы управляете системами Linux, вы используете команды SSH для входа, копирования файлов, выполнения разовых команд, открытия туннелей и отладки сбоев подключения.
Это руководство сосредоточено на командах и опциях, которые вам, скорее всего, понадобятся в реальной административной работе.
Установление базовых SSH-подключений
Самое основное использование SSH — установление безопасного интерактивного сеанса оболочки с удаленным сервером. Базовый синтаксис прост и позволяет указать пользователя и целевой хост.
Подключение к удаленному серверу
Чтобы подключиться к удаленному серверу, используя ваше текущее локальное имя пользователя:
ssh имя_хоста_или_IP_адрес
Если ваше имя пользователя на удаленном сервере отличается от локального, его необходимо указать:
ssh имя_пользователя@имя_хоста_или_IP_адрес
Пример:
ssh [email protected]
ssh [email protected]
Указание пользовательского порта
По умолчанию SSH использует порт 22. Однако по соображениям безопасности или из-за особенностей сетевой конфигурации серверы часто прослушивают другой порт. Вы можете указать пользовательский порт с помощью флага -p:
ssh -p 2222 имя_пользователя@имя_хоста_или_IP_адрес
Совет: Изменение порта SSH по умолчанию (порт 22) — распространенная практика безопасности для уменьшения количества автоматических атак, хотя это не заменяет строгую аутентификацию.
Аутентификация на основе ключей SSH
Хотя аутентификация по паролю распространена, аутентификация на основе ключей является рекомендуемым и более безопасным методом для SSH. Она использует пару криптографических ключей: закрытый ключ (хранится в секрете на вашей локальной машине) и открытый ключ (размещается на удаленном сервере).
Генерация пар ключей SSH
Используйте ssh-keygen для генерации новой пары ключей. Для большинства современных установок OpenSSH ключи Ed25519 являются хорошим выбором по умолчанию. Используйте RSA только в случае необходимости совместимости со старыми системами или политиками, требующими этого.
ssh-keygen -t ed25519 -a 100
Эта команда генерирует пару ключей Ed25519 и увеличивает количество раундов вывода ключа, используемых для защиты парольной фразы закрытого ключа. Закрытый ключ (id_ed25519) и открытый ключ (id_ed25519.pub) обычно хранятся в ~/.ssh/.
Копирование открытого ключа на удаленный сервер
Чтобы включить аутентификацию на основе ключей, ваш открытый ключ должен быть помещен в файл ~/.ssh/authorized_keys на удаленном сервере. Утилита ssh-copy-id автоматизирует этот процесс:
ssh-copy-id имя_пользователя@имя_хоста_или_IP_адрес
Эта команда запросит пароль удаленного пользователя один раз, затем скопирует ваш открытый ключ и установит правильные разрешения. После этого вы сможете подключаться без пароля (хотя вам будет предложено ввести парольную фразу вашего закрытого ключа, если вы ее установили).
Предупреждение: Никогда не передавайте свой закрытый ключ кому-либо. У него должны быть строгие разрешения файла, например chmod 600 ~/.ssh/id_ed25519.
Управление SSH-подключениями и конфигурациями
Выполнение одной команды удаленно
SSH предназначен не только для интерактивных оболочек. Вы можете выполнить одну команду на удаленном сервере напрямую и получить ее вывод в локальный терминал.
ssh имя_пользователя@имя_хоста_или_IP_адрес 'команда_для_выполнения'
Пример:
ssh [email protected] 'ls -l /var/log/'
ssh [email protected] 'sudo apt update && sudo apt upgrade -y'
Использование конфигурационного файла SSH (~/.ssh/config)
Для частых подключений определение хостов в ~/.ssh/config может сэкономить время и упростить команды. Этот файл позволяет задавать псевдонимы, указывать пользователей, порты, закрытые ключи и другие параметры подключения.
Пример записи в ~/.ssh/config:
Host webserver
Hostname 192.168.1.100
User admin
Port 2222
IdentityFile ~/.ssh/id_rsa_web
IdentitiesOnly yes
Host devbox
Hostname dev.mydomain.com
User developer
Port 22
IdentityFile ~/.ssh/id_rsa_dev
После настройки вы можете подключаться, просто используя псевдоним:
ssh webserver
ssh devbox
Лучшая практика: Используйте файл ~/.ssh/config для повторяющихся подключений. Это улучшает читаемость, уменьшает количество ошибок ввода и хранит параметры подключения в одном месте. Избегайте глобального включения пересылки агента; включайте его только для хостов, которым это действительно нужно.
Безопасная передача файлов с помощью SSH
SSH предоставляет два основных инструмента для безопасной передачи файлов: scp и sftp.
scp (Secure Copy Protocol)
scp используется для копирования файлов и каталогов между локальным и удаленным хостами. Он использует те же механизмы аутентификации и безопасности, что и SSH.
Копирование файла с локального на удаленный
scp /путь/к/локальному/файлу имя_пользователя@имя_хоста_или_IP_адрес:/путь/к/удаленному/каталогу/
Пример:
scp my_app.tar.gz admin@webserver:/var/www/html/
Копирование файла с удаленного на локальный
scp имя_пользователя@имя_хоста_или_IP_адрес:/путь/к/удаленному/файлу /путь/к/локальному/каталогу/
Пример:
scp admin@webserver:/var/log/nginx/access.log ~/logs/
Рекурсивное копирование каталога
Используйте флаг -r для каталогов:
scp -r /путь/к/локальному/каталогу имя_пользователя@имя_хоста_или_IP_адрес:/путь/к/удаленному/родительскому_каталогу/
Сохранение атрибутов файлов
Чтобы сохранить время модификации, время доступа и режимы, используйте флаг -p:
scp -p локальный_файл пользователь@удаленный_хост:/удаленный_путь/
sftp (SSH File Transfer Protocol)
sftp предоставляет интерактивную программу передачи файлов, похожую на FTP, но защищенную SSH. Она идеально подходит для управления несколькими файлами или выполнения сложных операций с каталогами.
Подключение к SFTP-серверу
sftp имя_пользователя@имя_хоста_или_IP_адрес
После подключения вы получите приглашение sftp>. Распространенные команды включают:
ls: Список содержимого удаленного каталогаlls: Список содержимого локального каталогаcd удаленный_каталог: Сменить удаленный каталогlcd локальный_каталог: Сменить локальный каталогget удаленный_файл: Скачать файлput локальный_файл: Загрузить файлmget удаленные_файлы: Скачать несколько файлов (поддерживаются маски)mput локальные_файлы: Загрузить несколько файлов (поддерживаются маски)exitилиbye: Выйти из сеанса SFTP
Пример сеанса SFTP:
sftp [email protected]
Connected to 192.168.1.100.
sftp> ls
config.ini data/ logs/ public_html/
sftp> cd public_html
sftp> get index.html
Fetching /public_html/index.html to index.html
sftp> put new_page.html
Uploading new_page.html to /public_html/new_page.html
sftp> bye
SSH-туннелирование и перенаправление портов
SSH-туннелирование, или перенаправление портов, позволяет создавать безопасные соединения между локальными и удаленными портами, обеспечивая доступ к сервисам, которые в противном случае могли бы быть заблокированы брандмауэрами или недоступны напрямую.
Локальное перенаправление портов (-L)
Локальное перенаправление позволяет получить доступ к сервису в удаленной сети (или на самом удаленном сервере) с вашей локальной машины так, как если бы он работал локально.
ssh -L [локальный_порт]:[удаленный_хост]:[удаленный_порт] имя_пользователя@ssh_сервер
Пример: Доступ к серверу базы данных (порт 3306) в частной сети через шлюз ssh_server с локального порта 9000.
ssh -L 9000:db.private.net:3306 [email protected]
Теперь вы можете подключиться к localhost:9000 на вашей локальной машине, и соединение будет безопасно перенаправлено на db.private.net:3306 через jumphost.com.
Удаленное перенаправление портов (-R)
Удаленное перенаправление делает сервис на вашей локальной машине (или в локальной сети) доступным с удаленного сервера и, возможно, для клиентов в сети удаленного сервера.
ssh -R [удаленный_порт]:[локальный_хост]:[локальный_порт] имя_пользователя@ssh_сервер
Пример: Сделать локальный веб-сервер (порт 8000) доступным с ssh_server на порту 8080.
ssh -R 8080:localhost:8000 admin@remote_server.com
Теперь любой пользователь на remote_server.com может получить доступ к вашему локальному веб-серверу, подключившись к localhost:8080 на remote_server.com.
Динамическое перенаправление портов (-D)
Динамическое перенаправление портов создает SOCKS-прокси, позволяя маршрутизировать весь ваш трафик (или трафик конкретного приложения) через SSH-туннель. Это полезно для обхода брандмауэров или обеспечения безопасности просмотра.
ssh -D [локальный_порт] имя_пользователя@ssh_сервер
Пример: Создание SOCKS-прокси на локальном порту 1080 через ssh_server.
ssh -D 1080 [email protected]
Настройте ваш браузер или приложение на использование localhost:1080 в качестве SOCKS5-прокси, и весь его сетевой трафик будет туннелирован через jumphost.com.
Продвинутое использование SSH и советы
Выполнение команд в фоновом режиме
Для неинтерактивных команд, которые должны выполняться и отсоединяться, вы можете использовать флаг -f (переходит в фоновый режим перед выполнением команды) и -N (не выполняет удаленную команду).
ssh -f -N -L 9000:db.private.net:3306 [email protected]
Это настраивает локальное перенаправление порта в фоновом режиме.
SSH-агент и ssh-add
ssh-agent — это программа, которая хранит ваши закрытые ключи в памяти, так что вам нужно вводить парольную фразу только один раз за сеанс. ssh-add добавляет ключи в агент.
# Запуск агента (если он еще не запущен)
eval "$(ssh-agent -s)"
# Добавление вашего ключа(ей) в агент
ssh-add ~/.ssh/id_ed25519
ssh-add ~/.ssh/id_ed25519_web # Для конкретного ключа
Пересылка агента может позволить вам аутентифицироваться с шлюза на другой сервер без копирования вашего закрытого ключа на шлюз. Используйте ее экономно: скомпрометированный шлюз может использовать ваш пересланный агент, пока ваш сеанс активен. Предпочитайте ProxyJump, когда вам нужно только пройти через бастион.
ssh -J [email protected] [email protected]
Постоянные SSH-подключения (ControlMaster)
Для более быстрых подключений и снижения накладных расходов ControlMaster в вашем ~/.ssh/config позволяет нескольким SSH-сеансам использовать одно сетевое соединение.
Host *
ControlMaster auto
ControlPath ~/.ssh/control/%C
ControlPersist 4h
Эта конфигурация создает управляющий сокет для первого подключения (ControlMaster auto), и последующие подключения к тому же хосту будут повторно использовать этот сокет в течение до 4 часов (ControlPersist 4h).
Устранение неполадок SSH
- Permission Denied (Отказано в доступе): Проверьте разрешения файлов для закрытых ключей (
chmod 600 ~/.ssh/id_ed25519), открытых ключей (chmod 644 ~/.ssh/id_ed25519.pub) и каталога.ssh(chmod 700 ~/.ssh). На сервере убедитесь, что~/.ssh/authorized_keysимеетchmod 600, а~/.ssh—chmod 700. - Connection Timed Out (Тайм-аут подключения): Сервер может быть выключен, брандмауэр блокирует порт 22 (или пользовательский порт), или указан неверный IP-адрес.
- Подробный вывод: Используйте флаги
-v,-vvили-vvvсsshдля получения подробной отладочной информации.ssh -vvv [email protected]
Вывод
Поддерживайте простой ежедневный рабочий процесс SSH: используйте аутентификацию на основе ключей, храните повторяющиеся параметры в ~/.ssh/config, копируйте файлы с помощью scp или sftp и добирайтесь до частных сервисов с помощью -L, -R, -D или -J при необходимости. Когда подключение не удается, ssh -vvv обычно является самым быстрым способом увидеть, в чем проблема: DNS, маршрутизация, аутентификация или политика сервера.