Перейти к основному содержимому

Мастер-класс по Linux

Что потребуется перед началом

Виртуальная машина, на которой установлена Ubuntu Server 22.04 (см. часть 0). Чтобы её развернуть развернуть, необходимо:

  • ПК, способный запустить систему виртуализации с виртуальной машиной GNU/Linux. Подойдет любой новейший процессор Intel или AMD.
  • Минимум 30 Гб свободного места на жестком диске (под систему и снимки).
  • Минимум 4 Гб оперативной памяти для виртуальной машины (не забывайте, что оперативная память также требуется и под хостовую машину).
  • Установленный VirtualBox.
  • Загруженный образ дистрибутива (рекомендуется Ubuntu Server 22.04).

Часть 0. Развертывание виртуальной машины

Процесс развертывания виртуальной машины показан на VirtualBox 7.0, установленный на хостовую машину с операционной системой Manjaro (Linux).

Установка операционной системы виртуальной машины

  1. Устанавливаем VirtualBox.

  2. Скачиваем образ для установки дистрибутива Ubuntu Server 22.04 с официального сайта. Вы можете выбрать любой способ загрузки, подходящий вам, например через Torrent клиент.

    Во время подготовки материала использовался образ ubuntu-22.04.3-live-server-amd64.iso, как наиболее универсальный вариант.

  3. Пока качается образ - создаем виртуальную машину (далее ВМ) в системе виртуализации. Ставить будем в VirtualBox (далее VB)

    Открываем окно создания виртуальной машины:

    create-vm-1

    Как назвать - дело ваше. Удобно набрать "ubuntu" в названии, тогда VB сразу подставит значения для Ubuntu в выпадающие списки.

    Важно указать, что мы хотим пропустить автоматическую установку:

    create-vm-2

    Для виртуальной машины рекомендуется задать оперативную память 4096 МБ. На странице официальной странице дистрибутива указано, что минимальным требование является 1024 МБ. Этот параметр вы можете изменить в будущем в настройках виртуальной машины:

    create-vm-3

    Выделяем диск. Использовать рекомендуется динамический виртуальный диск. Тогда покуда внутри ВМ вы не забьете место на диске - оно не будет занято и в вашей хостовой системе. Фактический размер будет динамически растягиваться под требования (но автоматически сжиматься не будет). Достаточно будет и 25 GiB. Лучше сразу больше, все равно место оно не занимает, пока не потребуется:

    create-vm-4

    После того, как задали все параметры, нажимаем "Готово".

  4. Идем в настройки VirtualBox и создаем новую сеть NAT. Настраиваем проброс портов 127.0.0.1:2222 -> 10.0.5.5:22. Это нам потребуется для того, чтобы мы могли по SSH подключиться к виртуальной машине из хостовой.

    create-net-1

    Переходим к созданию новой сети NAT:

    create-net-2

    Указываем, что хотим создать подсеть 10.0.5.0/24:

    create-net-3

    Далее делаем проброс портов 127.0.0.1:2222 -> 10.0.5.5:22:

    create-net-4

    После того, как все указали, применяем настройки сети и проброса портов.

  5. В настройках ВМ в системе виртуализации выбираем загруженный образ в качестве содержимого оптического носителя, чтобы с него загрузиться:

    create-choose-cd-1

    create-choose-cd-2

  6. В настройках ВМ в пункте "Сеть" выбираем "Сеть NAT" и нашу новую сеть:

    create-choose-net-1

    Незабываем подтвердить внесенные изменения в виртуальную машину.

  7. Запускаем виртуальную машину и устанавливаем систему. Подробно рассматривать процесс установки не будем, остановимся только на самых важных деталях. Руководство по установке Ubuntu Server.

    Выбираем пункт Try or Install Ubuntu Server:

    install-ubuntu-1

    Выбор региона и раскладки клавиатуры. Если выбираете себе что-то, кроме английской раскладки - дело ваше, страдать Вам. Мы оставим все все по умолчанию:

    install-ubuntu-2

    install-ubuntu-3

    Оставим также по умолчанию то, что хотим устанавливать:

    install-ubuntu-4

    Далее настройки сетевого интерфейса. Оставляем по умолчанию:

    install-ubuntu-5

    Proxy - пропускаем, оставляем пустым:

    install-ubuntu-6

    Какое зеркало для загрузки репозиториев использовать - выбираем ru.archive.ubuntu.com - зеркало Yandex:

    install-ubuntu-7

    Настройки разметки диска. Оставляем все по умолчанию - система автоматически поставится поверх LVM. Для реальных систем идут жаркие споры о том стоит или не стоит ставить систему на LVM:

    install-ubuntu-8

    install-ubuntu-9

    install-ubuntu-10

    Настройки пользователя, hostname - сетевое имя системы и пароля. Пароль root (пользователя с идентификатором (UID - user ID) 0 и имеющим неограниченные привилегии, аналог администратора, далее будем называть его root) не устанавливается. Задаем пароль только для своего основного пользователя. Настоятельно не советуем ставить свой настоящий сложный пароль на ВМ. После ввода его попросят еще раз для подтверждения:

    install-ubuntu-11

    Пропускаем рекламу:

    install-ubuntu-12

    Выбираем установить OpenSSH-сервер:

    install-ubuntu-13

    Пропускаем установку дополнительных пакетов:

    install-ubuntu-14

    Ждем завершения установки системы:

    install-ubuntu-15

    Подтверждаем изъятие диска:

    install-ubuntu-16

    ВМ "на логине". Пробуем войти своим пользователем. Если все введено верно, то вы увидите приглашение ввода команд (command prompt):

    install-ubuntu-17

    Если загружается снова установка, то проверьте в параметрах ВМ то, что диск извлечен:

    install-ubuntu-18

Создание снимка

Делаем мгновенный снимок виртуальной машины, если ваша система виртуализации это поддерживает. Тогда в любой момент мы сможем вернуться на данное состояние системы, если что-то сломаем. В VB переходим во вкладку "Снимки" (Snapshots) и нажимаем "сделать". Названия не принципиальны.

Люди делятся на два типа:

  • Еще не делают бэкапы
  • Уже делают бэкапы

make-snapshot-1

make-snapshot-2

make-snapshot-3

make-snapshot-4

Что-нибудь изменим в системе, например напишем пару команд и выключим ВМ. Теперь попробуем восстановить мгновенный снимок. Если все в полном порядке, вы откатитесь к состоянию ВМ на момент завершения установки виртуальной машины.

Люди, которые делают бэкапы, делятся на два типа:

  • Еще не проверяют свои бэкапы после создания
  • Уже проверяют свои бэкапы после создания

make-snapshot-5

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

Посмотрите, какой IP адрес был получен в созданной нами NAT сети с помощью следующей команды:

ip a

netplan-1

Установим статический адрес ВМ, чтобы при перезагрузке наша ВМ не получала от DHCP нашей сети случайны адрес из пула адресов.

Для это мы воспользуемся утилитой Netplan.

Все конфигурационные файлы Netplan находятся в папке /etc/netplan/. Во время запуска службы, она преобразовывает свою конфигурацию в конфигурацию той службы, которая будет управлять сетью и помещает её в каталог /run/. По умолчанию в Ubuntu есть только один конфигурационный файл. Его мы и откроем на редактирование:

sudo nano /etc/netplan/00-installer-config.yaml

Заменим его текущее содержимое следующим:

netplan-2

В данном случае мы установим статический IP-адрес на сервере Ubuntu 22.04 на 10.0.5.5/24 со шлюзом по умолчанию 10.0.5.1 и DNS-серверами 10.0.5.1. Подробнее о синтаксисе можете узнать здесь.

После того, как мы подправили мы должны сохранить изменения в файл. В текстовом редакторе Nano нужно вызвать комбинацию ctrl+x и подтвердить то, что мы хотим сохранить изменения в файл.

Далее мы применим изменения Netplan с помощью команды:

sudo netplan apply

Если все прошло успешно, то ip a нам покажет, что мы имеет интересующий нас адрес:

netplan-3

Проверим с помощью ping ya.ru то, что мы имеем выход в интернет:

netplan-4

Делаем доступным ssh

Модуль "system" управляет службой SSH во всех последних дистрибутивах Ubuntu. Таким образом, вы можете использовать команды "systemctl" для управления службой SSH.

Чтобы запустить службу SSH и добавить ее в автозапуск, используйте следующую команду:

sudo systemctl enable ssh

Аналогично, если вы хотите проверить, запущена ли служба ssh в вашей системе или нет. Вы также можете проверить состояние службы SSH, используя следующую команду:

sudo systemctl status ssh

ssh-enable

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

ssh <имя пользователя>@localhost -p 2222

Мы используем атрибут -p 2222, чтобы воспользоваться пробросом портов, который мы делали при настройки сети NAT VB.

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

