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

Предыдущий пост: SSH keygen: Полный гид для новичков

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


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

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

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

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

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

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

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

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

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

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

Команда 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
  • Пример:

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)
  • Пример:

    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 System, и на локальной системе должен работать X сервер (для macOS это XQuartz, для Windows требуется PuTTY + VcXsrv и т.д.).

  • Использование: ssh -X your_user@your_server.com
  • Пример:

        ssh -X myuser@remote-gui-server.com
        myuser@remote-gui-server:~ $ firefox &

    После подключения запускается firefox на удаленном сервере (окно firefox появляется на локальном экране).
    Если производительность плохая или есть серьезная задержка сети, это может быть неудобно.

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

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

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

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

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

        После выполнения этой команды, доступ через локальный веб-браузер по адресу http://localhost:8080 соответствует
        фактически тому, как если бы вы подключились к порту 80 на my_web_server.com.

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

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

            После выполнения этой команды, локальное my_db_app подключится по адресу localhost:3307
            к удаленному db_server.internal на порту 3306 через my_app_server.com.

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

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

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

  • Использование: ssh -N -L 8080:localhost:80 your_user@your_server.com
  • Пример:

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

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

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

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

  • Использование: ssh -f -N -L 8080:localhost:80 your_user@your_server.com
  • Пример:

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

        После выполнения этой команды управление терминалом вернется сразу, а SSH туннель будет работать в фоновом режиме.
        Вы можете проверить процесс с помощью команды ps aux | grep ssh


В заключение

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

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