4. Linux.md 23 KB

О системе

https://losst.pro/sbor-informatsii-o-sisteme-ubuntu

$ hostnamectl # версия ОС, ядра
$ cat /proc/cpuinfo
$ lsb_release -a
$ uname -a # версия ядра
$ df -h # место на дисках
$ cat /etc/os-release # версия ОС
$ uname -m # битность системы
Полезное
$ obsidian & # запуск программы в фоне
$ gio open my_pdf_book.pdf # открыть pdf документ

Hotkeys

$ ctrl + l # очистка экрана
# В утилите less
$ ctrl + f (+b) листать вниз и вверх постранично
$ ctrl + z # свернуть процесс
$ jobs # посмотреть свернутые процессы
$ fg %<номер программы> # (for graund) развернуть процесс
$ bg %<номер программы> # развернуть процесс в бекгрануд
$ ctrl + c # прервать процесс

Утилиты

xxd - вывод содержимого файлов в hex и bin форматах

$ xxd my_file.txt
$ xxd -с 1 -b my_file.txt 
# -b - выводит в двоичном формате
# -c 1 - вывод по одному символу
# -p - убрать справочную информацию
$ xxd -r -p file_in file_out # обратное преобразование
$ batcat # фналог cat, но с подсветкой синтаксиса
$ which batcat
$ sudo ln -s /usr/bin/batcat /usr/local/bin/bat #
$ mktemp # создает пустой файл со случайным именем в /tmp/
$ mktemp myfileXXX.txt # создает файл со случайными символами на месте 'XXX' в текущей директории
$ source ~/.bashrc # выполнить .bashrc в текущем сеансе оболочки

sed - потоковый редактор текста Подробнее здесь: https://emulek.github.io/sed/index.html

Командная строка

Создание и удаление

$ true > file.txt # создает пустой файл
$ echo "hello world" > file.txt # создает файл и пишет строку 
$ touch {1..50} # создает 50 файлов с именами от 1 до 50
$ mkdir -p folder1/folder2/folder3 # создает вложенные директории
$ mkdir -p folder1/{folder2, folder3}/folder4 # второй способ
$ ls -R folder1 # рекурсивные вывод содержимого
$ tree folder1
$ echo ?.txt # выведет имена файлов только с 1 символом
$ # ? - это только один символ
$ touch user_{ivan, akex, petr}.txt #  создает 3 файлв с именами по шаблону
$ echo now is $(date) # вывод результата команды через $
$ rm *.txt # удаляет файлы по маске

Разное

