ENote
  • ✨Home
    • Відмова від відповідальності
  • Progr
    • Python
      • Модулі
        • pip
        • cgitb
        • datetime
          • Класс datetime() модуля datetime
            • Методы объекта datetime.datetime()
            • datetime.datetime examples
          • Класс timedelta() модуля datetime
            • datetime.timedelta examples
          • Класс date() модуля datetime
            • datetime.date examples
          • Класс time() модуля datetime
            • Формат для функций .strftime() и .strptime(). модуля datetime
        • os.path
        • pathlib
          • pathlib to str
        • subproces
        • os
        • Jinja
          • Синтаксис шаблонів Jinja
          • Клас Environment()
          • Простой пример cgi-скрипта c Jinja-шаблоном
          • Создание переменных
            • Як оновити глобальну змінну зсередини оператора IF / ELSE або циклу FOR
          • Фільтри і методи
          • Число у рядок, slices
          • Вбудовані фільтри Jinja2
        • re
          • re.search - example
          • re.findall - example
        • email / smtplib
          • Как отправлять электронные письма с помощью Python
        • requests
          • Як зберегти та завантажити файли cookie в запитах Python?
          • Извлечение и установка cookies с модулем requests в Python
          • Links
        • http.cookies
          • Всё о работе с cookie в Python — класс http.cookies
        • xlrd
        • xlwt
        • borb
          • ChunkOfText
          • send_usage_statistics
          • borb clear
          • 2.1.3 vs 2.1.15
          • QR-code
          • Залежності borb
        • JSON
          • Кирилиця в JSON
        • matplotlib
        • argparse
        • click
        • configparser
        • traceback
        • sys
          • exit()
        • mysql-connector-python
        • logging
        • icrawler
        • Auto Plates
        • rembg
        • random
      • Strings
        • Built-in methods
        • Форматування виводу
        • Початкові нулі
        • Рядок в число
      • list
        • Об’єднання списків
        • list.sort(), sorted()
        • list.reverse(), reversed()
        • all(), any()
        • sum(), min(), max()
        • map(), filter(), reduce()
        • join(), split()
      • tuple
      • dict
        • Об'єднання / злиття словників
        • Сортування словника Python: значення, ключі тощо
      • set
      • class Enum
      • Середнє арифметичне
      • Virtual environment
        • web-app
      • type(), isinstance()
      • __main__
      • Files & Dirs
        • Try except for exception handling
        • Cписок файлов директории
        • User Home Dir
        • Copy file
      • *args, **qwargs
      • Links
      • Область видимости
      • Handling a File Error
      • assert
      • if
      • Числа
        • Округлення чисел
        • Отримати число з рядка
      • Обработка исключений в Python
      • Файлы и сериализация данных
      • OOP
      • Net and Web
      • Структура проекта на Python
      • Распаковка итерируемых объектов
      • Links
      • Algorithms
      • Python exit commands: quit(), exit(), sys.exit() and os._exit()
      • Цикли for / while
      • uuid
    • JavaScript
      • String
        • replaceAll() polyfill
        • Шаблонные строки
      • Array
        • Все способы перебора массива в JavaScript
      • Object
      • document.location
      • RegExp
      • Examples
        • Вычисление остатка от деления
        • Остаток от деления и деление без остатка
        • Округление числа
      • XMLHttpRequest
      • alert, prompt, confirm
      • onclick
      • hidden, display:none
      • LocalStorage, sessionStorage
      • null, undefined
      • cookies (js)
      • var, let и const
        • var vs let
        • const
      • Модифікація DOM
        • DOM select
      • JSON
        • Try
      • fetch
      • typeof
      • FormData не включає disabled набори полів
      • FormData, fdata
      • Більше одного відео YouTube на одній сторінці
    • HTML, CSS
      • favicon
      • Деякі спецсимволи
      • meta
      • ASCII table
      • lang
      • Псевдоелементи ::after і ::before
      • Cursor
      • Об использовании нестандартных пробелов
      • Картинка фоном
      • Безпечні веб-шрифти
      • Завжди внизу, незалежно від пропорцій екрану
      • напівпрозорий елемент
      • Символи з тінью
      • SVG (bootstrap)
      • rel = canonical
      • link stylesheet: integrity & crossorigin
      • rel = noopener
    • Bootstrap
      • Form Validate
      • Password show/hide
    • Errors
  • Dev
    • Git
      • clone
      • git-scm (book)
      • git config
        • files .git*
        • core.filemode
        • core.sharedRepository
      • .gitignore
      • .gitkeep
      • Видалити з репозиторію
        • Видалений файл з однієї гілки...
      • Пам’ятка
        • Перегляд історії комітів
        • Скасувати git add
        • revert
        • Скасувати внесені зміни у файл
        • Додати до коміту файл
        • Видалити історію попередніх коммітів, та почати "з нуля"
        • Додати файли в останній коміт
      • Робота з гілками
        • Порівняти гілки
      • Git за полчаса
      • Три розділи проєкту Git
      • Merge conflict
      • Pull error
        • Git Error: You have divergent branches...
      • diff
      • Video
      • Merge скасувати
      • .gitignore: Permission denied
    • GitHub
      • SSH-підключення до GitHub
      • Перенести на сервер локальный репозиторий
      • Перенести на сервер репозиторій разом з історією
      • Створення змісту
    • Security
      • robots.txt
      • Cookies
    • Аутентифікація і cookies
      • ChatGPT
  • data
    • MySQL
      • MyISAM vs InnoDB
      • Типи даних
        • NULL (todo)
        • TIMESTAMP
        • YEAR
        • JSON
        • Требования к памяти для символьных типов
        • Поиск записей в таблице, которым нет соответствия в другой
      • Приклад створення БД, та користувача
        • Права для пользователей
      • Переглянути всі індекси таблиці
      • Копіювання, клонування таблиць
      • TEMPORARY TABLE
      • JOIN
      • ALTER TABLE
      • AUTO_INCREMENT
        • AUTO_INCREMENT у складовому індексі
      • LIMIT
        • Использование MySQL LIMIT
      • 10 Примеров входной загрузки данных из текстового файла в таблицы MySQL
      • Рішення
        • Выявление и удаление несвязанных записей
        • Выборка произвольных записей
        • Коректне сортування українських літер
        • Найти записи, которые присутствуют в одной таблице и отсутствуют во второй
        • Как удобно посмотреть данные...
        • Нахождение "дыр" в нумерации
        • Знайти дубликати полів в одній таблиці
        • Дані колонки 1 табл. перенести в 2 табл.
      • Функції
        • LAST_INSERT_ID()
        • GROUP_CONCAT
        • COUNT + DISTINCT
        • Функции для работы с датами и временем
      • Автоматизируйте создание бэкапов
      • mysqldump
        • Time Zone UTC
      • Результат запиту у файл
      • Результат запиту у змінну
      • Пособие по MySQL на Python
      • Змінні
      • Эмуляция функции row_number() в MySQL
      • Изучаем хранимые процедуры MySQL
      • SELECT DISTINCT
      • Dump всієї бази даних
      • Індекси
      • FOREIGN KEY
      • MAX(), MIN()
      • LENGTH, CHAR_LENGTH
      • Встановлення
    • MariaDB
    • PostgreSQL
      • Работа с базой данных PostgreSQL
      • Работаем с PostgreSQL через командную строку в Linux
    • Domains
      • Життєвий цикл доменів
      • Статус домена
    • SQLite, MySQL и PostgreSQL: сравниваем популярные реляционные СУБД
  • Linux
    • DNS
      • Как в DNS прописать 301 редирект
      • mail
        • SPF
          • Mirohost
        • _dmarc _domainkey
        • DKIM
        • Прописати ключі DKIM в exim
        • Листи з неіснуючим адресатом
    • Server
      • Zomro
        • pip
        • SSH-доступ по ключу (zomro)
        • venv
        • UnicodeEncodeError: 'latin-1' codec can't encode character
        • Mail Ports
        • Редірект з SSL-сертификатом на транзитному сайті
        • Редірект з SSL за допомогою .htaccess
      • Створення нового користувача з привілеями sudo в Ubuntu
      • SSH-доступ по ключу
      • Часовий пояс в Ubuntu 20.04
      • SSH-підключення командний рядок
      • Як встановити Python 3.9 (нижчу) на Ubuntu 22.04
      • Автозагрузка сервисов в Ubuntu
      • Підвищення безпеки SSH
      • Ubuntu Server
        • Art 01
    • Commands
      • adduser
      • apt
      • cat
      • ls
      • tar
      • ln
      • find
      • chmod
      • chown
      • mv
      • dig
      • ping
      • passwd
      • htpasswd
      • umask
      • usermode
      • history
      • cmp
      • chattr +i
    • Config
      • Keyboard
      • windows
      • My kbdswtch
      • Затримка при завантаженні системи
      • Files
        • /etc/resolv.conf
        • /boot/grub/grub.cfg
        • .config/user-dir.dirs
        • /etc/fstab
      • Як встановити шрифти
    • Apache
      • Встановлення
      • Подключить виртуальный хост
      • Файл .htaccess
        • Установка индексного файла
        • Фільтр IP-адрес
        • ModRewrite
          • Заборонити доступ за User-Agent
          • Перенаправити на іншу сторінку
          • Додавати слеш до адреси
        • Включити SSI
        • Виконувати скрипти CGI
        • Тимчасовий перехід з одного домену на інший
      • SSI
      • SSL
      • Відключити старт Apache з системою
      • Помилки
        • Скрипт не працює
        • CGI-скрипт не виводить кирилицю
        • Could not reliably determine
        • Permissions are missing on a component of the path
        • Symbolic link not allowed or link target not accessible
      • AddType, AddLanguage, AddCharset
    • Nginx
      • 301 редирект з www. та http: на https://(без www.)domain
    • Soft
      • SublimeText
        • Plugins
      • Firefox
      • Gwenview
      • inkscape
      • Double Commander
      • nano
      • mc
        • Знайти потрібний файл
      • meld / diffuse
      • hexedit
      • Kazam - відео з екрану
      • VeraCrypt
      • XnView MP
      • LibreOffice
      • xdotool
      • System Load Monitor
      • Battery Monitor
      • qBittorrent
    • Перетворення .RPM в .DEB
    • Bash
      • Конкатенация строк в Bash
      • Page
    • Файлові часові позначки в Linux: atime, mtime, ctime
    • Права доступу для файлів і каталогів
    • Зміна паролю root
    • Быстро удалить огромное количество файлов в каталоге
    • Як узнати версію Linux?
    • USB Flash ext4
    • Clear Cache
    • Доступ до спільної папки на Windows
    • Віртуальні консолі TTY1–TTY6
    • APT. Заборона оновлення
  • Різне
    • GitBook
    • Банковское округление
    • Ім’я користувача Youtube
  • Hard
    • Hardware
      • Acer Extensa
      • Таймер Feron TM22
      • WD My Book World Edition 2Tb
        • FTP
        • SSH
          • Проблеми
        • SSHFS
      • Canon PIXMA E3340
      • Термометри
    • Auto
      • Акумулятор
    • Electro
    • USB Flash recovery
