263 lines
18 KiB
Markdown
263 lines
18 KiB
Markdown
# Подключение к SSH
|
||
|
||
Для работы с серверами используется терминал. Текстовый интерфейс, который он обеспечивает, может быть менее наглядным,
|
||
чем графический, однако он обеспечивает гораздо более гибкий доступ к настройкам и менее требователен к ресурсам.
|
||
|
||
Откройте приложение **Терминал** (Finder - Программы - Утилиты). Должно открыться примерно такое окно:
|
||
|
||

|
||
|
||
Здесь и далее, все команды в терминале будут обозначены символом `$` в начале строки, например:
|
||
```shell
|
||
~$ ls
|
||
/srv$ pwd
|
||
$ echo "Hello, world!"
|
||
```
|
||
Здесь:
|
||
* `~` и `/srv` - текущий каталог (`~` - домашний каталог). Подразумевается, что запускать команду надо из этого
|
||
каталога. Если эта часть не указана, то это команду можно выполнять в любом каталоге.
|
||
* `$` индикатор начала команды
|
||
* `ls` и `pwd` - собственно команды который надо ввести, что эта команда терминалу; при этом в сам терминал его вводить _не нужно_. Для
|
||
запуска команды достаточно будет просто нажать `Enter`.
|
||
|
||
Пример запуска первой команды из примера выше:
|
||
|
||