The authenticity of host '[localhost]:2222 ([127.0.0.1]:2222)' can't be established.
ED25519 key fingerprint is SHA256:oLDQlGjAow+wh2RDzTzts8EAQZ4iKAmZ958oSmt6QgY.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[localhost]:2222' (ED25519) to the list of known hosts.

Если все получилось, то отобразится приглашение ввода команд:

check-ssh

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

Часть 1. Подключение по SSH

Что такое SSH-ключ

Материал основан на статье Авторизация на базе ключей SSH | Академия Selectel.

Аббревиатура SSH означает Secure Shell, что дословно переводится как «безопасная оболочка». Если говорить точнее, SSH — это защищенный сетевой протокол с проверкой подлинности и шифрованием. Он используется для передачи файлов, управления сетью и удаленного доступа к операционной системе. Аббревиатура SSH также используется для описания набора инструментов, используемых для взаимодействия с одноименным протоколом.

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

Так как SSH работает по системе «клиент-сервер», обязательное условие для работы этого протокола — наличие на удаленном узле демона SSH. Демон SSH — это ПО, которое прослушивает определенный сетевой порт и при прохождении аутентификации другим узлом создает необходимую среду для работы с ним.

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

Структура ключа

Можно сказать, что определение "SSH-ключ" составное, так как на самом деле это два ключа — открытый и закрытый. На узле A создаются и хранятся оба ключа, а на узел B передается только копия публичного SSH-ключа, что позволяет подключаться к узлу B с узла A.

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

  • id_rsa — закрытый ключ,
  • id_rsa.pub — публичный (открытый) ключ.

В чем же разница открытого и закрытого ключа?

Открытые и закрытые SSH-ключи

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

Закрытый (приватный) SSH-ключ — это ключ к данным. Он расшифровывает сами сообщения. Хранится он на устройстве, которое будет подключаться к удаленному узлу (на котором находится открытый ключ). Приватный ключ ни в коем случае нельзя передавать в чужие руки, в том числе через мессенджеры или файлообменники, во избежание утечки информации и персональных данных. Также рекомендуем сразу установить пароль на закрытый ключ, чтобы обеспечить ему дополнительную защиту.

Как работает SSH-авторизация?

Давайте представим, что Selectel — это сервер, а вы — клиент. Вы хотите подключиться к нам с использованием SSH-ключа. Предварительно вы уже создали пару ключей и передали публичный ключ нам. Алгоритм взаимодействия будет следующим:

  1. Вы должны изъявить свое желание подключиться к нам, то есть отправить запрос на подключение по TCP-порту.
  2. В случае установки TCP-соединения мы бмениваемся информацией о версиях наших SSH-протоколов. С помощью этой информации можно понять, какую именно конфигурацию (версию протоколов и алгоритмы работы) использовать. Самостоятельно узнать версию OpenSSH можно с помощью команды ssh -V.
  3. После согласования мы (сервер) направляем вам (клиенту) открытый ключ. Теперь уже вы решаете, доверять такому ключу или нет. В случае положительного ответа мы с вами генерируем сеансовый ключ, который будет использоваться для симметричного шифрования канала. Этот ключ существует, только пока существует канал (текущая сессия).
  4. Теперь следует аутентифицировать вас. Для этого вы отсылаете нам свой открытый ключ. Мы в свою очередь проверяем его со своим списком открытых SSH-ключей. Если совпадение найдено, мы генерируем случайное число, шифруем его открытым ключом и отправляем обратно. Вы как клиент расшифровываете сообщение закрытым ключом и отправляете полученные данные нам. В случае совпадения присланного числа с первоначальным аутентификация признается успешной.

ssh-auth

Поздравляем! Теперь вам открыт доступ на сервер.

Создание SSH-ключа

Параметры утилиты ssh-keygen

В Linux для создания SSH-ключей используется команда ssh-keygen. Далее приведены наиболее популярные параметры для этой команды и их описание.

По умолчанию ssh-keygen использует в качестве параметра -t именно RSA, так как этот алгоритм обеспечивает наилучшую совместимость из всех, но требует большего размера ключа для обеспечения достаточной безопасности. Длина ключа по умолчанию составляет 3072 бит, но вы можете самостоятельно задать его размер от 1024 до 16384 бит с помощью опции -b команды ssh-keygen.

-C comment

Создание нового комментария. Например, одной из самых известных команд является добавление комментария с информацией о том, кто, на какой машине и когда создал ключ:

ssh-keygen -C "$(whoami)@$(uname -n)-$(date -I)"
-p

Если указать данный параметр при вводе ssh-keygen, то вам будет предложено изменить старую секретную фразу на новую. Ввод команды будет выглядеть следующим образом:

ssh-keygen -p

Также вы можете задать все параметры для изменения секретной фразы сразу:

ssh-keygen -p [-P old_passphrase] [-N new_passphrase] [-f keyfile]
-t type

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

ssh-keygen -t ?
-v

Подробный режим. ssh-keygen будет печатать отладочные сообщения о ходе выполнения. Несколько опций -v увеличивают степень подробности информации (максимум 3).

Утилиты для создания SSH-ключа

Далее мы создадим RSA ключ, добавим публичную часть на ВМ и подключимся с помощь него по SSH к ВМ. Сделаем это тремя способами:

  • С помощью терминала и утилит Linux.
  • С помощью утилит, предоставляемых PuTTY;
  • С помощью SSH-агента PowerShell;
Генерация SSH-ключей в Linux

Процесс создания SSH-ключей на базе Linux предельно прост. Вам необходимо лишь указать некоторые параметры, которые мы опишем далее.

Мы будем создавать ключ RSA. При вводе команды ssh-keygen опцию -t RSA можно не указывать явно, так как RSA является алгоритмом по умолчанию.

ssh-keygen
Generating public/private RSA key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):

В последней строке вам предлагается выбрать путь, куда будут сохранены ключи. Если оставить поле пустым, будут созданы файлы с именами id_rsa.pub и id_rsa.

Enter passphrase (empty for no passphrase):

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

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

Как мы упоминали ранее, кодовую фразу можно будет установить (или заменить) самостоятельно, введя ssh-keygen -p, когда ключ уже будет создан:

ssh-keygen-1

Созданные файлы хранятся в директории /home/<имя пользователя>/.ssh/.

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

cat ~/.ssh/id_rsa.pub

ssh-keygen-2

Генерация SSH-ключей в PuTTY

Если вы хотите создать SSH-ключи на базе ОС Windows, самым популярным решением для этого будет использование программного обеспечения Putty. Скачать его можно с официального сайта по ссылке (актуальная версия на момент написания материала — 0.79, released on 2023-08-26). После установки программы вам будет доступно несколько .exe файлов.

Для создания SSH-ключей откройте puttygen.exe:

puttygen-1

Выберите необходимый тип ключа и задайте его размер. Мы будем использовать RSA с длиной 2048:

puttygen-2

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

puttygen-3

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

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

puttygen-4

Для публичного используйте имя id_rsa.pub. Для приватного id_rsa.ppk.

Putty сохраняет закрытые ключи с разрешением .ppk, что означает, что такой ключ можно будет использовать только с Putty. Чтобы сохранить секретный ключ в формате, пригодном для OpenSSH, нужно во вкладке Конвертация выбрать пункт "Экспортировать ключ в формате OpenSSH (новый формат)" и указать расположение нового файла (старый формат при конвертации из .pkk в OpenSSH сохраняет не все поля — например, комментарий):

puttygen-5

Посмотреть публичный ключ можно в окне PuTTY Key Generator. Скопировать можно через правую кнопку мыши, вызывав тем самым контекстное меню:

puttygen-6

puttygen-7

Генерация SSH-ключей в Windows с помощью OpenSSH

Не так давно в ОС Windows добавили возможность использования инструментов OpenSSH. Пакет добавлен в ОС, начиная с Windows 10 и Windows Server 2019.

Установить клиент OpenSSH можно с помощью следующей команды в PowerShell (PowerShell нужно запустить от имени администратора):

Add-WindowsCapability -Online -Name OpenSSH.Client

powershell-ssh-keygen-1

powershell-ssh-keygen-2

Проверить статус компонента можно командой (также от администратора):

Get-WindowsCapability -Online | ? Name -like 'OpenSSH.Client*'

powershell-ssh-keygen-3

Если в ответе команды статус Installed, то загрузка выполнена успешно.

Генерация SSH-ключей происходит таким же образом, как и в ОС Linux, с помощью ssh-keygen (команды нужно выполнять от имени пользователя):

powershell-ssh-keygen-4

Созданные ключи можно найти в папке C:\Users\<имя пользователя>\.ssh, если она не была изменена при генерации. Посмотреть ключ можно с помощью команды cat:

