Основные команды 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, а ~/.sshchmod 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, маршрутизация, аутентификация или политика сервера.