В прошлом посте мы завершили подготовку для безопасного SSH-доступа с помощью генерации ключей SSH (Key Generation).

Смотрите предыдущий пост: SSH keygen: идеальное руководство для начинающих

Теперь пришло время узнать, как на практике использовать SSH для подключения к удалённому серверу. Команды SSH проще, чем вы думаете, но если вы знаете несколько принципов и полезных опций, вы сможете пользоваться ими гораздо эффективнее.


Как написать команду SSH?

Основной формат команды SSH выглядит следующим образом:

ssh [опции] [имя_пользователя]@[адрес_хоста] [команда]

Давайте подробнее рассмотрим, что означает каждый элемент.

  1. ssh: команда для запуска клиента SSH.

  2. [опции]: вы можете указать различные опции для управления способом подключения SSH. Например, вы можете использовать определённый файл ключа или установить пересылку портов. (Подробности далее.)

  3. [имя_пользователя]: имя учетной записи пользователя на удалённом сервере, к которому вы хотите подключиться. Если имя пользователя на локальном компьютере совпадает с именем пользователя на удалённом сервере, его можно опустить.

  4. [адрес_хоста]: IP-адрес или доменное имя удалённого сервера, к которому вы хотите подключиться.

  5. [команда] (по желанию): если есть команда, которую вы хотите выполнить сразу после подключения к удалённому серверу, укажите её здесь. После выполнения этой команды SSH-сессия будет завершена. Если этот элемент опустить, вы сможете войти на сервер и использовать интерактивную оболочку (Shell).

Принципы написания команд и лёгкие советы для запоминания