powershell-ssh-keygen-5

Копирование открытого ключа на сервер

Linux

Данный метод подойдет тем, чья ОС поддерживает команду SSH-Copy-ID, и удаленный сервер имеет доступ по SSH без ключа. Если это не так, попробуйте использовать второй или третий способ.

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

ssh-copy-id {USERNAME}@{IP-ADDRESS-OR-FQDN} -p {PORT}

Замените {IP-ADDRESS-OR-FQDN} на IP-адрес или полное доменное имя (полное доменное имя) сервера, на которое вы хотите скопировать открытый ключ, {USERNAME} - имя пользователя, к которому хотите подключиться, {PORT} - порт SSH (по умолчанию 22).

Обратите внимание на последние строки вывода:

linux-ssh-copy-1

Наш клиент запрашивает разрешение на продолжение подключения к удаленному узлу, так как встречает его впервые. Необходимо ввести yes. После успешного подключения ключи будут добавлены и мы увидим приглашение к вводу пароля. Вводим пароль и получаем подтверждение о том, что теперь мы можем подключиться к удаленному узлу Linux с помощью команды ssh:

linux-ssh-copy-2

Чтобы проверить, действительно ли скопировался открытый ключ, найдем искомый файл authorized_keys на удаленном узле и посмотрим его содержимое, так как именно в него добавляются открытые SSH-ключи. Содержится он в домашней директории в скрытой папке .ssh. Посмотреть его можно так:

cat ~/.ssh/authorized_keys

linux-ssh-copy-3

PuTTY

Альтернативный способ показан в статье. В нем используется только putty.exe без Pageant.

Скопируйте публичный ключ, который отображается в puttygen.exe:

putty-ssh-copy-1

Затем следует любым доступным вам способом подключиться к удаленному серверу, куда необходимо скопировать открытый SSH-ключ.

В домашней директории создайте файл putty_id_rsa.pub. Сделать это можно с помощью редактора Nano:

nano putty_id_rsa.pub

Далее вставьте содержимое из буфера обмена с помощью нажатия правой клавишы мыши в окне или с помощь комбинации клавиш shift+insert:

putty-ssh-copy-2

Сохраните содержимое с помощью комбинаций ctrl+x. Подтвердите, что вы хотите сохранить содержимое из буфера на диск нажав на клавишу y:

putty-ssh-copy-3

Далее подтвердите с помощью клавиши enter путь сохранения:

putty-ssh-copy-4

Затем требуется добавить наш публичный ключ в authorized_keys.

cat putty_id_rsa.pub >> ~/.ssh/authorized_keys

С помощью cat ~/.ssh/authorized_keys проверьте, что ключ был действительно добавлен в authorized_keys:

putty-ssh-copy-5

Мы уже скопировали открытый SSH-ключ, сгенерированный с помощью Putty, на удаленный узел. Теперь необходимо произвести подключение.

Для этого откройте Pageant и добавьте туда приватный ключ, сгенерированный с помощью puttygen.exe:

putty-ssh-copy-6

Pageant по умолчанию после запуска прячется в значках панели управления рядом с часами:

putty-ssh-copy-7

Вызовите контекстное меню с помощью правой кнопки мышки и выберите пункт "Add key":

putty-ssh-copy-8

Откройте ключ в формате .ppk:

putty-ssh-copy-9

Чтобы убедиться, что ключ был добавлен, необходимо в том же контекстном меню Pageant выбрать пункт "View Keys":

putty-ssh-copy-10

Откроется окно с активным ключами:

putty-ssh-copy-11

Теперь можно установить сессию, которая будет для подключения использовать наш приватный ключ. В контекстном Pageant меню выберите "New Session":

putty-ssh-copy-12

Введите IP-адрес удаленного узла, имя пользователя и порт для подключения, а также проверьте, что в качестве типа подключения выбран SSH:

putty-ssh-copy-13

Нажмите "Open". При первом подключении вам потребуется подтвердить, что удаленный узел вам известен и его можно добавить в известные:

putty-ssh-copy-14

При успешном подключении появится приглашение к вводу команд:

putty-ssh-copy-15

PowerShell

Материал основан на статье Windows 10 OpenSSH Equivalent of ssh-copy-id | Christopher Hart.

Альтернативный поход смотрите в статье.

Далее мы используем приведенную ниже онлайн-команду PowerShell, чтобы скопировать содержимое открытого ключа id_rsa.pub на удаленное устройство Linux. Замените {IP-ADDRESS-OR-FQDN} на IP-адрес или полное доменное имя (полное доменное имя) сервера, на которое вы хотите скопировать открытый ключ, {USERNAME} - имя пользователя, к которому хотите подключиться, {PORT} - порт SSH (по умолчанию 22):

type $env:USERPROFILE\.ssh\id_rsa.pub | ssh {USERNAME}@{IP-ADDRESS-OR-FQDN} -p {PORT} "cat >> .ssh/authorized_keys"

Далее у вас спросят пароль от пользователя. Пример того, как выполняется копирование ключа:

powershell-ssh-copy-1

Убедитесь, что вы можете подключиться по SSH к удаленному устройству Linux с помощью команды ssh. Ниже показан пример подключения к удаленному устройству Linux по IP-адресу. Обратите внимание, что нам не нужно было вводить пароль, чтобы установить SSH-подключение к удаленному устройству Linux:

powershell-ssh-copy-2

Устранение неполадок

Возможные неполадки и способы их решения представлены в статье Авторизация на базе ключей SSH | Академия Selectel.

Часть 2. Создание пользователя

Основано на материалах:

В Ubuntu-системе, да и в принципе, в любой другой Linux-системе, обязательно есть один привилегированный пользователь — root.

sudo — утилита, которая дает привилегии root для выполнения административных операций.

Простым языком команда sudo позволяет пользователям Ubuntu выполнять команды от имени суперпользователя root, либо других пользователей.

Создание пользователя с привилегиями sudo

Сперва, при помощи команды adduser создаем нового пользователя.

sudo adduser *имя_пользователя*

Для лабораторной работы имя в качестве имени пользователя используйте имя и фамилию. Например:

sudo adduser aladindv

При создании пользователя будет предложено ввести пароль и другие необязательные данные (Имя, Номер комнаты, Телефон и тд), указываем их по своему желанию.

Обращаем внимание, что только суперпользователь с правами root имеет право добавлять новых пользователей в Ubuntu. Следовательно, запускаем команду adduser с sudo:

add-sudo-user-1

Добавляем пользователя в группу sudo

Следующим шагом является добавление созданного пользователя в группу sudo, которая выдаст пользователю все привилегии sudo:

sudo adduser *имя_пользователя* sudo

Например:

sudo adduser aladindv sudo

При успешном добавлении в группу Sudo получим уведомление в терминале Ubuntu: "Добавление пользователя имя в группу sudo. Готово.":

add-sudo-user-2

Отлично! Пользователь добавлен в группу sudo, теперь проверим, есть ли у него привилегии sudo.

Тестирование пользователя sudo

Переключаемся на вновь созданного пользователя (пользователь с именем admin в нашем случае) при помощи команды su:

su - *имя_пользователя*

После того, как мы войдем в систему под новым пользователем, мы получим сообщение, как правильно использовать команду sudo:

To run a command as administrator (user "root"), use "sudo <command>".

Данное уведомление в терминале будет означает, что пользователь находится в группе sudo:

add-sudo-user-3

Добавление публичного ключа для пользователя

Создадим файл authorized_keys для нового пользователя. Сделаем это так, как показано в главе про копирование публичного ключа с использованием PuTTY

mkdir -p ~/.ssh

Далее создадим файл authorized_keys и добавим публичный ключ:

nano ~/.ssh/authorized_keys

add-sudo-user-4

Тестируем подключение через SSH к новому пользователю, например:

ssh aladindv@192.168.50.140

add-sudo-user-5

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

Часть 3. Использование горячих клавиш

Материал основан на статье 10 горячих клавиш Linux для начинающих пользователей | 1cloud.

tab – автодополнение команд и путей

Достаточно начать вводить первые буквы команды или пути и нажать tab. Строка будет автодополнена. Это делает набор команд и путей к файлам намного быстрее:

hot-keys-tab

Последующие нажатия на tab будут вызывать альтернативные варианты автодополнения.

Стрелки вверх и вниз – выбор ранее вызванных команд

Если нужно несколько раз применить одну и туже команду или утилиту — достаточно воспользоваться стрелками вверх и вниз:

hot-keys-up-down

Стрелками можно перемещаться по истории, выполненных команд. Альтернатива – сочетания клавиш ctrl+p и ctrl+n.

ctrl+c – немедленное прекращение работы программы

Нажатие ctrl+c посылает, выполняемой команде сигнал SIGINT, и если программа не обработает его особым образом – работа программы будет завершена:

hot-keys-ctrl-c

Некоторые программы, получив сигнал SIGINT, перед завершением выполняют операции по сохранению данных. Например, текстовый редактор Vim.

ctrl+z – перевод, выполняемой программы в фоновый режим

Перевод программы в фоновый режим позволяет высвободить терминал для выполнения других задач. Программу можно запустить сразу в фоновом режиме, если в конец строки поместить амперсанд (&). Например, можно запустить несколько утилит ping и свернуть их, и параллельно выполнять другие задачи.

Чтобы посмотреть, свернутые программы достаточно выполнить команду: jobs.

Если свернута одна программа, тогда при вводе команды jobs – её работа будет автоматически возобновлена, а если свернуты несколько программ, тогда jobs выведет на экран список свернутых программ.

Для вызова нужной программы из фонового режима – введите команду fg и порядковый номер свернутой программы. Например: fg 2.

Чтобы повторно свернуть программу — нажмите ctrl+z:

hot-keys-ctrl-z

ctrl+d – выход из приложений

Сочетание ctrl+d работает аналогично команде exit и позволяет выйти только из терминальных утилит. Например, ctrl+d прекратит работу, запущенного скрипта Python или интерпретатора:

hot-keys-ctrl-d

С помощью сочетание клавиш ctrl+d также можно выйти из утилиты sudo, но остановить работу утилиты ping или выйти из текстового редактора Vim — не получится.

ctrl+l – очистка окна терминала

Если информации в окне терминала становится слишком много и она начинает мешать, то можно очистить терминал сочетанием клавиш ctrl+l:

hot-keys-ctrl-l

Того же эффекта можно достичь командой clear:

hot-keys-clear

ctrl+a и ctrl+e – перемещение внутри строки

Перемещаться по строке можно посимвольно (, ), пословно (ctrl+← и ctrl+→), а также в крайние позиции строки: в начало – ctrl+a, а в конец – ctrl+e:

hot-keys-ctrl-a-ctrl-e

Быстрое перемещение по строкам сильно помогает при редактировании сложных сочетаний нескольких команд с разнообразными ключами.

ctrl+x, ctrl+e – копирование строки в текстовый редактор

Если вам нужно скопировать и сохранить длинную или сложную команду где-то в файле, то сделать это можно с помощью последовательности сочетаний клавиш ctrl+x затем ctrl+e:

hot-keys-ctrl-a-ctrl-e

По умолчанию откроется текстовый редактор Nano, если в переменной EDITOR не указан иной редактор.

ctrl+h, ctrl+d – посимвольное удаление

Чтобы удалить символ перед курсором — нажмите ctrl+h, а если нужно удалить символ после курсора — ctrl+d или del:

hot-keys-ctrl-h-ctrl-d

Привычный многим прием выделения группы символов с нажатием левого shift и нажатием стрелок вправо и влево — в терминале не работает.

ctrl+u, ctrl+k – удаление всех символов до курсора и после

Для удаления всех символов от начала строки до курсора — нажмите сочетание клавиш ctrl+u.

hot-keys-ctrl-u

Если нужно удалить все символы от курсора до конца строки — воспользуйтесь сочетанием ctrl+k.

hot-keys-ctrl-k

Часть 4. Использование базовых команд

Материал основан на статье 10 команд Linux для начинающих пользователей | 1cloud.

cd – переход между директориями

cd — это одна из самых часто используемых команд, так как невозможно работать не перемещение по директориям. Синтаксис команды очень прост:

cd

Чтобы перейти в нужный каталог — необходимо ввести его полный путь, а если вы хотите перейти в подкаталог из каталога — достаточно ввести его название. Например, мы хотим перейти в каталог /etc/, тогда команда будет выглядеть так:

cd /etc/

Команда имеет множество удобных шорткодов для более быстрой навигации:

  • cd ~ – перемещение в домашний каталог пользователя
  • cd .. – перемещение на один каталог вверх
  • cd - – возвращение в предыдущей каталог
  • cd / – перемещение в корневую директорию

Если вы запутались или вам сложно сориентироваться, в какой директории вы сейчас находитесь – воспользуйтесь командой pwd. Она выведет полный путь директории.

pwd – отображение полного пути до текущей рабочей директории

Команда pwd возвращает абсолютный (полный) путь, который является путём всех каталогов, начинающийся с косой черты (/). Синтаксис команды:

pwd

Пример вывода полного пути:

aladindv@ubuntu:/etc$ pwd
/etc

Команда pwd не имеет никаких ключей. Если мы хотим просмотреть содержимое директории, в которой находимся нам нужно воспользоваться командой ls.

ls - отображение содержимого директории

Команда ls выводит содержимое каталога, в котором сейчас находится пользователь. Синтаксис команды:

ls

Вы можете просмотреть содержимое любого каталога, к которому знаете путь. Например, команда ls /etc/ выведет на экран содержимое каталога etc:

ls /etc/

Команда ls по сравнению с pwd имеет множество полезных ключей, которые меняют форму вывода команды.

Ключ — это специальный параметр команды или терминальной утилиты. Ключи указываются между названием команды или утилиты и файлом, который передаётся на вход: команда -ключ название файла.

Например, при указании ключа -R, ls будет выводить содержимое вложенных директорий:

aladindv@ubuntu:~$ ls -R
.:
test

./test:

По умолчанию ls не отображает скрытые файлы, чтобы ls начал отображать скрытые файлы, его надо запустить с ключом -a. Пример вывода содержимого домашней директории:

aladindv@ubuntu:~$ ls -a
. .bash_history .bashrc .local .python_history .sudo_as_admin_successful
.. .bash_logout .cache .profile .ssh test

Обратите внимание, в начале списка, выведены объекты директории:

  • Точка – это псевдоним пути к текущей директории
  • Две точки – это псевдоним родительской директории (директория на уровень выше)

Следующий ключ -l. Используя этот ключ, ls выведет список файлов и каталогов с подробной информацией о пользователях, правах доступа, размерах, владельцах и т. д. Пример вывода с ключом -l:

aladindv@ubuntu:~$ ls -l
total 4
drwxrwxr-x 2 aladindv aladindv 4096 окт 3 08:18 test

Ключи могут быть использованы одновременно. Например, чтобы вывести всё содержимое директории, вместе со скрытыми объектами, команду можно указать так: ls -la:

aladindv@ubuntu:~$ ls -la
total 44
drwxr-x--- 6 aladindv aladindv 4096 окт 3 08:18 .
drwxr-xr-x 4 root root 4096 окт 2 21:03 ..
-rw------- 1 aladindv aladindv 142 окт 2 21:45 .bash_history
-rw-r--r-- 1 aladindv aladindv 220 окт 2 21:03 .bash_logout
-rw-r--r-- 1 aladindv aladindv 3771 окт 2 21:03 .bashrc
drwx------ 2 aladindv aladindv 4096 окт 2 21:23 .cache
drwxrwxr-x 3 aladindv aladindv 4096 окт 2 21:34 .local
-rw-r--r-- 1 aladindv aladindv 807 окт 2 21:03 .profile
-rw------- 1 aladindv aladindv 30 окт 2 22:30 .python_history
drwxrwxr-x 2 aladindv aladindv 4096 окт 2 21:34 .ssh
-rw-r--r-- 1 aladindv aladindv 0 окт 2 21:45 .sudo_as_admin_successful
drwxrwxr-x 2 aladindv aladindv 4096 окт 3 08:18 test

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

cat, head, sed, tail – вывод содержимого файла

Перед тем, как как пробовать эти команды, создадим в домашней директории тестовый файл:

echo "Sun of the sleepless! Melancholy star!
Whose tearful beam glows tremulously far,
That show’st the darkness thou canst not dispel,
How like art thou to joy remember’d well!

So gleams the past, the light of other days,
Which shines, but warms not with its powerless rays;
A night-beam Sorrow watcheth to behold,
Distinct, but distant — clear, but oh, how cold!" >> test.txt

Рассмотрим сразу набор команд, которые используются для вывода содержимого файла в командной строке. Начнем с команды cat, которая используется для просмотра текстовых файлов или скриптов. Синтаксис команды:

cat

Чтобы просмотреть содержимое файла – укажите его полное имя после команды cat:

aladindv@ubuntu:~$ cat test.txt
Sun of the sleepless! Melancholy star!
Whose tearful beam glows tremulously far,
That show’st the darkness thou canst not dispel,
How like art thou to joy remember’d well!

So gleams the past, the light of other days,
Which shines, but warms not with its powerless rays;
A night-beam Sorrow watcheth to behold,
Distinct, but distant — clear, but oh, how cold!

Мы открыли тестовый файл с помощью команды cat.