Powered by GitBook
On this page
  1. Linux
  2. Server
  3. Ubuntu Server

Art 01

Мой первый опыт с Linux. Настройка Ubuntu Sever 20.04, подключения по SSH и удаленное подключение к базе данных https://habr.com/ru/sandbox/149730/

PreviousUbuntu ServerNextCommands

Last updated 1 year ago

Мой первый опыт с Linux. Настройка Ubuntu Sever 20.04, подключения по SSH и удаленное подключение к базе данных

Ожидает приглашения

Всем привет, это моя первая статья на Хабре (да и первая в принципе). Я не в коем случае не претендую сейчас на звание специалиста и т.п. В общем, как и понятно из названия это мой первый опыт, так что, конечно, будут и ошибки. Я рад любой критике. Это статья нужна так же в основном и мне, для того, чтобы научиться писать статьи, так как скоро дипломная, а это как не как опыт(хотя и немного не то) была в случае чего шпаргалка и мне не приходилось бы снова искать по всему интернету всю эту информацию. Ну со вступлением все.

Начну с того, что скажу зачем мне вообще это понадобилось. А все просто, интересно. Я захотел создать десктопное приложение с базой данных, но я так уже делал и я захотел немного усложнить задачу, так как мне, в случае успеха, придется устанавливать эту программу для корпоративных целей, то базу данных надо переместить на сервер. Так что я взял старенький ноутбук и решил из него попробовать сделать сервер для базы данных. И столкнулся со множеством проблем, решение которых заняло у меня дня так три(если не учитывать то время, которое я пытался провозиться еще и с VirtualBox дня 2), хотя для некоторых может это и будет казаться легкотней, но для меня это было интересно и познавательно, ладно, начнем.

  1. Установка Ubuntu Server.

    Процесс установки Ubuntu Server, легко найти в интернете, например https://info-comp.ru/drugieopersistemi/644-install-linux-ubuntu-server-18-04.html. Хоть Ubuntu Server там и 18.04 я думаю эту руководство подойдет и для версии 20.04.

  2. Настройка сети.

    1. Ну перейдем к теме настройки сети. Цель настроить wifi. В интернете полно руководств по настройки проводного подключения, но мне так и не удалось найти руководство по настройке wifi, после которого бы у меня он заработал. wifi мне нужен в основном для того, чтобы во время разработки не быть привязанным к проводной сети. Но для того, чтобы его настроить все таки сначала понадобится проводная сеть. В принципе по умолчанию для проводной сети ip адрес определяется по DHCP, так что достаточно просто вставить Enternet-кабель и интернет заработает. Если это не так, то моя статья по этому поводу не поможет(уж извините). Дальше нам понадобится установить пакет net-tools. Для этого выполните команду:

    sudo apt-get install net-tools

    Теперь нам надо узнать названия сетевых интерфейсов. Для этого выполним следующую команду

    ifconfig -a

    Нас интересует интерфейс wlp2s0 у вас он может называть по другому, например wlan0. Он отвечает за беспроводное соединение. Теперь, когда мы узнали название сетевого интерфейса, можем переходить к настройке wifi. Мои проблемы с настройкой wifi были лишь из-за того, что в версиях Ubuntu Server, начиная с 18.04 настройка сети происходит с помощью утилиты Netplan. Конечно в сети полно информации про нее и как ей пользоваться, мне например очень помогла статья https://fomich0ff.github.io/2019/05/05/wifi-on-rpi-ubuntu-server/. Тут все очень кратко расписано. Но даже после этих статей у меня так и не заработал wifi. Ну начнем. Для начало надо попасть в файл конфигурации, для этого набираем команду:

    sudo nano /etc/netplan/*.yaml

    Появиться окно с настройками. Далее я приведу уже свои настройки(естественно скрыв SSID и password).

    Для проверки нашего конфигурационного файла вводим команду:

    sudo netplan --debug generate

    И для того, чтобы настройки вступили в силу, вводим команду:

    sudo netplan --debug apply

    Но это еще не все, даже после таких действий у меня так и не заработал wifi. Нам надо скачать еще один пакет, который называется wpasupplicant, он позволяет работать с сетями, которые имеют метод шифрования WPA, WPA2 и т.д. Может это все и выглядит банально, но у меня ушло много времени, чтобы найти ошибку. Вводим следующую команду:

    sudo apt-get install wpasupplicant

    После этого у меня сразу заработал wifi(если не заработал, то можно попробовать перезагрузить систему). Теперь, когда появился wifi, можно перейти к настройке ssh.

  3. Настройка SSH

    1. Настроим конфигурационный файл, для этого выполним команду:

    sudo nano /etc/ssh/sshd_config

    Откроется примерно такой файл:

    # - закомментированные поля. Описание всех полей можно найти в интернете. Я лично раскомментировал следующие:

    Port - по умолчанию идет 22, но для безопасности лучше поменять, я поставил 2023.

    Protocol - протокол SSH. Первый протокол плохо защищен, так что ставим 2.

    PermitRootLogin - если поля имеет значение no, то при подключение через SSH невозможно будет войти за root.

    PubkeyAuthentication - разрешает/запрещает входить по публичному ключу(расм. далее)

    AuthorizedKeysFile - показывает файлы с публичными ключами

    PasswordAuthentication - если поле имеет значение yes, то возможно будет войти с помощью пароля пользователя, иначе можно будет войти только по ключу(если PubkeyAuthentication yes)

    Все остальные поля я оставил как они и были(там были и другие раскомментированные поля)

    После настройки необходимо перезагрузить ssh, для этого выполним команду:

    sudo systemctl restart ssh

    Дальше во всех статьях, которые мне попадались, говорили, что можно смело подключаться по SSH, но как я не пытался в ответ я получал только connection refused(соединение отклонено). Кстати, чтобы подключиться необходимо ввести команду:

    ssh -p port username@hostname

    port - порт подключения, в моем случае 2023

    username - имя пользователя(в моем случае vavilonbase, например)

    hostname - имя хоста(к этому вернемся далее)

    В качестве hostname я сначала использовал localhost, но все мои попытки не увенчались успехом, я долго мучался с этим подключение, пока наконец не нашел ответ, а именно, то что у меня были закрыты порты на роутере, открыть их мне помогла статья https://lumpics.ru/how-to-open-ports-on-router/.

    Я лишь покажу конечный результат переадресации портов:

    После этого у меня все заработало. Теперь, в моем случае, для подключения по ssh нужно ввести команду:

    ssh -p 2023 vavilonbase@192.168.1.18

    И после этого ввести пароль, все готово.

    При первом подключение может возникнуть сообщение:

    Картинка с сайта: https://losst.ru/kak-podklyuchitsya-po-ssh

    Здесь надо написать yes и нажать Enter.

  4. SSH-ключ

    Входит по паролю конечно хорошо, но еще лучше входить без пароля, но защищено, а именно по SSH ключу. В интернете полно руководств как сгенерировать SSH-ключ на Linux и перебросить его на ubuntu-server, например эта статья: https://losst.ru/avtorizatsiya-po-klyuchu-ssh

    Но в интернете мне было сложно найти точное описание как же это сделать в Windows(а у меня основная машина WIndows). Так что я покажу все это на примере WIndows. Начнем.

...

  1. Все ключ сгенерирован, дальше то с чем у меня по началу возникали проблемы. А именно, для клиента OpenSSH Windows нет команды sshcopyid, благодаря которой происходила отправка ключа на сервер в WIndows. Я лично использовал для этих целей команду scp.

    Теперь, что нужно, чтобы ее использовать, если в случае команды sshcopyid она автоматически создавала все нужные файлы на сервере, то сейчас нам придется создать их вручную. Для этого заходим на сервер и вводим следующую команду:

    sudo mkdir .ssh

    То есть создаем папку .ssh(если она еще не создана)

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

    Теперь выполним следующую команду:

    scp -P 2023 C:\Users\Vavil/.ssh/id_rsa.pub vavilonbase@192.168.1.18:~/.ssh

    Посмотрим, что здесь что:

    -P - стоит заметить, что P - большая, это важно, тут мы вводим порт.

    Дальше идет адрес публичного ключа в Windows(где его взять см. выше)

    Дальше идет имя пользователя и имя хоста(прямо как при подключение по SSH), после этого идет двоеточие и папка куда надо отправить этот ключ на сервере(в ту самую папку, которую мы создали).

    Но это отнюдь не все, если вспомнить, то когда мы настраивали sshdconfig, то мы как раз таки указывали какие файлы у нас отвечают за ключ, а именно ~/.ssh/authorizedkeys, то есть нам надо переименовать файл. Переходим на сервер и вводим следующие команды:

    sudo cd .ssh
    sudo mv id_rsa.pub authorized_keys
    sudo systemctl restart ssh

    Все готово. Пробуем войти и радуемся.

  2. Настройка БД

    Ну перейдем к тому, для чего все это и было затеяно. В качестве БД у меня PostgreSQL.

    Для установки БД можно воспользоваться этой статьей: https://losst.ru/ustanovka-postgresql-ubuntu-16-04. Дальше создадим пользователя app и тестовую базу данных appdb. Выполним команды:

CREATE USER app PASSWORD 'passwordOfApp';
CREATE DATABASE appdb OWNER app;

Когда база данных создана, хотелось бы подключится к ней с другого компьютера, для этого настроим конфигурационные файлы postgresql.conf и pg_hba.conf. Для их редактирования выполним команды:

sudo nano /etc/postgresql/12/main/postgresql.conf
sudo nano /etc/postgresql/12/main/pg_hba.conf

В первом файле нужно отредактировать следующие параметры:

listen_addresses = 'localhost' поменять на listen_addresses = '*' и для безопасности изменить порт по умолчанию(5432).

Во втором файле необходимо изменить следующую строку(см. картинку)

А именно адрес в ней, в моем случае у меня адрес компьютера статический и я могу записать его сюда. Вы так же можете сделать его статическим(см. статью про открытие портов, там до переадресации делали адрес сервера статическим). То есть здесь мы указываем адреса, который могут подключится к базе данных, в случае, если такой не один, просто копируем всю строку и меняем адрес на новый. После этого перезагружаем сервер postgresql. Выполним команду:

sudo service postgresql restart

Попробуем подключиться к базе данных через небольшое приложение на C#.

То есть тут мы запрашиваем у сервера его версию, получаем следующий ответ:

Как видно сервер вернул ответ с версией, а значит все настроено верно.

Ну на этом все. Как я и сказал, я в Linux полный новичок, так что если есть какие-либо советы я только рад. Это статья служит скорее как шпаргалка мне, так как мне это и правда был интересный опыт и я бы хотел запечатлить его в виде такой вот статьи. Спасибо всем за внимание.

C#*
Настройка Linux*
Программирование*
Сетевые технологии*
Системное администрирование*