Команда SSH ясно показывает, "какой пользователь подключается к какому серверу?".

  • Основной принцип: ssh имя_пользователя@адрес_хоста

    • Пример: ssh ubuntu@192.168.1.100 (подключение к учётной записи ubuntu на сервере 192.168.1.100)
    • Пример: ssh root@mywebserver.com (подключение к учётной записи root на сервере https://www.google.com/search?q=mywebserver.com)
    • Лёгкий способ запомнить:

    • "Я (локальный пользователь) хочу зайти к кому-то (удалённый пользователь) там (на удалённом сервере)!"

    • ssh (я хочу подключиться) [имя_пользователя]@ (к кому) [адрес_хоста] (куда)
    • Для часто используемых серверов можно использовать файл ~/.ssh/config, чтобы не вводить каждый раз длинный адрес, а подключаться с помощью псевдонима (Alias). (Эта тема будет подробно рассмотрена в следующем посте!)

Полезные опции SSH

SSH предлагает множество опций, которые предоставляют мощные функции для различных сценариев. Позвольте мне представить несколько основных опций.

Сцена, где фея SSH рассказывает о параметрах

1. -i <IdentityFile>: Указать конкретный файл закрытого ключа

Когда у вас есть несколько ключей SSH и вы хотите использовать конкретный закрытый ключ для подключения к определённому серверу, используется эта опция. По умолчанию используются ~/.ssh/id_rsa или ~/.ssh/id_ed25519, но это будет полезно, если вы создали ключ с другим именем или управляете несколькими ключами.

  • Применение: ssh -i ~/.ssh/my_custom_key ubuntu@my_server.com
  • Пример:

    Bash

    ``` ssh -i ~/.ssh/id_ed25519_my_server ubuntu@example.com

    Ожидаемый результат:

    Введите пароль для ключа '/home/youruser/.ssh/id_ed25519_my_server': # введите пароль для подключения

    ```

2. -p <Port>: Указать SSH-порт удалённого сервера

Большинство SSH-серверов по умолчанию используют порт 22. Однако по соображениям безопасности администраторы часто меняют порт SSH. В таких случаях следует использовать опцию -p и указать изменённый номер порта.

  • Применение: ssh -p 2222 your_user@your_server.com (подключение к порту 2222)
  • Пример:

    Bash

    ``` ssh -p 2222 myuser@192.168.1.100

    Ожидаемый результат:

    Подлинность хоста '192.168.1.100:2222 (...)' не может быть установлена.

    Вы уверены, что хотите продолжить подключение (yes1/no/[fingerprint])? yes

    Предупреждение: добавлен '192.168.1.100:2222' (ED25519) в список известных хостов.

    Последний вход: пн, 17 июня 2024, 10:00:00 с вашего_ip

    myuser@server:~ $

    ```

3. -X: Включение X11-пересылки (запуск графических программ)

Используется, если на удалённом сервере установлены GUI (графические интерфейсы пользователя) приложения, и вы хотите использовать их на экране локального компьютера. Используется система X Window, и на локальной системе должен работать X сервер (например, XQuartz для macOS, PuTTY + VcXsrv для Windows и т.д.).

  • Применение: ssh -X your_user@your_server.com
  • Пример:

    ```Bash ssh -X myuser@remote-gui-server.com

    Запуск firefox на удалённом сервере (окно firefox отображается на локальном экране)

    myuser@remote-gui-server:~ $ firefox & ```

    (Это может быть неудобно, если производительность низкая или сеть сильно задерживается.)

4. -L <LocalPort>:<RemoteHost>:<RemotePort>: Локальная пересылка портов (Local Port Forwarding)

Эта функция передает соединения, приходящие на определённый порт локального компьютера (LocalPort), через SSH-туннель к определённому порту на удалённом сервере (RemoteHost). Обычно используется для подключения к сервисам за фаерволом или когда локальное приложение должно подключаться к удалённой базе данных.

  • Применение: ssh -L 8080:localhost:80 your_user@your_server.com
    • Эта команда передает все соединения, приходящие на 8080 порт локального компьютера, через your_server.com к 80 порту внутри your_server.com (localhost:80 означает сам your_server.com).
  • Пример:

    • Когда вы не можете напрямую подключиться к веб-серверу на удалённом сервере (80 порт), но можете подключиться только через SSH:

      ```Bash ssh -L 8080:localhost:80 myuser@my_web_server.com

      После выполнения этой команды, если вы перейдете в веб-браузер на http://localhost:8080

      это будет эквивалентно подключению к 80 порту my_web_server.com.

      ```

    • Если локальное приложение my_db_app должно подключаться к 3306 порту MySQL удаленного db_server.internal, но db_server.internal доступен только через my_app_server.com:

      ```Bash ssh -L 3307:db_server.internal:3306 myuser@my_app_server.com

      После выполнения этой команды, когда my_db_app подключается к localhost:3307

      это приведет к подключению к 3306 порту db_server.internal через my_app_server.com.

      ```

      (Использование 3307 связано с тем, что на локальном компьютере может быть уже работающий MySQL на порту 3306.)

5. -N: Поддерживать только пересылку портов без выполнения удалённых команд

Используется вместе с опциями -L или -D (Динамическая пересылка портов, SOCKS прокси), чтобы открыть SSH-сессию, но не запускать команду оболочки на удалённом сервере, а просто поддерживать функцию пересылки портов. Обычно используется для поддержания туннеля пересылки портов в фоновом режиме.

  • Применение: ssh -N -L 8080:localhost:80 your_user@your_server.com
  • Пример:

    ```Bash ssh -N -L 8080:localhost:80 myuser@my_web_server.com &

    Поддержание туннеля пересылки портов в фоновом режиме (&) для доступа локально через веб-браузер

    ```

6. -f: Перевести SSH-сессию в фон

Эта опция отправляет процесс клиента SSH в фоновый режим после успешного подключения SSH. Обычно используется вместе с опцией -N для сохранения туннеля пересылки портов в фоновом режиме.

  • Применение: ssh -f -N -L 8080:localhost:80 your_user@your_server.com
  • Пример:

    ```Bash ssh -f -N -L 8080:localhost:80 myuser@my_web_server.com

    После выполнения этой команды управление терминалом будет немедленно возвращено, а SSH-туннель будет выполняться в фоновом режиме.

    Вы можете проверить процесс с помощью команды ps aux | grep ssh

    ```


В заключение

В этом посте мы рассмотрели основную структуру команд SSH и часто используемые ключевые опции. Особенно рекомендую запомнить указание порта с помощью -p и пересылку портов с помощью -L, поскольку они используются очень часто на практике.

В следующем посте мы узнаем, как использовать файл ~/.ssh/config для удобного управления SSH-доступом. Если у вас есть вопросы, не стесняйтесь оставлять их в комментариях!