Команда cat обладает множеством полезных ключей и функций. Например, ключ -n выводит содержимое файла с нумерацией строк:

aladindv@ubuntu:~$ cat -n test.txt
1 Sun of the sleepless! Melancholy star!
2 Whose tearful beam glows tremulously far,
3 That show’st the darkness thou canst not dispel,
4 How like art thou to joy remember’d well!
5
6 So gleams the past, the light of other days,
7 Which shines, but warms not with its powerless rays;
8 A night-beam Sorrow watcheth to behold,
9 Distinct, but distant — clear, but oh, how cold!

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

aladindv@ubuntu:~$ head -2 test.txt
Sun of the sleepless! Melancholy star!
Whose tearful beam glows tremulously far,

Чтобы вывести последние строки файла — используют команду tail с указанием количества строк и названия файла:

aladindv@ubuntu:~$ tail -4 test.txt
So gleams the past, the light of other days,
Which shines, but warms not with its powerless rays;
A night-beam Sorrow watcheth to behold,
Distinct, but distant — clear, but oh, how cold!

Для вывода произвольного количества строк из файла применяется команда sed с указанием диапазона строк в формате: 'начало, конец !d':

aladindv@ubuntu:~$ sed '2,3!d' test.txt
Whose tearful beam glows tremulously far,
That show’st the darkness thou canst not dispel,

Для более наглядного примера напишем ещё несколько строк. А лучше вставим список. Команды cat, head, sed и tail позволяют выводить информацию в терминал по определенным условиям. Однако часто нужно найти конкретную информацию в файле или файл целиком. Для этого существует команда — grep.

grep — поиск файлов в директориях и строк в файлах

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

Чаще всего grep используется в сочетании с другими командами, передавая на вход данные через оператор потока PIPE — |. Например, следующая цепочка команд (конвейер) найдёт среди множества файлов все файлы, в названии которых есть слово vdc с расширением .png и выведет на экран первые 3 файла:

ls -l | grep .png | head -3
aladindv@ubuntu:~$ ls -l | grep .txt | head -3
-rw-rw-r-- 1 aladindv aladindv 374 окт 3 08:25 test.txt

Искать можно как файлы и директории, так и строки внутри файлов. Например, найдёт строку в тестовом текстовом файле test.txt, содержащую слово "Whose":

aladindv@ubuntu:~$ cat test.txt | grep Whose
Whose tearful beam glows tremulously far,

Если нужно найти словосочетание с пробелами, то оно берется в кавычки:

aladindv@ubuntu:~$ cat test.txt | grep "Whose tearful"
Whose tearful beam glows tremulously far,

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

aladindv@ubuntu:~$ grep "Whose tearful" test.txt
Whose tearful beam glows tremulously far,

Теперь посмотрим на команды, которые позволяют проводить манипуляции с файлами и директориями.

touch, cp, mv, rm — создание, копирование, удаление и перемещение файлов

Создать файл в Linux можно несколькими путями:

  1. Запустить нужную терминальную утилиту и после сохранить готовый файл;
  2. Создать пустой файл командой touch и после его открыть в нужной утилите.

Для создания пустого файла применяется команда touch, которой нужно в качестве аргумента передать название и расширение файла:

touch awesome.txt

Чтобы создать копию файла — применяется команда cp, с указанием нового имени файла. Например:

cp test.txt copied_test.txt

Если файл нужно скопировать в другую директорию — ее нужно указать в конце команды:

cp test.txt /home/

Команда cp имеет множество полезных ключей, которые могут пригодиться. Вот некоторые из них:

  • -f — перезаписать существующий файл при копировании
  • -i — спросить нужно ли перезаписывать существующий файл
  • -r — рекурсивное копирование директории (подробнее в разделе о работе с директориями)

Ключей, конечно же, намного больше, но для базовых задач по копированию — их более чем достаточно.

Для перемещения файлов между директориями применяется команда mv:

mv test.txt /home/

Часто команду mv используют для переименования файлов. В этом случае синтаксис команды будет таким:

mv test.txt new_nest.txt

Чтобы удалить файл — применяется команда rm:

rm test.txt

Далее рассмотрим команды для работы с директориями.

mkdir, cp, rm — создание, копирование, удаление и перемещение директорий

Для создания директорий используют команду mkdir, с указанием названия новой директории. Например, мы создадим директорию folder в /home:

mkdir folder

Для более наглядной демонстрации последующих команд копирования и удаления, создадим в директории folder несколько пустых файлов командой touch, применив небольшой лайфхак — мы автоматизируем процесс создания файлов с помощью такой конструкции:

touch some_file_{1..10}.txt

Теперь скопируем директорию folder командой cp. Если директория содержит файлы, тогда необходимо указать ключ -r (рекурсивное копирование):

cp -r folder/ copied_folder

Для удаления директории, содержащий файлы применяют команду rm с ключом -r:

rm -r folder

Переместить директорию со всем содержимым можно командой mv. Сначала указывается переносимый каталог, а затем каталог для переноса:

mv folder /home

Работа с файлами и директориями не ограничивается их созданием, удалением и перемещением. Часто необходимо изменить права доступа к файлам и назначить им владельца.

chmod — установка прав на файл

Для работы с правами доступа используется команда chmod. Синтаксис команды:

chmod права файл или папка

Просмотреть права можно командой ls с ключом -l:

aladindv@ubuntu:/home$ ls -ls
total 8
4 drwxr-x--- 5 aladin aladin 4096 окт 2 17:37 aladin
4 drwxr-x--- 8 aladindv aladindv 4096 окт 3 08:38 aladindv

Если добавить еще ключ -a:

aladindv@ubuntu:/home$ ls -lsa
total 16
4 drwxr-xr-x 4 root root 4096 окт 2 21:03 .
4 drwxr-xr-x 19 root root 4096 окт 1 15:52 ..
4 drwxr-x--- 5 aladin aladin 4096 окт 2 17:37 aladin
4 drwxr-x--- 8 aladindv aladindv 4096 окт 3 08:38 aladindv

Указать изменения в правах на файл через chmod можно двумя разными форматами записей:

Первый формат записи — символьный. В нем используются следующие символы:

  • u — пользователь-владелец
  • g — группа-владелец
  • o — другие пользователи
  • a — все пользователи
  • r — права на чтение
  • w — права на запись
  • x — права на выполнение
  • + — добавить права
  • - — отменить права
  • = — заменить набор прав

Пример добавления прав в символьном формате записи:

aladindv@ubuntu:~$ ls -l
total 16
-rw-rw-r-- 1 aladindv aladindv 0 окт 3 08:38 awesome.txt
drwxrwxr-x 2 aladindv aladindv 4096 окт 3 08:36 folder
drwxrwxr-x 2 aladindv aladindv 4096 окт 3 08:36 foler
drwxrwxr-x 2 aladindv aladindv 4096 окт 3 08:18 test
-rw-rw-r-- 1 aladindv aladindv 374 окт 3 08:25 test.txt
aladindv@ubuntu:~$ chmod u+rwx,g+rwx,a+rwx test.txt
aladindv@ubuntu:~$ ls -l
total 16
-rw-rw-r-- 1 aladindv aladindv 0 окт 3 08:38 awesome.txt
drwxrwxr-x 2 aladindv aladindv 4096 окт 3 08:36 folder
drwxrwxr-x 2 aladindv aladindv 4096 окт 3 08:36 foler
drwxrwxr-x 2 aladindv aladindv 4096 окт 3 08:18 test
-rwxrwxrwx 1 aladindv aladindv 374 окт 3 08:25 test.txt

Пример отмены прав в символьном формате записи:

chmod u-rwx,g-rwx,a-rwx test.txt

Если нужно изменить сразу набор прав, то используется следующая запись:

chmod u=rwx,g=rwx,a=rwx test.txt

Если нужно некоторые права добавить, а некоторые отменить, то вместо права указывается прочерк — -:

chmod u=r-x,g=rw-,a=--- test.txt

Второй формат записи — числовой. Здесь права представляются не в виде букв, а в виде восьмеричной записи групп значений:

  • r4
  • w2
  • x1

Так запись формата rwxrwxrwx можно представить, как сумму значений прав, разбитых по группам: (4+2+1), (4+2+1), (4+2+1) = 777. Чаще всего для изменения прав используют именно такой формат записи.

Пример добавления прав в цифровом формате записи:

chmod 777 test.txt

Этой записью мы установили максимальные права доступа для всех. Например, если нужно запретить исполнение файла — устанавливается значение 6 (r4 + w2) в нужную группу прав. Запретим исполнение для всех:

chmod 666 test.txt

Если нужно отменить права сразу на группу прав — устанавливается 0. Например, отменим все права на файл для владельца-пользователя:

chmod 066 test.txt

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