|
||
|
||
Если же каталог в запущенном терминале не совпадает с каталогом, указанном до `$`, то необходимо изменить каталог,
|
||
используя команду `cd <целевой каталог>`, например:
|
||
```shell
|
||
$ cd /srv
|
||
```
|
||
|
||
К сожалению, более постоянные картинки-примеры я привести не смогу ввиду отсутствия устройств от Apple...
|
||
|
||
## 1 Добавление синонима сервера
|
||
Добавьте в файл `hosts` следующую строку:
|
||
```
|
||
45.9.42.246 omgauto.ssh
|
||
```
|
||
В Mac OS этот файл располагается в `/private/etc/hosts`, редактировать его необходимо от имени администратора.
|
||
[Подробнее об изменении этого файла](https://help.reg.ru/support/dns-servery-i-nastroyka-zony/rabota-s-dns-serverami/fayl-hosts-na-macos).
|
||
Таким образом, создаётся синоним для IP адреса сервера (`45.9.42.246`), так что дальнейшие команды будут чуть более понятны.
|
||
|
||
## 2 Ключ шифрования
|
||
Откройте Терминал и введите следующую команду:
|
||
```shell
|
||
$ ssh-keygen -t ed25519
|
||
```
|
||
И нажмите `Enter`. Скрипт после этого, скорее всего, попросит ввести дополнительные данные: место сохранения и
|
||
_passphrase_. Оставьте их значениями по умолчанию (пусть это и [не рекомендовано](https://serverfault.com/questions/142959/is-it-okay-to-use-a-ssh-key-with-an-empty-passphrase)),
|
||
нажав на `Enter` ещё несколько раз. После этого ключ будет создан, а на консоль будет выведено примерно следующее сообщение:
|
||
```
|
||
Your identification has been saved in /Users/myname/.ssh/id_ed25519.
|
||
Your public key has been saved in /Users/myname/.ssh/id_ed25519.pub.
|
||
The key fingerprint is:
|
||
ae:89:72:0b:85:da:5a:f4:7c:1f:c2:43:fd:c6:44:38 myname@mymac.local
|
||
|
||
The key's randomart image is:
|
||
|
||
+--[ RSA 2048]----+
|
||
|+.o. |
|
||
|ooE |
|
||
|oo |
|
||
|o.+.. |
|
||
|.+.+.. S . |
|
||
|....+ o + |
|
||
| .o .... |
|
||
| . .. . |
|
||
| .... |
|
||
+-----------------+
|
||
```
|
||
Эта команда создала [ключи шифрования](https://ru.wikipedia.org/wiki/%D0%9A%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D1%81_%D0%BE%D1%82%D0%BA%D1%80%D1%8B%D1%82%D1%8B%D0%BC_%D0%BA%D0%BB%D1%8E%D1%87%D0%BE%D0%BC).
|
||
Этот ключ состоит из 2 частей: публичного (`/Users/myname/.ssh/id_ed25519.pub`) и приватного (`/Users/myname/.ssh/id_ed25519`).
|
||
Эти ключи будут обеспечивать шифрование всего потока данных между вашим компьютером и сервером; а также позволит
|
||
подключиться к серверу без дополнительного ввода пароля.
|
||
|
||
**Никогда и никому не сообщайте приватный ключ**!!! Он должен хранится только на вашем компьютере. Файл с приватным ключом
|
||
начинается с `-----BEGIN RSA PRIVATE KEY-----`.
|
||
|
||
Передавать можно и нужно только публичный ключ. Что бы увидеть публичный ключ, введите
|
||
```shell
|
||
$ cat ~/.ssh/id_ed25519.pub
|
||
```
|
||
После нажатия на `Enter`, в консоль выведется примерно такое содержимое (конкретные символы будут, разумеется, другими):
|
||
```
|
||
ssh-ed25519 AAA...qUx user@localhost.local
|
||
```
|
||
Скопируйте эту строку, она понадобится позже.
|
||
|
||
## 3 Первое подключение к серверу
|
||
|
||
На сервере создано несколько аккаунтов:
|
||
* `root` - это главный администраторский аккаунт сервера. Он имеет максимальные права... И поэтому использовать его как
|
||
основной аккаунт крайне не рекомендуется. Его пароль я вышлю отдельно.
|
||
* `omgauto` - это дополнительный пользовательский аккаунт, который я создал специально для вас. У него стоит временный
|
||
пароль `321321`, который нужно будет изменить при первой возможности (см. ниже).
|
||
|
||
Я настоятельно рекомендую использовать `root` только в случае крайней необходимости. Из-под `omgauto` тоже можно будет
|
||
выполнить команды от имени администратора (`sudo` - Super-User DO), однако это потребует ввода пароля, что бы потенциально
|
||
небезопасные команды не запускались "случайно".
|
||
|
||
Для подключения к серверу, в терминале нужно ввести:
|
||
```shell
|
||
$ ssh omgauto@omgauto.ssh
|
||
```
|
||
Здесь:
|
||
* `ssh` - команда подключения к серверу по протоколу SSH
|
||
* `omgauto` - имя пользователя
|
||
* `@` (читается как `at`) - разделитель между именем пользователя и сервером (`user@server` = `user AT server`)
|
||
* `omgauto.ssh` - алиас IP сервера; здесь можно использовать просто IP адрес (`omgauto@45.9.42.246`), однако мне кажется
|
||
это менее очевидным способом.
|
||
|
||
После ввода команды, сервер в первый раз запросит пароль. Не пугайтесь, если после нажатия на клавиши на экране ничего не
|
||
будет меняться: так и задумано. Просто введите пароль (`321321`) и нажмите `Enter`. Если всё получилось, должно выйти что-то
|
||
типа такого:
|
||
|
||

|
||
|
||
_Заметка_: `ssh` работает одинаково на всех ОС, так что тот факт, что я использую Windows, ни на что не влияет в данном примере.
|
||
А после установки соединения с сервером различия и вовсе исчезают, так как теперь мы работаем в терминале сервера.
|
||
|
||
Сразу же после того, как подключение произошло, измените пароль. Для этого используйте команду
|
||
```shell
|
||
$ passwd
|
||
```
|
||
Эта команда попросит ввести сначала текущий пароль (`321321`), а затем дважды новый. Если пароль изменился успешно,
|
||
появится сообщение `passwd: password updated successfully`.
|
||
|
||
Как было сказано выше, подключаться к серверу можно и без пароля. Для этого необходимо ввести следующую команду:
|
||
```shell
|
||
$ nano ~/.ssh/authorized_keys
|
||
```
|
||
Откроется консольный редактор `nano`. Вставьте в него публичный ключ, который мы создали ранее:
|
||

|
||
Для сохранения и выхода нажмите сначала `F2` (появится запрос сохранения), затем `Y` (подтверждение сохранения), затем
|
||
`Enter` (подтверждение стандартного места сохранения).
|
||
|
||
Для проверки, что всё сохранилось, можно ввести
|
||
```shell
|
||
$ cat ~/.ssh/authorized_keys
|
||
```
|
||
В консоли должен появиться введённый вами ключ.
|
||
|
||
Теперь, при следующем подключении, сервер не будет запрашивать пароль. Что бы это проверить, отключитесь от сервера,
|
||
завершив SSH-сессию:
|
||
```shell
|
||
$ exit
|
||
```
|
||
а затем вновь подключитесь, используя
|
||
```shell
|
||
$ ssh omgauto@omgauto.ssh
|
||
```
|
||
Если сервер снова запроси пароль, то что-то произошло с сохранением публичного ключа.
|
||
Но, скорее всего, в терминале появится вопрос, уточняющий, продолжать ли подключение к неизвестному (для системы) серверу:
|
||

|
||
Введите `yes` на запрос и нажмите `Enter`. Публичный ключ сервера теперь будет сохранён в системе, и следующее (третье)
|
||
подключение к серверу произойдёт без дополнительных вопросов.
|
||
|
||
## 4 Работа с сервером
|
||
|
||
Базовые команды:
|
||
* `ls` - Показать содержимое каталога (список названий файлов);
|
||
* `ll` - Показать подробное содержимое каталога (это не стандартная команда, а сокращение);
|
||
* `cd` - Сменить каталог (перейти в другой);
|
||
* `mkdir` - Создать новую папку (каталог);
|
||
* `touch` - Создать новый файл;
|
||
* `rm` - Удалить файл;
|
||
* `cat` - Показать содержимое файла;
|
||
* `pwd` - Показать текущий каталог (полный путь к этому каталогу);
|
||
* `cp` - Копировать файл/папку;
|
||
* `mv` - Переместить файл/папку;
|
||
* `grep` - Поиск конкретной фразы в файле;
|
||
* `find` - Поиск файлов и папок;
|
||
* `vi` и `nano` - Текстовые редакторы;
|
||
* `history` - Показать 50 последних использованных команд;
|
||
* `clear` - Очистить окно терминала.
|
||
|
||
Что бы узнать подробнее о команде, используйте руководство (`man` - **man**ual):
|
||
```shell
|
||
$ man <команда>
|
||
```
|
||
Так, например
|
||
```shell
|
||
$ man ls
|
||
```
|
||
выдаст такое содержимое:
|
||

|
||
Используйте стрелки вверх и вниз для построчной прокрутки содержимого, кнопки `PageUp` и `PageDown` для более быстрой
|
||
прокрутки и `q` для выхода из руководства.
|
||
|
||
## 5 Критические моменты: HTTPS
|
||
|
||
Для обеспечения работы HTTPS я использую бесплатные сертификаты от [Let’s Encrypt](https://letsencrypt.org). Для
|
||
автоматизации используется инструмент `certbot`. И на вашем сервере я настроил автоматическое обновление
|
||
SSL-сертификата, используя этот инструмент.
|
||
|
||
Что бы проверить, что это обновление всё ещё запускается на фоне, достаточно запустить команду:
|
||
```shell
|
||
$ systemctl list-timers
|
||
```
|
||
и найти элемент с названием `snap.certbot.renew.time`:
|
||

|
||
Если в столбце `PASSED` указано значение меньше суток, то всё в порядке.
|
||
|
||
## 6 О Node и библиотеках
|
||
|
||
Ещё одна причина, из-за которой работа генератора PDF прерывалась на моём сервере, — это обновление Node.JS. Это
|
||
набор утилит, который я использовал для эмуляции Chrome и последующей "печати" PDF оттуда. Это обновление каким-то
|
||
образом сделало новую версию Node несовместимым с внутренней версией утилиты `npm`, которая используется для
|
||
обновления пользовательских библиотек и запуска скриптов. Когда вы сообщили о проблеме, я быстро её починил, просто
|
||
переустановив Node...
|
||
|
||
Суть в том, что так как на вашем сервере частые обновления не нужны (один из главных принципов системного
|
||
администрирования: "Работает - не трогай!"), ломаться оно не будет. Так же, как не ломалось долгое время на хостинге,
|
||
пока они не отключили на хостингах критическую библиотеку, которая не нужна для обычных сайтов, но критическая для
|
||
Chrome.
|
||
|
||
Проверить версию этих библиотек можно используя команды:
|
||
```shell
|
||
$ node -v
|
||
$ npm -v
|
||
```
|
||

|
||
|
||
Таблицу совместимости версий я не найду, потому что её не существует, но обновлять их всегда надо вместе.
|
||
|
||
## 7 Проверка ошибок работы скриптов
|
||
|
||
Что бы проверить, что всё работает и ничто нигде не застряло, можно посмотреть несколько место.
|
||
|
||
Для всех дальнейших проверок, потребуется перейти в папку, где находятся файлы проекта:
|
||
```shell
|
||
$ cd /srv/ampodbor.ru
|
||
/srv/ampodbor.ru$ ll
|
||
```
|
||
Вторая команда (`ll`) отобразит список файлов, что бы можно было проверить, что всё на месте:
|
||
|
||

|
||
|
||
### 7.1 Проверка заданий конвертации
|
||
```shell
|
||
/srv/ampodbor.ru$ ll tasks
|
||
```
|
||
В этой папке не должно быть файлов, то есть вывод выглядит так:
|
||
|
||

|
||
|
||
Если же отображается файл с названием типа `task-1234.json`, то есть необработанное задание. Это может произойти по 2
|
||
причинам:
|
||
1. Задание просто не успело обработаться, так как запуск этих заданий происходит каждую минуту. Подождите минуту, и
|
||
запустите команду ещё раз. Файл должен удалиться автоматически.
|
||
2. Если же файл не удалился, то, скорее всего, его обработка закончилась ошибкой.
|
||
|
||
### 7.2 Проверка лога конвертации
|
||
```shell
|
||
/srv/ampodbor.ru$ tail cron.log
|
||
```
|
||
|
||
Если отображается что-то такое:
|
||
|
||

|
||
|
||
То что-то сломалось. Зовите меня, будут разбираться :) |