Linux для чайника
20K subscribers
87 photos
4 files
78 links
Linux
- Разбор утилит / инструментов
- Новости / факты
- Опросы для проверки знаний, навыков
и многое другое.

Только по вопросам сотрудничества: @altmainf

Регистрация в перечне РКН https://clck.ru/3EpL9L
Download Telegram
Для сценариев, требующих полномочий root, сначала нужно проверить, какой пользователь запустил сценарий.

UID пользователя root всегда равен 0. Проверка, является ли пользователь, запустивший сценарий, пользователем root, может выглядеть так:

ROOT_UID=0 

if [ "$UID" -eq "$ROOT_UID" ]
then 
echo "Root" 
else 
echo "Обычный пользователь"
fi 
exit 0
В Linux кроме прав доступа есть еще и атрибуты файла, подобно атрибутам файла в других ОС.

Просмотреть установленные атрибуты можно командой: chattr some_file

Основные полезные атрибуты:
i Запрет на изменений, переименование и удаление файла. Обычно ставится для критических конфиг. файлов. Установить и сбросить может только root (либо процесс с CAP_LINUX_IMMUTABLE)

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

c Файл будет сжиматься. Рекомендуется для больших несжатых данных, но крайне не желателен для файлов БД т.к. доступ будет медленнее.

S Данные, записываемые в файл, сразу будут сброшены на диск. Аналогично выполнению команды sync сразу после каждой операции записи в файл.

s Прямо противоположен атрибуту u. После удаления файла, принадлежащие ему блоки будут обнулены и восстановить их уже не получится.

Пример установки атрибута: chattr +i config_file
Пример сброса атрибута: chattr -i config_file
Разбить файл на части можно используя команду split

Для примера создадим файл с цифрами от 1 до 1000 в столбик командой:
echo {1..1000} | tr ' ' '\n' > some_file

Разделим этот файл по 200 строк в каждом, командой:
split -200 some_file

Цифру можно задать свою. Исходный some_file останется, рядом создадутся 5 (потому что на 200 делили) файлов. Подумай, какие названия им даст ОС?

Команду можно также использовать для разделения файлов на части по размеру информации, например:
split -b100b some_file2
split -b100k some_file2
split -b100m some_file2

Первая команда разделит файл на части по 100 байтов каждая, вторая - на части по 100 Кбайт каждая, третья - по 100 Мбайт каждая.
В любом серьезном сценарии вы не обойдетесь без использования переменных.

Пример объявления переменной:
ADDRESS=some_firma.ru

Вывести значение переменной:
echo $ADDRESS 

В Linux часто используются переменные окружения. Это специальные переменные, содержащие служебные данные. Вот примеры некоторых часто используемых переменных окружения:

BASH - полный путь до исполняемого файла командной оболочки bash;

BASH_VERSION - версия bash;

НОМЕ - домашний каталог пользователя, который запустил сценарий;

HOSTNAME- имя компьютера;

RANDOM - случайное число в диапазоне от 0 до 32767;

OSTYPE - тип операционной системы;

PWD - текущий каталог;

PS1 - строка приглашения;

UID - ID пользователя, который запустил сценарий;

USER - имя пользователя. 
Существует два типа IP-адресов: локальные и публичные.

Локальный IP присваивается системой, и его можно посмотреть с помощью команды:

hostname -I

Если же вы хотите узнать публичный IP вашего ПК, который провайдер присваивает вашему интерфейсу, то при подключённом интернете выполните в командной строке:

curl ifconfig.co

Команда обращается к серверу ifconfig.co, который возвращает обратно IP-шник одной строкой вместо полноценной веб-страницы.
В современных дистрибутивах Linux сменные носители вроде USВ или оптических дисков монтируются автоматически:

Deblan, Ubuntu, Fedora, CentOS - монтирование производится к каталогу:
/mеdiа/<метка_устройства>

В качестве метки может использоваться или метка, установленная при форматировании, или серийный номер устройства, если метка не устанавливалась.

openSUSE - монтирование будет производиться к каталогу:
/var/run/media/<имя_пользователя>/<метка>