chown, chgrp — смена владельца файла и группы

В Linux каждый файл и директория имеют своего владельца и группу владельца. Назначаются владельцы при создании объектов. Такая система сделана для того, чтобы разделить права доступа между пользователями.

Напомним, что узнать владельца можно командой ls -l. А сменить владельца и группу владельца можно командой chown. Синтаксис команды:

chown новый пользователь:новая группа файл или папка

Например, изменим пользователя и группу пользователя для файла test.txt на root-пользователя:

chown root:root test.txt

Для изменения пользователя у директории и всех вложенных объектов применяется команда chown с ключом -R:

chown root:root ./folder

Существует команда, которая изменяет только группу владельца — chgrp. Синтаксис команды:

chgrp название группы владельца файл или директория

Как изменить владельца или группу владельца мы рассмотрели, теперь ознакомимся с командами для создания пользователя и групп в Linux.

useradd, groupadd — создание пользователя, группы и добавление пользователя в группу

Создать пользователя или изменить права уже существующим пользователям в Linux можно с помощью команды useradd. Команда позволяется также создать домашний каталог и скопировать в него системные файлы. Синтаксис команды:

useradd опции имя_пользователя

Команда useradd имеет множество опций. Мы приведем только некоторые из них:

  • -D — отобразить параметры, которые будут применены по умолчанию при создании нового пользователя
  • -p — задать пароль пользователя
  • -s — задать командную оболочку для пользователя
  • -g — основная группа пользователя
  • -G — дополнительная группа пользователя

Ознакомимся сначала с дефолтными условиями создания нового пользователя:

useradd -D

Команда вернет информацию следующего вида:

aladindv@ubuntu:~$ useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/sh
SKEL=/etc/skel
CREATE_MAIL_SPOOL=no

Если стандартные условия вас устраивают, то создать нового пользователя можно, указав только два параметра: имя пользователя и пароль.

useradd -p porol new_user

По умолчанию у дефолтной группы довольно ограниченные права, чтобы новые пользователи могли получить доступ к системным ресурсам, можно указать ключ -G с системными ресурсами. Например:

useradd -G adm,cdrom -p parol new_user

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

Создадим группу new_users:

groupadd new_users

Теперь с помощью команд cat и grep проверим, что группа была создана:

aladindv@ubuntu:~$ sudo groupadd new_users
[sudo] password for aladindv:
aladindv@ubuntu:~$ cat /etc/group | grep new_users
new_users:x:1002:

А если требуется получить список всех групп, то просто воспользуйтесь командой cat без grep:

aladindv@ubuntu:~$ cat /etc/group
root:x:0:
daemon:x:1:
bin:x:2:
sys:x:3:
adm:x:4:syslog,aladin
...

Команда вернёт список названий групп. Здесь стоит поэкспериментировать с объединением команд для работы с выводом на экран через оператор |. Это позволит вам лучше понять принцип работы каждой из команд.

history — история команд Linux

Материал основан на статье История команд Linux | Losst

Большинство задач, связанных с историей команд, мы будем выполнять либо с помощью команды history, либо с помощью оболочки. В истории хранится последняя 1000 команд, которые вы выполняли. Чтобы посмотреть всю историю для этого терминала просто запустите команду history без параметров:

history

history-1

Команда history linux имеет очень простой синтаксис:

history опции файл

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

  • -c - очистить историю;
  • -d - удалить определенную строку из истории;
  • -a - добавить новую команду в историю;
  • -n - скопировать команды из файла истории в текущий список;
  • -w - перезаписать содержимое одного файла истории в другой, заменяя повторяющиеся вхождения.

Наиболее полезной для нас из всего этого будет опция -c, которая позволяет очистить историю команд linux:

history -c

Так вы можете посмотреть только последние 10 команд:

history 10

Если вы хотите выполнить поиск по истории bash, можно использовать фильтр grep. Например, найдем все команды ping:

aladindv@ubuntu:~$ history | grep ping
100 history | grep ping

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

aladindv@ubuntu:~$ ping ya.ru
PING ya.ru (77.88.55.242) 56(84) bytes of data.
64 bytes from ya.ru (77.88.55.242): icmp_seq=1 ttl=246 time=10.4 ms
64 bytes from ya.ru (77.88.55.242): icmp_seq=2 ttl=246 time=10.2 ms
^C
--- ya.ru ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 10.197/10.322/10.448/0.125 ms
aladindv@ubuntu:~$ !!
ping ya.ru
PING ya.ru (5.255.255.242) 56(84) bytes of data.
64 bytes from ya.ru (5.255.255.242): icmp_seq=1 ttl=249 time=6.75 ms
64 bytes from ya.ru (5.255.255.242): icmp_seq=2 ttl=249 time=6.48 ms
^C
--- ya.ru ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 6.477/6.614/6.752/0.137 ms

Также можно выполнить одну из предыдущих команд указав ее номер !-2:

aladindv@ubuntu:~$ history | grep ping
141 history | grep ping
144 ping ya.ru
145 history | grep ping
aladindv@ubuntu:~$ !144
ping ya.ru
PING ya.ru (5.255.255.242) 56(84) bytes of data.
64 bytes from ya.ru (5.255.255.242): icmp_seq=1 ttl=249 time=14.0 ms
64 bytes from ya.ru (5.255.255.242): icmp_seq=2 ttl=249 time=6.53 ms
64 bytes from ya.ru (5.255.255.242): icmp_seq=3 ttl=249 time=6.54 ms
^C
--- ya.ru ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 6.529/9.027/14.014/3.526 ms

scp копирование файлов

Материал основан на статье Копирование файлов scp | Losst

Команда scp - это утилита, которая работает по протоколу SSH, а значит, все что вам нужно для передачи файла на компьютер, это чтобы на нем был запущен SSH сервер, а также вы должны знать логин и пароль для подключения к нему. С помощью команды scp вы можете не только перемещать файлы между локальной и удаленной системой, но и между двумя удаленными системами. Для этого тоже будет достаточно знать пароли от них. И в отличие от Rsync вам не нужно авторизоваться на одном из серверов.

Рассмотрим общий синтаксис команды:

$ scp опции пользователь1@хост1:файл пользователь2@хост2:файл

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

  • -1 - использовать протокол SSH1;
  • -2 - использовать протокол SSH2;
  • -B - пакетный режим для передачи нескольких файлов;
  • -C - включить сжатие;
  • -l - установить ограничение скорости в кбит/сек;
  • -o - задать нужную опцию SSH;
  • -p - сохранять время модификации;
  • -r - рекурсивное копирование директорий;
  • -v - более подробный режим.

Пример:

aladin@MacBook-Pro-Dmitrij ~/Desktop $ scp history-1.png aladindv@192.168.50.140:~
history-1.png 100% 58KB 5.4MB/s 00:00
aladin@MacBook-Pro-Dmitrij ~/Desktop $ ssh aladindv@192.168.50.140
aladindv@ubuntu:~$ ls
awesome.txt folder foler history-1.png test test.txt

Пример копирования папки (ключ -r):

aladin@MacBook-Pro-Dmitrij ~/Desktop $ scp -r ./models aladindv@192.168.50.140:~
1. case2 - Физика. 9 класс.xml 100% 37KB 2.5MB/s 00:00
2. case2 - Физика. 9 класс.pdf 100% 621KB 7.4MB/s 00:00
3. case3 - Генетика.xml 100% 9807 2.5MB/s 00:00
4. case3 - Генетика.pdf 100% 400KB 9.9MB/s 00:00
5. case1 - Физика. 8 класс.pdf 100% 989KB 3.7MB/s 00:00
6. case1 - Физика. 8 класс.xml 100% 32KB 4.7MB/s 00:00
aladin@MacBook-Pro-Dmitrij ~/Desktop $ ssh aladindv@192.168.50.140
aladindv@ubuntu:~$ ls
awesome.txt folder foler history-1.png models test test.txt
aladindv@ubuntu:~$ ls models/
'01. case1 - Физика. 8 класс.pdf' '01. case2 - Физика. 9 класс.pdf' '01. case3 - Генетика.pdf'
'01. case1 - Физика. 8 класс.xml' '01. case2 - Физика. 9 класс.xml' '01. case3 - Генетика.xml'

В Windows с PowerShell и PuTTY вызов команды будет немного иным. О том, как это сделать, см. в статье.

Часть 5. Пакетный менеджер Apt

Материал основан на статье Как пользоваться apt | Losst.

Пакетный менеджер Apt или Advanced Package Tool используется во множестве дистрибутивов, основанных на Debian или Ubuntu, а таких дистрибутивов сейчас очень много. Этот пакетный менеджер поддерживает все необходимые функции, вы можете устанавливать и удалять пакеты, обновлять то, что было уже установлено, искать пакеты, устанавливать их из файла или загружать без установки. При этом все зависимости будут разрешаться автоматически.