$ du -sh /usr/bin # вывод размера директории /usr/bin
$ du -sh /usr/bin/* # вывод размера всех нескрытых файлов в /usr/bin
$ du -sh /usr/bin/* | sort -h | less # сортировка по размеру файлов
$ !du # команда du выполнится с предыдущими аргументами
$ cd - # Вернуться в предыдущую директорию
$ wc -l # считает количество строк переданных команде wc
$ export # выводит переменные окружения
$ export EDITOR=nano # установка переменной окружения
$ export "export EDITOR=nano" >> ~./bashrc # установить текстовый редактор по умолчанию
$ head -n10 file.txt # вывести 10 первых строк файла
$ tail -n10 file.txt # вывести 10 последних строк файла
$ cut -c 1-10 file.txt # выведет с 1-ого по 1-ый символы из каждой строчки файла
$ echo "123.456" | cut -d. -f1 # выведет 123, отрезает часть f по разделителю d
$ watch -n 1 date # запускает каждую секунду команду date
$ watch -g "df -h" # перезапускает команду df пока не изменится ее вывод
$ tr ":" "\" # заменяетодин символ на другой
$ dd if=/dev/urandom of=bigfile bs=64M count=17 iflag=fullblock # создать файл размером больше 1 гигабайта
$ ls -la && echo $? # $? возвращает код выполнение команды

История команд

$ history # выводит историю команд
$ history | less # листать историю команд
$ !25 # выполнить команду под номером 25
$ !! # повтороить предыдущую команду
$ 

Редактирование команд

$ ctrl + a # переход в начало строки
$ ctrl + e # переход в конец строки
$ ctrl + w # удаление по словам

Потоки ввода/вывода
">" :: Перенаправить поток вывода в файл. Файл будет перезаписан. "2>" :: Перенаправить поток ошибок в файл. Файл будет перезаписан. "&>" :: Перенаправить поток вывода и поток ошибок в файл. Файл будет перезаписан. ">>" :: Перенаправить поток вывода в файл. Файл будет создан или дозаписан. "2>>" :: Перенаправить поток ошибок в файл. Файл будет создан дозаписан. "&>>" :: Перенаправить поток вывода и поток ошибок в файл. Файл будет создан или дозаписан. "|" :: Канал. Позволяет передать поток stdout одной команды в поток stdin другой команды.

$ echo hello world > 1.txt
$ echo new line >> 1.txt # дозаписать файл
$ cat 1.txt 2.txt > 3.txt # поместить содержимое двух файлов в третий
$ tac 3.txt # выводит файл в обратном порядке
$ ls nonexistent_file 2> 4.txt # перенаправить поток ошибок stderr в файл
$ ls nonexistet_file &> 4.txt # оба потока stdout и  stderr в файл
$ cat < 1.txt # передача в stdin
$ ls -la | tree output.txt # сохранит вывод ls в файл output.txt 
$ ls -ls | tee file.txt # выводит в stdout и в файл

Пользователи

$ whoami # выводи имя пользователя
$ cd # переход в домашнюю директорию пользователя

Статистика и информация

$ stat file.txt # вывод статистики
$ ls -l --time-style=full-iso file.txt # время выводится в полном формате
$ ls -l --time=atime file.txt # вывод времени доступа 
$ touch -a --date="tomorrow" test.txt # изменитьвремя обращения к файлу
$ touch -am --date="1990-06-01" test.txt # изменитьвремя обращения и время изменения файла
$ touch -t 202202031500 file.txt # изменить параметры Access и Modify у файла

Псевдонимы

$ alias l="ls -l" # создание alias. Сохраняется только в текущей сессии
# Для сохранения нужнодобавитьв .bashrc

Помощь

$ man ls # Получение справки по команде
$ ls --help
# ls --help | less # листать справку

Переменные окружения

$ env # вывод переменных окружения
$ echo $HOME # вывод значения переменной окружения
$ touch $USER.txt # создает файл с именем пользователя
$ export MY_VARIABLE=123 # создает переменную окружения в текущей сессии
$ echo "export MY_VARIABLE=123" >> .bashrc # 
$ TMP=123 env | less # установка переменной окружения в рамках одной команды
$ echo $PATH | tr ":" "\n" # Разбор значения переменной окружения `$PATH` путём разбития по символу двоеточия
$ export CDPATH=.:/cygdrive/c/projects # добавить путь для перехода командой cd
$ type ls # просмотр информации о команде ls
$ which ls # где находится команда ls

Файловая система Linux

$ bin -> usr/bin # ссылка на usr/bin
$ /boot # загрузчик
$ /dev # файлы устройств = устройства
$ /etc # конфигурация системных программ 
$ /home # домашние директории всех пользователей
$ lib -> usr/lib # библиотеки
$ /media # монтируются устройства
$ /mnt # монтируются устройства
$ /proc # файлы процессов
$ /root # директория суперпользователя
$ sbin -> usr/sbin # файлы программ, которые может запускать только root
$ /tmp # временные файлы
$ /usr # пользовательские программы
$ /var # частоизменяемые файлы
$ /sys # информация ядра о системе, устройствах и драйверах
$ /srv # файлы сервисов

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

$ ln file.txt hard_link_to_file.txt # жесткая ссылкоа на file.txt
$ ln -s file.txt soft_link_to_file.txt # символьная ссылкоа на file.txt

Группы пользователей

$ io # показывает информацию пользователя
$ groups user_1 # вывести группы в которых состоит пользователь user_1
$ /etc/passwd # информация о пользователях
$ /etc/group # инфооормация о группах
$ sudo adduser new_user # создать нового пользователя
$ su - new_user # сменить пользователя
$ /etc/sudoers # пользователи с правами sudo
$ sudo groupadd friends # создать группу friends
$ sudo usermod -aG friends user_1 # добавить пользователя user_1 в группу friends
$ sudo passwd user_1 # изменить пароль пользователя user_1
$ sudo passwd # изменить пароль текущего пользователя

Права доступа

$ sudo chmod o-r hello # отнять права на чтение у others на файл hello
$ sudo chgrp my_group hello # сменить владеющую группу у файла hello
$ sudo deluser user my_group # удалить пользователя из группы
$ sudo chmod u+x hello # добавить валдельцу право на исполнение
$ sudo chmod g+rwx # добавить группе все права
$ sudo chown user my_file # изменить владельца файла
$ sudo chown user:group my_file # изменить владельца и группу файла
$ sudo chown :group my_file # изменить только группу файла
$ sudo chown user: my_file # изменить пользователя и группу файла (группа изменится на основную)
$ sudo chmod 777 file # права доступа по битовой маске

Права доступа к директориям. Пояснение:
Естественно, что по отношению к каталогам трактовка понятий «право на чтение», «право на запись» и «право на выполнение» несколько изменяется.

Право на чтение по отношению к каталогам легко понять, если вспомнить, что каталог — это просто файл, содержащий список файлов в данном каталоге. Следовательно, если вы имеете право на чтение каталога, то вы можете просматривать его содержимое (этот самый список файлов в каталоге). Право на запись тоже понятно — имея такое право, вы сможете создавать и удалять файлы в этом каталоге, т. е. просто добавлять в каталог или удалять из него запись, содержащую имя какого-то файла и соответствующие ссылки. Право на выполнение в данном случае означает право переходить в этот каталог. Если вы, как владелец, хотите дать доступ другим пользователям на просмотр какого-то файла в своем каталоге, вы должны дать им право доступа в каталог, т. е. дать им «право на выполнение каталога». Более того, надо дать пользователю право на выполнение для всех каталогов, стоящих в дереве выше данного каталога. Поэтому в принципе для всех каталогов по умолчанию устанавливается право на выполнение как для владельца и группы, так и для всех остальных пользователей. И, уж если вы хотите закрыть доступ в каталог, то лишите всех пользователей (включая группу) права входить в этот каталог.

Архивирование - это не сжатие

$ du -sh original* # посмотреть размеры.
$ tar -cvf original.tar original # создать архив
$ tar -xvf original.tar #
$ tar -xcvf original.tar.gz original # создать сжатый архив
$ tar -xzvf original.tar.gz # разарзивировать
$ zip -r original.zip original # создать zip архив (сжатие)
$ unzip original.zip # распаковать архив
$ tar xvjf <.tar.bz2> # распаковать bz2 (опционально установить bzip2) 

Поиск

  • $ which - показывает где лежит исполнимый файл
  • $ locate - поиск файлов по предварительно создаваемому индексу

    $ find # выводит все подпапки и файлы в виде списка
    $ find . # тоже самое
    $ find . -print # тоже самое (print - это что мы хотим сделать с найденными файлами)
    $ find /var/log | less
    $ find . -name "*.json" # найти все json файлы
    $ find . -name "f*.json" # найти все json файлы с другой маской
    $ find . -maxdepth 1 -name "*.json" # найти все json файлы только на первом уровне вложенности
    $ find . -name "*first*" # поиск файлов и папок по маске
    $ find . -type f -name "*first*" # поиск только файлов (d - только папок)
    $ find . -type d -path ./second -prune -o -name "*.json" -print # искать json файлы исключая директорию ./second
    $ find . -type d -path ./second -prune -o -type d -path ./first -o -name "*.json" -print # тоже самое, но исключается поиск и в ./first
    # опция iname - независимо от регистра
    # -o - параметр логическое ИЛИ
    # -a - параметр логическое И
    $ find . -type d -name "*second*" -prune -o -type d -name "*first*" -o -name "*.json" -print # из поиска исключить директории по шаблону
    $ find . -type f -name "*.json" -o -type f -name "*.txt" # искать json или txt файлы
    $ find . -type f -atime 0 # искать файлы по времени доступа за последние сутки
    $ find . -type f -atime 1 # искать файлы по времени доступа за предпоследние сутки
    $ find . -type f -mtime 0 # искать файлы по времени доступа за последние сутки
    $ find . -type f -anewer file.txt # искать все файлы к которым доступ был получен позднее чем к файлу file.txt
    $ find . -type f -cnewer file.txt # искать все файлы которые были изменены позднее чем файл file.txt
    $ find . -type -f -size 140k # найти фалы размером 140k
    $ find . -type -f -size +140k # найти фалы размером больше 140k
    $ find . -type -f -size -140k # найти фалы размером меньше 140k
    $ find . -type -f -size -150k -a -type f -size +130k # искать файлы в диапазоне 130 - 150k
    $ find . -type f -exec du -sh {} \; # вывести размер каждого файла
    $ find . -type f -exec du -sh {} \; | sort -h # вывести размер каждого файла и отсортировать
    $ find . -type f -exec du -sh {} \; | sort -h | tail 3 # вывести размер каждого файла, отсортировать и вывести три последних
    $ find . -type f -exec cat {} \; # вывести содержимое всех файлов
    $ find . -type f -exec ls -la {} \; -exec cat {} \; -exec echo "---" \; # вывести содержимое файлов с информацией от ls и разделителем "---"
    $ find . -type f -name "*.txt" -delete # удалить txt файлы
    
    grep ripgrep
    ```bash $ grep -rin --include="*.py" "charfield" . # r - рекурсивно # i - независимо от регистра # n - вывести номра строк # --include - в каких файлах искать # "charfield" - собственно то, что искать # . - искать в текущей директории $ rg -i "charfield" # команда ripgrep - более понятный вывод ```
    Разделение файлов
    ```bash $ du -sh ./* | sort -h | tail -n10 # выводит топ 10 самых больших файлов $ split -b 400M test.mov "test.mov." # разбивает файл на файлы размером 400Мб $ cat test.mov.* > test_new.mov # собрать куски в один файл $ md5sum test.mov test_new.mov # выдаст хеши файлов $ cmp test.mov test_new.mov # сравнение файлов (если файлы одинаковы, то пустой вывод) ```
    Установка программ, пакетный менеджер
    ```bash $ sudo apt remove cowsay # удаление программы cowsay $ sudo apt update # обновить информацию о пакетах $ sudo apt purge cowsay # удалить программу и конфигурационные файлы $ sudo apt upgrade # обновить все пакеты $ sudo apt upgrade cowsay # обновить пакет cowsay $ apt search cowsay # поиск пакетов $ apt show cowsay # информация о пакете ```
    Установка программ. Установка python из исходников
    https://habr.com/ru/articles/673488/ ```bash $ wget https://www.python.org/ftp/python/3.12.3/Python-3.12.3.tgz # скачать архив с ихсодниками $ sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev libsqlite3-dev wget libbz2-dev $ configure --enable-optimizations --prefix="$HOME/.python3.12" $ sudo make -j2 && sudo make altinstall # j2 - исплоьзовать 2 ядра при сборке $ echo "export PATH=$PATH:$HOME/.python3.12/bin" >> ~/.bashrc $ sudo apt install <имя пакета> # установить или обновить пакет ```
    htop
    ```bash / <имя процесса> - поиск процесса k - выбор сигнала для процесса ```
    Сигналы
  • SIGHUP, номер 1, как правило используется для того, чтобы уведомить процесс о необходимости перечитать файл конфигурации или обновить своё состояние иным образом

  • SIGKILL, номер 9, используется, чтобы убить процесс. У процесса нет возможности перехватить сигнал, чтобы обработать

  • SIGTERM, номер 15, используется, чтобы выйти из процесса мягко, процесс может перехватить сигнал и правильно завершить свою работу

    $ kill -9 <ID процесса> # послать 9-ый сигнал
    $ killall watch # убийство процесса по имени (killall входит в пакет psmisc)
    $ pkill watch
    $ kill -15 <ID процесса> # 
    $ pkill -u user # убить все процессы запущенные пользователем user
    

    wget

    % wget google.com # скачать index.html в текущую директорию
    

    zsh

    $ sudo apt install -y zsh # установка
    % echo $SHELL
    

Makefile

.PHONY: hello
hello: 
	@echo "hello world"

# Start Django development server
.PHONY runserver:
runserver:
	@echo "run server"

.PHONY bye:
bye: hello
	@echo "bye-bye"

Задания на bash

$ mkdir -p {2020..2024}/{01..12}