За автоматическое монтирование отвечает демон automount, который можно отключить, если автоматическое монтирование вам не нужно.
Обратите внимание на значение buff/cache в выводе команды free. Оно показывает сколько памяти задействовано под буфер ввода/вывода и кэш.

Немного освободить память можно, очистив кэш. Для этого введите команду:
sync; echo 3 > /proc/sys/vm/drop_caches

Сначала мы командой sync сбрасываем содержимое буферов на диск, а затем уничтожаем кэш. Если просмотреть затем информацию об использовании памяти, то вы увидите, что размер кэша был уменьшен в разы.
Однако помните, что этот трюк может негативно отразиться на стабильности и скорости системы. Не всегда очистка кэша таким вот варварским образом - это хорошо.
Такие файловые системы, как ехtЗ, ext4, XFS, ReiserFS, JFS  и др. - ведут журналы своей работы, что позволяет восстановить данные в случае сбоя.

Осуществляется это следующим образом: перед тем как выполнить операцию, журналируемая ФС записывает ее в особый файл - журнал, а после выполнения операции удаляет запись из журнала.

Представим, что после занесения операции в журнал произошел сбой (например, отключилось электропитание). Позже, когда сбой будет устранен, ФС по журналу выполнит все действия, которые в него занесены.

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

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

В этих случаях для извлечения любого доступного для чтения текста ASCII используйте команду strings. Эта команда является частью программного пакета binutils и устанавливается в Ubuntu по умолчанию.

Несколько примеров ее использования:

strings /bin/ls | grep -i libc
Определяет наличие libc в ls

cat /bin/ls | strings
Отображает все тексты ASCII в ls

strings /bin/ls
Отображает все тексты ASCII в ls
Изменение текущего процесса прежде всего означает поиск соответствующего процесса и лишь затем уже изменение его приоритета или подачу процессу сигнала об изменении режима работы.

Если вы ищете какой-то определенный процесс, то наиболее простым вариантом будет отобразить расширенный список процессов с помощью команд ps или top.

Команда pgrep позволяет искать необходимые процессы через активные процессы.

Команда reniсе - изменять приоритеты текущих процессов [ пост про nice ].

А команды kill, pkill и killall - отправлять сигналы текущим процессам (включая сигналы завершения данных процессов).
Параметры командной строки - как данные для программы.

Содержатся эти параметры в переменных с номерами. Например: 
$0 — имя скрипта, 
$1 — первый параметр, 
$2 — второй параметр и т. д.
Также существуют две вспомогательные переменные: 
$# содержит количество переданных аргументов; 
$@ содержит все аргументы, переданные скрипту, разделенные пробелами.

Называем, передаем и запускаем: ./q.sh 1 2 5 41

Получим:
Имя скрипта: ./q.sh
Количество переданных аргументов: 4
arg='1'
arg='2'
arg='5'
arg='41'
Создаем архив tar.gz текущего каталога