Синтаксис команды apt очень простой и похож на другие команды Linux:

$ apt опции команда параметры_команды
  • install - установить пакет;
  • remove - удалить пакет, конфигурационные файлы, которые были изменены в вашей системе удалены не будут;
  • purge - полностью удалить пакет, вместе со всеми его конфигурационными файлами;
  • autoremove - очистить ненужные пакеты;
  • autoclean - очистить кэш пакетов;
  • update - обновить списки пакетов из репозиториев;
  • upgrade - обновить версию пакета до последней, если пакет не указан будут обновлены все пакеты;
  • full-upgrade - полное обновление системы, включая удаление несовместимых или больше ненужных пакетов;
  • list - список установленных пакетов;
  • search - поиск пакетов;
  • show - посмотреть информацию о пакете;
  • download - скачать пакет в текущую папку;
  • edit-sources - открыть с настройками репозиториев в текстовом редакторе.

Сначала давайте обновим список пакетов apt из репозиториев. Репозитории находятся на удалённых серверах и когда утилита apt ищет пакет для установки, естественно, что она не обращается ко всем репозиториям подряд чтобы узнать где он находится. В системе уже есть сохранённых кэш информации о том, какие пакеты вообще есть и где их можно скачать. Для обновления этого кэша используйте команду update:

sudo apt update

Во время загрузки URL репозиториев обозначаются специальными префиксами, вот что они означают:

  • Hit (Сущ) - список не изменился с момента предыдущей загрузки;
  • Ign (Игн) - репозиторий игнорируется, либо он слишком новый, либо произошла незначительная ошибка во время загрузки;
  • Get (Пол) - доступна новая версия и она будет загружена.

Когда кэш обновлен вы можете посмотреть для каких пакетов доступны обновления:

sudo apt list --upgradable

Аналогично можно посмотреть установленные пакеты apt:

sudo apt list --installed

Или всех доступных:

sudo apt list --all-versions

Затем можно обновить все пакеты в системе:

sudo apt full-upgrade

На "боевых" удаленных узлах с осторожностью нужно использовать обновление пакетов.

Чтобы установить пакет apt используйте команду install, например, для установки программы Vim используйте команду install:

sudo apt install vim

Часть 6. Bash-скрипты

Материал основан на:

Запуск "Hello, World!"

Первая программа, которую обычно пишут программисты это «Hello, World!» — простой вывод этой строки. Мы тоже с этого начнем. За вывод строки в консоль отвечает команда echo. Прямо в консоли вы можете напечатать echo "Hello, World!" и получить соответствующий вывод:

echo "Hello, World!"

Сделаем это программой. Команда touch helloworld.sh создаст файл helloworld.sh. Команда nano helloworld.sh откроет этот файл для редактирования. Заполним файл нашей программой:

#!/bin/bash
echo "Hello, World!"

Для выхода с сохранением из nano надо нажать ctrl+o для сохранения (после чего нажать enter для перезаписи текущего открытого файла), а потом ctrl+x для выхода. Можно выходить без сохранения, при этом он спросит, точно ли вы хотите выйти без сохранения. Если да, надо нажать N для выхода без сохранения. Если вы нажмете Y, он спросит куда сохранить измененный файл, можно нажать enter для перезаписи редактируемого файла.

Разберем, что мы написали.

Первой строкой идет #!/bin/bash — фактически это указание на местоположение интерпретатора. Чтобы при запуске скрипта не требовалось указывать отдельно интерпретатор. Убедиться, что ваш bash интерпретатор лежит по этому пути можно через команду which bash:

aladindv@ubuntu:~$ which bash
/usr/bin/bash

Второй строкой идет непосредственно вся наша программа. Как она работает, мы разобрали выше, перейдем к выполнению.

Запустить ваш скрипт/команду можно двумя способами.

  • Способ №1: bash helloworld.sh. Вы вызываете интерпретатор и в аргументе передаете ему имя файла для исполнения.
  • Способ №2: Сначала надо разрешить системе исполнять скрипт: chmod +x helloworld.sh. Эта команда сделает файл исполняемым. Теперь вы можете запустить его как любой бинарный файл в linux: ./helloworld.sh.

Аргументы

Это параметры, которые вы можете передать программе при ее вызове. Например, программа ping принимает в качестве обязательного аргумента IP-адрес или DNS-имя, которое требуется пропинговать: ping ya.ru. Это простой и удобный способ общения пользователя с программой.

Давайте научим нашу программу принимать аргументы и работать с ними. Доступ к аргументам осуществляется через служебную команду $X где X это число. $0 — всегда имя исполняемого скрипта. $1 — первый аргумент, $2 — второй и так далее. Конечно, если вы планируете передавать пару десятков аргументов вашему приложению, это может быть несколько утомительно, так что вам понадобится что-то вроде этого цикла, чтобы перебрать все поступившие аргументы:

for var in "$@"; do
echo "$var"
done

Пример, создадим новый файл: touch hellousername.sh. Выдаем права на исполнение chmod +x hellousername.sh.

Открываем nano hellousername.sh.

Код примера следующий:

#!/bin/bash 

echo "Hello, $1!"

Сохраняем, закрываем. Смотрим, что получилось.

aladindv@ubuntu:~$ ./hellousername.sh Vasya
Hello, Vasya!

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

aladindv@ubuntu:~$ ./hellousername.sh
Hello, !

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

Способ №1

#!/bin/bash
if [ "$#" -lt 1 ]; then
echo "Недостаточно аргументов. Пожалуйста, передайте в качестве аргумента имя. Пример: $0 Vasya"
exit 1
fi
echo "Hello, $1!"

$# Это число аргументов без учета имени скрипта, который всегда $0.

Способ №2

#!/bin/bash
if [ -z "$1" ]; then
echo "Имя пустое или не передано. Пожалуйста, передайте в качестве аргумента имя. Пример: $0 Vasya"
exit 1
fi

echo "Hello, $1!"

Здесь тоже используется конструкция if then [else] fi. Ключ -z в if используется для проверки переменной на пустую строку. Есть противоположный ключ -n, он проверяет что строка не пустая. Конечно, этот способ некорректно использовать для проверки входящих аргументов, но в теле самой программы он будет полезен. Например, чтобы проверить что выполненное в самой программе приложение что-то вернуло.

Часть 7. Завершение процесса

Материал основан на статье Как убить процесс Linux | Losst.

Для примера создадим тестовую программу:

Пример, создадим новый файл: touch pingya.sh. Выдаем права на исполнение chmod +x pingya.sh. nano pingya.sh:

#!/bin/bash
ping ya.ru

Протестируем:

aladindv@ubuntu:~$ ./pingya.sh
PING ya.ru (77.88.55.242) 56(84) bytes of data.
64 bytes from ya.ru (77.88.55.242): icmp_seq=1 ttl=246 time=10.4 ms
64 bytes from ya.ru (77.88.55.242): icmp_seq=2 ttl=246 time=9.96 ms
^C
--- ya.ru ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 9.955/10.166/10.378/0.211 ms

Для передачи сигналов процессам в Linux используется утилита kill. Ее синтаксис очень прост:

$ kill -сигнал pid_процесса

Сигнал представляет собой один из выше перечисленных сигналов для завершения процесса. По умолчанию, если этот параметр не указан, используется сигнал SIGTERM, что является очень правильно. Также нам нужно указать какой процесс нужно завершить. Для этого используется уникальный идентификатор процесса - PID.

Допустим, у нас выполняется утилита ping. Мы хотим ее завершить с помощью kill. Тогда, сначала мы узнаем ее идентификатор с помощью команды ps:

ps aux | grep ping

В одном терминале запустите команду:

aladindv@ubuntu:~$ ./pingya.sh

Откройте новый терминал, подключитесь к виртуальному узлу под текущим пользователем, и введите команду по примеру, показанному ниже:

aladindv@ubuntu:~$ ps aux | grep pin | grep aladindv
aladindv 2602 0.0 0.5 7368 3532 pts/0 S+ 12:49 0:00 /bin/bash ./pingya.sh
aladindv 2603 0.0 0.1 7716 1276 pts/0 S+ 12:49 0:00 ping ya.ru
aladindv 2605 0.0 0.3 6476 2388 pts/1 S+ 12:49 0:00 grep --color=auto pin

Мы видем, что ./pingya.sh запущено под PID 2602, а подпроцесс ping имеет 2603.

Чтобы

Берем нужный PID и завершаем процесс с помощью SIGTERM (немедленно завершает процесс, но обрабатывается программой, поэтому позволяет ей завершить дочерние процессы и освободить все ресурсы):

aladindv@ubuntu:~$ kill 2602
aladindv@ubuntu:~$ kill 2603

Утилита pkill - это оболочка для kill, она ведет себя точно так же, и имеет тот же синтаксис, только в качестве идентификатора процесса ей нужно передать его имя. Утилита сканирует директорию proc и находит PID первого процесса с таким именем, затем отправляет ему SIGTERM. Таким образом, вы можете убить процесс по имени Linux. Например, если мы хотим завершить тот же ping:

pkill ping

Часть 8. Демоны в Linux

Материал основан на статье Что такое демоны в Linux | Losst.

Демон Linux - это программа, у которой есть определённая уникальная цель. Обычно, это служебные программы, которые незаметно работают в фоновом режиме для того чтобы отслеживать состояние и обслуживать определённые подсистемы и гарантировать правильную работу всей операционной системы в целом. Например, демон принтера, отслеживает состояние служб печати, а сетевой демон управляет сетевыми подключениями и следит за их состоянием.

Многие люди, перешедшие в Linux из Windows знают демонов как службы или сервисы. В MacOS термин "Служба" имеет другое значение. Так как MacOS это тоже Unix, в ней испольуются демоны. А службами называются программы, которые находятся в меню Службы.

Демоны выполняют определённые действия в запланированное время или в зависимости от определённых событий. В системе Linux работает множество демонов, и каждый из них предназначен для того чтобы следить за своей небольшой частью операционной системы. Поскольку они не находятся под непосредственным контролем пользователя, они фактически невидимы, но тем не менее необходимы. Поскольку демоны выполняют большую часть своей работы в фоновом режиме, они могут казаться загадочными.

Какие демоны работают на вашем компьютере

Обычно имена процессов демонов заканчиваются на букву d. В Linux принято называть демоны именно так. Есть много способов увидеть работающих демонов. Они попадаются в списке процессов, выводимом утилитами ps, top или htop. Но больше всего для поиска демонов подходит утилита pstree. Эта утилита показывает все процессы, запущенные в вашей системе в виде дерева. Откройте терминал и выполните такую команду:

pstree

Вы увидите полный список всех запущенных процессов. Вы можете не знать за что отвечают эти процессы, но они все будут здесь перечислены. Вывод pstree - отличная иллюстрация того, что происходит с вашей машиной. Здесь удобно найти запущенные демоны Linux:

aladindv@ubuntu:~$ pstree
systemd─┬─ModemManager───2*[{ModemManager}]
├─cron
├─dbus-daemon
├─irqbalance───{irqbalance}
├─login───bash
├─multipathd───6*[{multipathd}]
├─networkd-dispat
├─packagekitd───2*[{packagekitd}]
├─polkitd───2*[{polkitd}]
├─rsyslogd───3*[{rsyslogd}]
├─snapd───12*[{snapd}]
├─sshd─┬─sshd───sshd───bash───pstree
│ └─sshd───sshd───bash
├─2*[systemd───(sd-pam)]
├─systemd-journal
├─systemd-logind
├─systemd-network
├─systemd-resolve
├─systemd-timesyn───{systemd-timesyn}
├─systemd-udevd
├─udisksd───4*[{udisksd}]
└─unattended-upgr───{unattended-upgr}

Самый простой способ определить демона - это буква d в конце его названия. Вот небольшой список демонов, которые работают в вашей системе. Каждый демон создан для выполнения определённой задачи.

  • systemd - основная задача этого демона унифицировать конфигурацию и поведение других демонов в разных дистрибутивах Linux.
  • udisksd - обрабатывает такие операции как: монтирование, размонтирование, форматирование, подключение и отключение устройств хранения данных, таких как жесткие диски, USB флешки и т д.
  • logind - небольшой демон, управляющий авторизацией пользователей.
  • httpd - демон веб-сервера, позволяет размещать на компьютере или сервере веб-сайты.
  • sshd - позволяет подключаться к серверу или компьютеру удалённо, по протоколу SSH.
  • ftpd - организует доступ к компьютеру по протоколу FTP для передачи файлов.
  • crond - демон планировщика, позволяющий выполнять нужные задачи в определённое время.

Следующие главы выполняются только на личной виртуальной машине.

Часть 9. Управление службами Linux

Материал основан на статье Что такое демоны в Linux | Losst.

Эта часть выполняется только на личной виртуальной машине.

Чтобы всем этим управлять нужна основная служба - система инициализации, которая будет запускать службы Linux в нужный момент, следить чтобы они нормально работали, записывать сообщения логов, и самое главное предоставлять пользователям интерфейс для управления службами. Саму систему инициализации запускает ядро Linux.

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

Но потом на смену этому методу пришла новая модель и система инициализации Systemd. Эта система позволяет запускать службы параллельно, поэтому появилась необходимость настраивать зависимости между службами. Таким образом, теперь порядок запуска служб определяет сложное дерево зависимостей. После запуска Systemd собирает весь вывод службы в лог, и следит за ее работой, если служба аварийно завершилась, то автоматически ее перезапускает при необходимости.

В Systemd есть специальный инструмент для управления службами в Linux - команда systemctl. Эта утилита позволяет делать очень много вещей, начиная от перезапуска службы linux и проверки ее состояния, до анализа эффективности загрузки службы. Синтаксис у этой утилиты такой:

$ systemctl опции команда служба служба...

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

Опции очень сильно зависят от команд, поэтому рассмотрим их позже, а пока пройдемся по командам:

  • start - запустить службу linux
  • stop - остановить службу linux
  • reload - попросить службу перечитать свою конфигурацию из файловой системы
  • restart - перезапустить службу
  • и другие команды, о которых вы можете посмотреть здесь.

Список запущенных служб

Сначала давайте посмотрим все загруженные в память службы Linux. Для того чтобы отобразить только службы можно использовать фильтр по типу с помощью опции type:

systemctl list-units --type service

systemctl-1

Обратите внимание, что команда не просто выводит текст, она передает этот текст утилите less. Здесь доступна прокрутка вверх и вниз, а также вправо и влево с помощью клавиш стрелок. Для того чтобы выйти обратно в терминал нажмите клавишу q.

Команда отобразила все службы, которые известны systemd, они сейчас запущены или были запущены. Systemd не пересматривает все файлы юнитов при выполнении этой команды. В выводе утилиты есть несколько колонок:

  • LOAD - значение loaded означает, что юнит службы был успешно загружен
  • ACTIVE - состояние сервиса, позволяет понять запущен он или нет.
  • SUB - более подробное состояние службы.
  • DESCRIPTION - описание службы.

Дальше больше. Вы можете отфильтровать список служб systemctl по состоянию с помощью опции state. Например, только выполняющиеся:

systemctl list-units --type service --state running

Пример:

aladindv@ubuntu:~$ systemctl list-units --type service --state running
UNIT LOAD ACTIVE SUB DESCRIPTION
cron.service loaded active running Regular background program processing daemon
dbus.service loaded active running D-Bus System Message Bus
getty@tty1.service loaded active running Getty on tty1
irqbalance.service loaded active running irqbalance daemon
ModemManager.service loaded active running Modem Manager
multipathd.service loaded active running Device-Mapper Multipath Device Controller
networkd-dispatcher.service loaded active running Dispatcher daemon for systemd-networkd
packagekit.service loaded active running PackageKit Daemon
polkit.service loaded active running Authorization Manager
rsyslog.service loaded active running System Logging Service
snapd.service loaded active running Snap Daemon
ssh.service loaded active running OpenBSD Secure Shell server
systemd-journald.service loaded active running Journal Service
systemd-logind.service loaded active running User Login Management
systemd-networkd.service loaded active running Network Configuration
systemd-resolved.service loaded active running Network Name Resolution
systemd-timesyncd.service loaded active running Network Time Synchronization
systemd-udevd.service loaded active running Rule-based Manager for Device Events and Files
udisks2.service loaded active running Disk Manager
unattended-upgrades.service loaded active running Unattended Upgrades Shutdown
user@1000.service loaded active running User Manager for UID 1000
user@1001.service loaded active running User Manager for UID 1001

LOAD = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB = The low-level unit activation state, values depend on unit type.
22 loaded units listed.

Запуск службы

Для того чтобы запустить службу используется команда start. Ей необходимо передать имя службы в качестве параметра:

sudo systemctl start имя_службы.service

Например, для запуска Nginx (перед этим нужно скачать необходимый пакет с помощью команды sudo apt install nginx) выполните:

sudo systemctl start nginx.service

Остановка службы

Остановить службу linux можно командой:

sudo systemctl stop имя_службы.service

Например, для остановки Nginx можно использовать такую команду:

sudo systemctl stop nginx

Состояние службы

Посмотреть состояние службы позволяет команда status:

sudo systemctl status имя_службы

Например, для Nginx:

sudo systemctl status nginx

Для дальнейшего изучения