Конструкция ${PWD##*/} - пишет в переменную name полный путь до текущего каталога, удаляет из этого пути все, оставляя только имя самого каталога.

Скрипт запускается из каталога, архив которого нужно получить.
Максимально простой вариант отладки bash- скриптов по шагам.

- Команда trap перехватывает сигнал DEBUG, посылаемый перед выполнением команды
- Команда read ожидает ввода чего-нибудь с клавиатуры (в данном случае нам нужно только ENTER либо Ctrl+C)
- Переменная окружения $BASH_COMMAND, валидная внутри обработчика команды trap.

Запускаем скрипт.
Перед выполнением каждой команды выводится то, что будет исполняться, затем интерпретатор начинает ожидать нажатия клавиши <ENTER>.
Если понимаем, что что-то пошло не так, нажимаем Ctrl+C и выходим из отладки.
Плохая читаемость обратных кавычек (одинарные кавычки с "наклоном вправо") в некоторых шрифтах может привести к путанице с обычными одинарными кавычками.

Конструкция $() позволяет использовать вложенные вызовы без головной боли с экранированием.
Как вы знаете, известные сочетания клавиш Ctrl+C (копировать) и Ctrl+V (вставить) не дадут тех результатов в оболочке Bash, которых бы мы хотели.

Вместо них используйте сочетания клавиш Shift+Ctrl+C и Shift+Ctrl+V. Вы также можете вырезать и вставлять текст, щелкнув правой кнопкой мыши и выбрав соответствующую операцию в меню. И это может оказаться удобней.
Горячие клавиши VIM

Vim — это продвинутый текстовый редактор с широкими возможностями настройки. 

Для перемещения по файлу:
 • h - на один символ влево;
 • l - на один символ вправо;
 • j - на одну строку вниз;
 • k - на одну строку вверх;
 • w - на слово вправо;
 • b - на слово влево;
 • H - перейти в низ экрана;
 • G - перейти в конец файла;

Если перед тем как нажать кнопку буквы нажать цифру, то эта команда будет повторена несколько раз. Например, 3j переведет курсор на три строки вверх.

Для переключения в режим редактирования:
 • i - вставить текст с позиции курсора, символ под курсором будет заменен;
 • I - вставить текст в начало строки;
 • a - добавить текст начиная от позиции курсора;
 • o - вставить новую строку после этой и начать редактирование;
 • O - вставить новую строку перед этой и начать редактирование;
 • r - заменить текущий символ;
 • R - заменить несколько символов.

Можно запустить редактор и потыкаться во всем самостоятельно или же пройти курс обучения, который встроен в vim, набрав: vimtutor
Заготовка для скрипта, попутно выполняющего логирование с датой и временем в отдельном файле.

Можно, к примеру, зафиксировать выполнение бэкапа, поместив эти действия между log "..." - функциями.
Команда ifconfig 

Одна из возможностей - отображение параметров сетевого интерфейса.
Если ввести ifconfig в терминал, то получим список активных интерфейсов. 

Поля вывода ifconfig:
HWaddr - аппаратный MAC-адрес;
inet addr - IPv4-адрес интерфейса;
inet6 addr - IPv6-адрес интерфейса;
Bcast - широковещательный адрес
Mask - маска сети
MTU - значение MTU (Maximum transmission unit - максимальный объём данных, который может быть передан за одну итерацию); 
collision - счетчик коллизий, если количество коллизий больше 0, с ва­шей сетью творится что-то неладное; 
RX packets - количество принятых пакетов; 
TX packets - количество переданных пакетов; 
RX bytes - количество принятых байтов; 
TX bytes - количество переданных байтов. 

Даже если сетевые интерфейсы не настроены, в выводе должен быть интерфейс lo (Local Loopback).
Если его нет, служба network не запущена. Для запуска введите: sudo service network start
Для создания ссылок служит команда ln:

ln some_file link1
Создается жесткая ссылка link1, ссылающаяся на файл some_file.

ln -s some_file link2
Создается символическая ссылка link2, которая ссылается на этот же текстовый файл some_file.

При модификации ссылки (любой: link1 или link2), автоматически модифицируется исходный файл some_file.

Команда ls отобразит символическую ссылку другим цветом (каким именно - зависит от дистрибутива).
Жесткие ссылки в большинстве дистрибутивов никак не выделятся.
Ранее в [ одном из постов ] упоминался способ создания множества однотипных файлов через скобки.

Для подобных целей можно использовать:
touch file{1..500}
Создадутся file1, file2, ...file500

Следующим примером для проекта создаем файлы: 
myapp.html
myapp.css,
myapp.php
myapp.js
touch myapp.{html,css,php,js}

(нигде в перечислении пробелов быть не должно!)

Создаем директории:
mkdir {templates,html,js,css}
​​Архиватор gzip.

Утилита сжатия и восстановления файлов.
Именно в этом формате поставляется большинство программ в исходных текстах. От того и популярность.

Сам по себе gzip "не умеет" сжимать несколько файлов, поэтому перед сжатием требуемые файлы обрабатываются архиватором tar, а потом полученный файл передается архиватору gzip. Отсюда созданные архивы получают двойное расширение tar.gz.

Например, есть несжатый архив some_archive.tar, который мы хотим сжать. Для этого выполним:
gzip -k some_archive.tar

Ключ -k позволяет сохранить несжатый файл. Без его указания исходный файл будет удален.

Извлечем содержимое полученного архива:
gzip -kd some_archive.tar.gz

Ниже приведены все ключи.