LinuxCamp | DevOps – Telegram
LinuxCamp | DevOps
14.2K subscribers
194 photos
7 videos
300 links
Обо мне: C/C++/Linux эксперт. Говорим про разработку, Linux, DevOps, сети и администрирование.

Админ (реклама): @XoDefender
Чат: @linuxcamp_chat

Менеджер: @Spiral_Yuri
Биржа: https://telega.in/c/linuxcamp_tg

№ 6327102672
Download Telegram
Прокачиваемся в find

Поиск файлов и каталогов через cli бывает гораздо более эффективен и гибок, нежели чем через GUI файловых менеджеров.

Команда find, как и grep, используется супер часто в командной строке. Она рекурсивно выводит пути к найденным файлам, спускаясь вглубь по иерархии.

Утилита имеет такой синтаксис:


find каталог параметры действие


Параметры - дополнительные опции, например, глубина поиска, фильтр по имени и т.д;

Действие - что будет выполнено с результатами поиска;

По синтаксису выше найдем пустые каталоги в tmp:


$ find /tmp -type d -empty -print


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

Поиск по типу файла

Флаг "-type" позволяет искать файлы по типу, среди которых:

1) f – простые файлы;
2) d – каталоги;
3) l – символические ссылки;
4) b – блочные устройства (dev);
5) c – символьные устройства (dev);
6) p – именованные каналы;
7) s – сокеты;

Перечисляем только каталоги:


$ find . -type d
.
./.ssh
./.cache


Поиск по размеру файла

Флаг "-size" позволяет произвести фильтрацию по размеру.

Выведем все файлы более 1 Гб (+1G):


$ find . -size +1G
./android-studio-ide-183.5692245-mac.dmg


"+" — поиск файлов больше заданного размера;

"-" — поиск файлов меньше заданного размера;

Отсутствие знака — поиск по полному совпадению с заданным размером;

Единицы измерения файлов: c (байт), k (Кбайт), M (Мбайт), G (Гбайт).

Поиск пустых файлов и каталогов

Параметр "-empty" позволяет найти пустые ресурсы:


$ find . -type d -empty
./datafiles


Не учитывать регистр при поиске

Если опция "-name" чувствительна к регистру, то "-iname" наоборот:


$ find . -name "new*"
./new test file
./newFile


$ find . -iname "new*"
./NewFile
./new test file
./newFile


Несколько каталогов

Для поиска по нескольким каталогам просто используем перечисление:


 find ./dir1 ./dir2 -type f -name "*.c"


Поиск по правам доступа

Команда нам позволяет искать ресурсы по определенной маске прав, например, 0664:


$ find . -type f -perm 0664


Вместо числового представления маски можно использовать символьное для: u (user) g (group) и o (other).

Выполним поиск файлов доступных владельцу для чтения/записи:


$ find /etc -perm /u=rw


Чтобы немного въехать в суть прав доступа, можно просмотреть вот этот пост.

Ограничение глубины поиска

Если нам нужно указать максимальную глубину поиска, используем "-maxdepth".

Следующий запуск find пройдется только по самому верхнему уровню указанного каталога:


$ find /etc -maxdepth 1


Операторы

Для инвертирования шаблона либо объединения можно применять операторы: and, or, not.

Флаг "-and" обычно можно опустить, т.к. он ставится по дефолту.

Найдем файлы, которые не соответствуют шаблону:


$ find . -not -name "test*"


Либо найдем все файлы, начинающиеся на "test", но без расширения "php":


$ find . -name "test" -not -name "*.php"


Можем также объединить несколько условий и найти ресурсы, которые принадлежат "xoadmin" и имеют размер "< 100 байт":


$ find . -user xoadmin -and -size -100c -type f


Если нужно учесть принадлежность к еще какому-нибудь пользователю, используем "or":


$ find . \( -user xoadmin -or -user vasya \) -and -size -100c -type f


Действия

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

1) -delete: удаляет результаты поиска;


$ find . -empty -delete


2) -ls: выводит доп информацию;

3) -print: показывает полный путь к найденным файлам (стоит по умолчанию);

4) -exec: выполняет указанную команду для найденных ресурсов;


$ find . -empty -exec rm -rf {} +


Тут мы удаляем все пустые файлы и каталоги одним вызовом "rm -rf".

Можем через exec найти файлы и прочитать их:


$ find . -type f -exec cat {} \;


Вместо {} подставляется путь к файлу. Если команда оканчивается на "\;", значит она будет выполнена для каждой строки с результатом.

LinuxCamp | #utils
👍48🔥98❤‍🔥41👏1
Прокачиваемся в cp

У вас хоть одна пользовательская сессия проходит без копирования файлов?) В общем-то для этого мы и используем команду cp, в которой немало полезных опций.

Начнем с простого. Для копирования файлов команда имеет 2 типа синтаксиса:

1) с сохранением названия - с указанием каталога;


$ cp ./src/file ./dest/


2) без сохранения - с указанием нового имени файла;


$ cp ./src/file ./dest/file_backup


Сразу же скину ссылку на полную информацию о команде. Далее мы рассмотрим основные кейсы.

Копирование каталога

Для копирования каталогов нужно использовать опцию "-r":


$ cp -r source destination
$ ls destination
source


Тут ме переносим весь каталог вместе с его наполнением.

Если нет полной уверенности в том, что каталог "dest" существует, можно добавить флаг "-t" для вывода предупреждения:


$ cp -rt src dest3
cp: cannot stat 'dest3': No such file or directory


Копирование в этом случае выполнено не будет и каталог не будет создан.

Копирование содержимого каталога

Для того, чтобы перенести только содержимое директории, а не ее саму, используем:


$ cp -r src no_dest
$ ls no_dest
file1 file2 file3


Но есть нюансик... Это так работает только, если no_dest ранее не существовал. Если каталог назначения существует, то в нем будет создан src.

Для того чтобы избежать такого поведения можно использовать опцию "-T":


$ cp -rT src yes_dest
ls yes_dest
file1 file2 file3


Как вариант, еще можно решить задачу использованием шаблона поиска:


$ cp src/* dest


Однако в этом случае скрытые файлы скопированы не будут. Ну и это не проблема особо:


$ cp src/* src/.* dest


Обработка существующих файлов

По умолчанию, если файл каталоге назначения уже существует, он будет перезаписан. Если вы хотите, чтобы утилита спросила вас, стоит ли его перезаписывать, используйте флаг "-i":


$ cp -i src/* dest
cp: overwrite 'dest/file1'? y
cp: overwrite 'dest/file2'? y


С помощью опции "-n" можно отключить перезапись существующих ресурсов:


$ cp -n file1 dest


Создание бэкапов

Для существующих файлов можно cделать резервную копию с помощью опции "-b". Если использовать этот флаг, то в конце названия файла резервной копии будет добавлен символ тильды "~":


$ cp -b file1 dest
$ ls dest
file1~


При использовании параметра "--backup" можно настроить имя резервной копии. Вот доступные варианты:

1) none - резервная копия не делается;

2) numbered - к имени файла будет добавляться номер;

3) simple - в конец файла будет добавлен знак "~";

4) existing - если в целевой директории уже есть бэкапы, то будет использоваться аналогичный им тип нейминга;

Чтобы использовать номер в имени бэкапа используйте:


$ cp --backup=numbered file1 dest
$ ls dest
file1.~1~


Ещё один вариант обработки существующих файлов - заменять только, если изначальный новее.

Для этого нужно использовать опцию "-u":


$ cp -u file1 dest


Копирование ссылок

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


$ cp test_link links
$ ls -l links
-rw-rw-r-- 1 ... test_link


Если вы хотите, чтобы символические ссылки копировались, сохраняя свой тип, нужно использовать опцию "-P":


$ cp test_link links
$ ls -l links
lrwxrwxrwx 1 ... test2_link -> test2


Ток, пожалуйста, не забывайте проверять путь к оригиналу на корректность - в примере выше ссылка поломана.

Для жестких ссылок существует другой подход. Если вы хотите, чтобы она осталась собой после копирования, нужно использовать опцию "-l":


$ cp -l hlink hlink1
$ ls -l
-rw-rw-r-- 3 ... file
-rw-rw-r-- 3 ... hlink
-rw-rw-r-- 3 ... hlink1


Сохранение атрибутов

По умолчанию cp обновляет временные метки и атрибуты прав доступа файлов при копировании.

Иногда может возникнуть необходимость их сохранить. Для этого используем "--preserve":


$ cp --preserve=all file dest


LinuxCamp | #utils
👍40🔥186
Как я потрошил iso образ

Был обычный рабочий день: я усердно делил пиццу на равные части. Все шло гладко, как вдруг прилетает тикет с крайне необычным багом - в virtualbox ломается рендер рабочего стола... И это происходит в момент работы с загрузчиком ОС.

Надо что-то делать, т.к. впечатления после такого, скажем, не очень.

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

Почему нельзя просто обновить пакеты после установки ОС? Баг воспроизводился в очень специфических условиях, исключительно при первом запуске live образа.

Честно говоря, ранее я не особо вникал в структуру iso-шников и это был первый опыт их пересборки. Сейчас расскажу о нескольких фейлах.

Первое время я пытался подменить deb пакет, т.к. думал, что именно он будет распакован в момент первого запуска. Подменил и как же удивился, когда ничего не поменялось и "dpkg -l" показал изначальную версию))

Оказалось, что пакеты распаковываются, но не сразу, а когда система выполняет финальную "доустановку".

Далее я осмелился посмотреть через "ls -l" расширенные параметры бинарника и увидел, что он не только что поставлен, а был вшит в образ еще на этапе сборки.

И тут я задался вопросом: "Стоп, а как в iso образе представлена файловая система для live пользователя, от которого мы выполняем базовую настройку системы?". В процессе страшного ресерча до меня дошло, что она сжата в:


./live/filesystem.squashfs


И если мы "разожмем" ее через:


$ unsquashfs filesystem.squashfs


То увидим внутри что-то очень знакомое:


bin etc initrd.img lib media opt
...


Именно тут-то и сидели те самые бинари, которые изначально требовалось подменить. Дальше пазл примерно сложился, я обратно собрал всю эту иерархию в ".squashfs":


$ mksquashfs squashfs-root filesystem.squashfs


После упаковал новый iso образ, отладил багу и проработал фикс. На всякий, сразу приложу команду, которой готовил образы:


$ sudo mkisofs -o ~/Загрузки/new.iso -quiet -R -b boot/grub/bios.img -no-emul-boot -boot-load-size 4 -boot-info-table ./


В общем, вот такой интересный опыт был получен. Как вы, вообще, хотите больше поговорить о файловых системах, внутрянке iso образов, grub?

LinuxCamp | #story
👍84🔥26🥰5❤‍🔥32🤔2
Топ ресурсов по изучению Linux

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

YouTube:

1) NetworkChuck. Ничего сверх глубокого тут не найдешь, но самые основы можно проработать. Мне тут не столько материал понравился, сколько подача. Если вы ранее вообще не имели дело с Linux и хотели бы начать, можно рассмотреть 2 плейлиста: Linux for Hackers, Bash.

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

Помню, впервые заинтересовался Linux с его видосов и потом начал идти вглубь по сторонним ресурсам.

2) Linux TV. Это уже артиллерия посерьезнее. В обучающих видео автора раскрывается материал для уровней junior-middle+. Козырь канала - плейлист "Linux Crash Course" на 79 видео. Также в арсенале плейлисты: Bash Scripting, Vim Beginners Guide и Linux Commands for Beginners.

3) DistroTube. На канале не все видео обучающие - контент разноплановый, но в контексте Linux. Из чего-то образовательного могу порекомендовать плейлист "The Command Line" - автор рассказывает про различные утилиты командной строки и довольно подробно их разбирает.

Книги:

1) Linux. Командная строка. Лучшие практики (Дэниел Барретт). Относительно конкурентов, книга небольшая (257 стр.).

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

Для того, чтобы разобраться в bash и начать эффективно работать в cmd, я бы рекомендовал начать именно с нее.

2) Командная строка Linux (Уильям Шоттс). Книга - отличное дополнение к п.1. Ее можно прочесть сразу после предыдущей, чтобы поглубже разобраться в теме.

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

Начинать с нее я бы не стал, т.к. много лишней информации, без которой по началу можно спокойно обойтись.

3) Linux API исчерпывающее руководство (Майкл Керриск). Это - база. С нее начался мой путь в мир прикладной разработки под Linux.

Вполне могу рекомендовать первой к прочтению, особенно, если вы разраб и пишете на C/C++.

Вы познакомитесь с различными подсистемами ОС, протоколами передачи данных, системными вызовами и много с чем еще.

4) Внутреннее устройство Linux (Брайан Уорд). Хорошо читается после Linux API, дополняет материал и затрагивает важные аспекты, которые не рассматриваются в п.3.

LinuxCamp | #top
👍52🔥9❤‍🔥5
Настройка прав по умолчанию

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


$ ls -l
-rw-r--r-- ... dhcpcd.conf


Команда umask (встроена в оболочку) позволяет настроить те самые права, которые будут применимы по умолчанию к ресурсам при их создании.

Ранее мы затрагивали права в:

1) разница между chmod и chown;
2) файл групп /etc/group;
3) шпаргалка по правам доступа;

Немного вспомним наши права

В общем случае права доступа в UNIX разбиты на три категории: u (user), g (group), o (other).

Каждая категория имеет три типа битов, которые различны для файлов и каталогов.

Для файлов:

r (read, 4, 100) – чтение файла.
w (write, 2, 010) – изменение файла.
x (execute, 1, 001) – выполнение файла как программы.

Для каталогов:

r (read, 4, 100) – чтение списка файлов.
w (write, 2, 010) – изменение и создание файлов в каталоге.
x (execute, 1, 001) – открытие файлов в каталоге.

Когда создаётся новый ресурс, система назначает ему максимально возможные права: файлы (666 = rw-rw-rw-), каталоги (777 = rwxrwxrwx).

Как работает umask

Суть работы команды - не добавить права, а ограничивает их, убрав заданные биты доступа.

Итоговый набор бит рассчитывается довольно просто: от максимальных прав отнимается маска.

Дефолтное значение маски обычно следующее:


$ umask
0002


Поэтому права по умолчанию для файла будут:


666 - 002 = 664


-rw-rw-r--


А для каталога:


777 - 002 = 775


drwxrwxr-x


Важное замечание: с помощью маски не получится сохранить либо исключить бит выполнения "x" для файлов. Этот флаг можно обработать только для каталогов:


$ umask 010
$ mkdir newdir
$ ls -l

drwxrw-rwx ... newdir


Напомню, что права файла рассчитываются на основе адского набора "666", где выполнение уже отключено.

Формы синтаксиса umask

У команды довольно простой синтаксис и несколько способов определения маски:


$ umask опции восьмеричная_маска


$ umask опции u=права,g=права,o=права


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


$ umask
0002


$ umask -S
u=rwx,g=rwx,o=rx


Способы задания маски

Вообще, маска может определяться 4 цифрами, но первую можно опустить, т.к. она не используется:


$ umask 002


$ umask
0002


Команда umask работает с цифрами справа налево, поэтому незначащие нули можно тоже опустить, по необходимости:


$ umask 77


$ umask
0077


Маску можно задать и с помощью более традиционных обозначений:


$ umask u=rwx,g=rwx,o=


В таком формате оно, как пишется, так и понимается - работает по принципу chmod.

Мы не исключаем "rwx" для пользователя и группы, а чистим все права для "остальных" персон. Такая запись равна маске "007":


$ umask
0007


$ touch filetest
$ ls -l
-rw-rw---- ... filetest


Группы прав также можно объединять:


$ umask ug=rwx,o=rx


Или же задавать сразу для всех категорий, использовав "a" (all):


$ umask a=rwx


Также можно работать с отдельными правами. Оператором "+" или "-" можно разрешить или запретить целевое действие:


$ umask -S ug-w
u=rx,g=rx,o=rx


$ umask -S a+w
u=rwx,g=rwx,o=rwx


Можно и комбинировать два предыдущих способа. Например, разрешить пользователю все операции, а группе и остальным убрать право на чтение:


$ umask u=rwx,go-r


LinuxCamp | #utils
👍26🔥11❤‍🔥7👎1
This media is not supported in your browser
VIEW IN TELEGRAM
Когда уронил прод и готовишься пересекать границу вплавь)

LinuxCamp | #memes
😁44👍76
Как получить доступ к данным iso образа?

Когда я решал проблему с переделкой iso образа - первой ступенью была задача понять то, как можно получить доступ к его внутрянке. Тыкался-мыкался и что-то, вроде, понял) Об этом и поговорим.

Так, а чем по своей сути вообще является iso файл? Грубо говоря, это несжатый архив с точной копией данных блочного устройства (hdd, ssd, cd) в формате файловой системы ISO9660:


$ file linuxmint-22.1-xfce-64bit.iso

linuxmint-22.1-xfce-64bit.iso: ISO 9660 CD-ROM filesystem data (DOS/MBR boot sector) ... (bootable)


В зависимости от содержимого образ может быть загрузочным и не загрузочным. Давайте из приведенного выше описания iso-шника выведем возможные способы работы с ним:

1) он представляет собой архив - его можно распаковать;
2) он содержит файловую систему ISO9660 - его можно монтировать;

Начнем с "распакоуки". Для этого можем воспользоваться утилитой 7z:


$ sudo apt install p7zip-full
$ 7z x linux*.iso -o./extract


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

Второй способ - монтировать образ и скопировать его содержимое.

В привычном для нас понимании, монтирование относится к блочным устройствам (usb, ssd, hdd), которые содержат определенную файловую систему (exFAT, ext, zfs). Такой механизм позволяет нам получить доступ к содержимому носителей.

Но вот в чем дело, iso файл не является блочным устройством и его нельзя просто так примонтировать... Ничего, есть решение - механизм loop device.

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

Посмотреть то, какое устройство с каким ресурсом соотносится, можно через команду losetup:


$ sudo losetup -a
/dev/loop13: [64512]:2672215 (/path/to/output.iso)


Для того, чтобы создать и монтировать "loop device", используем mount:


$ sudo mount -o loop test.iso ./mnt_point


Теперь, т.к. файловая система ISO9660 является "read-only", нам нужно скопировать все содержимое образа в отдельный каталог:


$ mkdir new_mnt_point
$ cp -rT mnt_point new_mnt_point


Далее "по уму" редактируем образ и пересобираем его с помощью mkisofs:


$ sudo mkisofs -o ./new.iso -quiet -R -b boot/grub/bios.img -no-emul-boot -boot-load-size 4 -boot-info-table ./new_mnt_point


Если все сделано правильно, на выходе мы получим "bootable" образ.

LinuxCamp | #filesystem
🔥46👍25👏51
Прокачиваемся в tr

Сегодня у нас на разборе одна из культовых утилит "tr". Используется она для форматирования текста: удаления и замены символов.

Чаще всего можно встретить в паре со сторонними командами, которые выводят в stdout текстовый поток: cat, head, echo и т.д.

Команда имеет следующий вид:


$ tr флаг SET1 [SET2]


Сетами представлены наборы символов, с которыми tr будет работать. Второй набор не всегда используется.

Команда разбирает текст посимвольно и выполняет операцию для каждого элемента отдельно.

Флаги команды tr:

1) -d (--delete): удаляет элементы из первого набора:


$ echo "Hello 123 world" | tr -d ' a-zA-Z'
123


2) -c (--complement): обработать каждый символ, который не входит в набор "SET1":


$ echo "Hello 123 world" | tr -cd 'a-zA-Z\n'
Helloworld


В примере мы удалили все символы, которые не входят в перечисление 'a-zA-Z\n';

Таким же макаром можно все буквы удалить и оставить только цифры:


$ cat customer.csv
USA,1234567890
Canada,0987654321

$ cat customer.csv | tr -cd '0-9\n'
1234567890
0987654321


3) -s (--squeeze-repeats): cжимает повторяющиеся символы из первого набора до одного:


$ echo "Hello World" | tr -s ' '
Hello World


4) -t (--truncate-set1): обрезает первый набор до длины второго:


$ echo "abcdef" | tr -t 'abcdef' '123'
123def


Если длина первого набора больше и мы не указываем флаг, каждый последующий его символ, который (по номеру > конец "SET2"), будет заменен:


$ echo "abcdef" | tr 'abcdef' '123'
123333


При своем дефолтном поведении, программа заменяет символы из "SET1" на элементы "SET2":


$ echo "Hello World" | tr 'a-z' 'A-Z'
HELLO WORLD


Команда умеет парсить шаблоны: [:upper:], [:lower:] и т.д. Детальнее можно ознакомиться в мануале:


$ echo "hello world" | tr [:lower:] [:upper:]
HELLO WORLD


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


$ cat infile
www.baeldung.com

$ tr 'a-z' 'A-Z' < infile
WWW.BAELDUNG.COM


Измененные данные нужно куда-то записать? Правильно, перенаправляем вывод:


$ tr 'a-z' 'A-Z' < infile > outfile


LinuxCamp | #utils
🔥40👍29❤‍🔥54🎉1🌭1
Инъекция пользы

Если хотим передать файлы или каталоги с локальной системы на удаленный ssh сервер или наоборот, используем команды: scp и sftp.

Скопируем файл с удаленного хоста в локальный каталог:


$ scp user@host:/path/to/file /local/dir


Скопируем файлы с локального компьютера на удаленный хост:


$ scp /local/dir/file user@host:/remote/dir


Скопируем файл с одного удаленного хоста на другой:


$ scp user1@host1:/remote/file user2@host2:/remote/dir


Прога sftp не требует постоянно указывать адрес ssh сервера. Вместо этого мы подключаемся к нему один раз и используем интерфейс get и put:


$ sftp user@host
sftp> get /remote/dir/file /local/dir
sftp> put /local/dir/file /remote/dir


Для передачи каталогов используем флаг "-r":


$ scp -r /local/dir user@host:/remote/dir
$ sftp> put -r /local/dir /remote/dir


Также хочется отметить, что sftp имеет важное преимущество перед обычным ftp — она не требует, чтобы на удаленном узле работал сервер FTP. Ей необходим только SSH.

LinuxCamp | #microhelp
👍33🔥28❤‍🔥41😁1
Итоги квартала

По традиции набросал сводку ключевых постов (декабрь - февраль 2025):

Сигналы

1. Отправка сигналов: kill()
2. Отправка сигнала самому себе: raise()
3. Защита от незваных гостей: сигнальная маска
4. Работа с ожидающими сигналами
5. Перехватывай сигналы, как профи: sigaction()
6. Функции для работы с набором сигналов

Потоки ввода-вывода

1. Потоки ввода-вывода: stdout, stderr, stdin
2. Операторы перенаправления ввода-вывода: >, >>
3. Операторы перенаправления ввода-вывода: <, <<
4. Операторы перенаправления ввода-вывода: |

Оболочка

1. Шаблоны командной оболочки: *, ?, []
2. Вычисление переменных в оболочке
3. Условные списки: ||, &&
4. Подстановка вывода команды: $()
5. Передача команды в качестве bash аргумента
6. Выполнение команды в подоболочке: ()
7. Расширение команд с помощью {}

Задания

1. Фоновое выполнение команд и задания
2. Команды управления заданиями: fg, bg, jobs
3. Проблема с вводом-выводом в фоновом выполнении

Разбор команд

1. Автоматизация задач с xargs
2. Xargs и флаги: -L, -t
3. Практика использования xargs
4. Управление буфером обмена: xclip
5. Прокачиваемся в grep
6. Просмотр файлов: head и tail
7. Прокачиваемся в find
8. Прокачиваемся в cp
9. Настройка прав по умолчанию: umask
10. Прокачиваемся в tr

Базовый linux:

1. Раскрываем завесу тайн над устройствами
2. Что такое /dev/null и почему туда направляют данные?

Личные практики:

1. Не самый стандартный способ использовать syslog
2. Как я потрошил iso образ
3. Как получить доступ к данным iso образа?

Рекомендации

1. Топ ресурсов по изучению Linux

LinuxCamp | #sumup
1🔥57👍24❤‍🔥42
Перемещайся по файловой системе как флеш: CDPATH

Многие из вас умеют быстро ходить по файловой системе через автодополнение пути по TAB, использование '~' для указания домашнего каталога или команде "cd -", которая позволяет переключаться между текущим и прежним каталогами:


$ cd -
/home/xoadmin/Documents

$ cd -
/home/xoadmin/Music


Но этого мало для того, чтобы считать себя профи. Предположим, у вас есть важный каталог "/home/smith/Family/Memories/Photos", который вы часто посещаете.

Скорее всего, чтобы попасть в него, вы введете путь:


$ cd ~/Family/Memories/Photos


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


$ cd Photos


Если вы не сидите где-то, где есть подкаталог Photos, то получите ошибочку:


bash: cd: Photos: No such file or directory


Можно сделать так, чтобы команда cd проверяла дополнительные пути помимо текущего каталога. Для этого нужно перечислить их в переменной CDPATH:


$ CDPATH=$HOME/Family/Memories
$ pwd
/etc
$ cd Photos
/home/smith/Family/Memories/Photos


Несколько каталогов можно указать через разделитель:


$ CDPATH=$HOME:$HOME/Projects:$HOME/Family/Memories:/usr/local


Итого: определяем переменную либо в локальном "~/.bashrc" либо в глобальном "/etc/profile" и перечисляем в ней самые популярные каталоги поиска.

Для меня это, допустим, каталог "Sources", в котором лежат исходники различных утилит:


$ echo $CDPATH
/home/xoadmin/Sources


$ pwd
/home/xoadmin/Music

$ cd picom
/home/xoadmin/Sources/picom


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

LinuxCamp | #utils
🔥47👍3212
Разница между su и su -

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

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

Бывает, приходится, работая в сессии одного пользователя, переключиться на другого, например, чтобы использовать ресурсы, ограниченные правами доступа. Для этого мы используем команду "su" (substitute user), которая позволяет сменить пользователя в текущей оболочке:


$ su vasya


После того, как мы выполним команду, создастся дочерняя оболочка, которая переймет все переменные окружения родителя, определит пользовательские (USER, HOME ...) и выполнит локальные "Васины" скрипты: /home/vasya/.bashrc и т.д.:


$ export USER1VAR="vasya"

$ su xoadmin
$ printenv | grep USER
USER=xoadmin
USER1VAR=vasya


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

Если нужно полностью воссоздать среду, как при чистом входе в систему, следует использовать "su -":


$ su - xoadmin


Окружение родителя мы не наследуем и запускаем оболочку типа "login shell", которая выполнит дополнительные скрипты инициализации "/etc/profile", "~/.bash_profile". Подробнее про типы оболочек говорили вот тут, а про этапы их инициализации тут.

Также, когда мы используем "su -", наш рабочий каталог переключается на домашний для целевого пользователя. Мелочь, но факт:


$ pwd
/home/vasya/Music
$ su - xoadmin
$ pwd
/home/xoadmin


LinuxCamp | #shell
👍78🔥15❤‍🔥85
Стрелка за 200 в работе с файловой системой

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

Использовать "cd -" не вариант, т.к. оболочка запоминает только 1 прошлый каталог. Можно использовать CDPATH, но тогда нужно запоминать названия директорий, с которыми работаем.

Команды оболочки pushd, popd и dirs позволяют обойти это ограничение. Предположим, вы создаете локальный сайт и работаете с ресурсами:


/var/www/html
/etc/apache2
/etc/ssl/certs
~/Web/src


Быстро переключаться между ними можно с помощью функции оболочки - "стеком каталогов".

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

Просмотреть стек можно, используя команду dirs:


$ dirs
/etc/ssl/certs /etc/apache2 /var/www/html ~/Web/src


Вывод команды можно напечатать столбцом "-p":


$ dirs -p
/etc/ssl/certs
/etc/apache2
...


А можно и пронумеровать "-v". Это нам позволит вдальнейшем удобнее переключаться между каталогами:


$ dirs -v
0 /etc/ssl/certs
1 /etc/apache2
...


Вы управляете стеком, выполняя две операции: pushing и popping (есть, кста, такой стиль танца - весело выглядит).

Pushing каталога добавляет его в начало списка (вершину стека) и переходит в него:


$ pushd /etc/apache2
/etc/apache2 /var/www/html


Для того, чтобы только добавить каталог в стек и не переходить на него, нужно использовать флаг "-n".

Popping удаляет верхний каталог из стека и возвращает нас на следующий за ним:


$ popd
/var/www/html


Если хотим полностью очистить стек, тогда либо выполняем "dirs -c", либо зовем popd до тех пор, пока не увидим:


$ popd
bash: popd: directory stack empty


Принцип работы со стеком заключается в том, что мы добавляем туда каталоги, после чего прыгаем по ним, используя аргументы для pushd и popd, которые рассмотрим далее.

LinuxCamp | #shell
👍39🔥17❤‍🔥3👎1
Практика использования: pushd, popd, dirs

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


$ pushd /var/www/html
/var/www/html ~/Web/src

$ pushd /etc/apache2
/etc/apache2 /var/www/html ~/Web/src

$ pushd /etc/ssl/certs
/etc/ssl/certs /etc/apache2 /var/www/html ~/Web/src


Команда pushd без аргументов меняет местами два верхних каталога в стеке и переходит к новому верхнему. Давайте несколько раз переместимся между "/etc/ssl/certs" и "/etc/apache2":


$ pwd
/etc/ssl/certs

$ pushd
/etc/apache2 /etc/ssl/certs /var/www/html ~/Web/src

$ pushd
/etc/ssl/certs /etc/apache2 /var/www/html ~/Web/src


Что делать, если нужно перейти в другие каталоги стека, помимо двух верхних? pushd и popd принимают целочисленные аргументы для данной задачи. Давайте для наглядности выведем текущий стек в столбец:


$ dirs -v
0 /etc/ssl/certs
1 /etc/apache2
2 /var/www/html
3 ~/Web/src


Команда "pushd +N" сдвигает N каталогов с вершины стека в самый низ, а затем переходит к новому верхнему. Если нужно попасть в "/var/www/html" и сохранить структуру стека, используем:


$ pushd +2
/var/www/html ~/Web/src /etc/ssl/certs /etc/apache2


Отрицательный аргумент (-N) сдвигает каталоги в противоположном направлении. Чтобы перейти к каталогу в нижней части стека, можно либо сдвинуть все, кроме последнего, либо просто использовать "pushd -0":


$ dirs
/etc/apache2 /etc/ssl/certs ~/Web/src /var/www/html

$ pushd -0
/var/www/html /etc/apache2 /etc/ssl/certs ~/Web/src


Можно также удалять каталоги из стека, используя popd с аргументом. Команда "popd +N" удаляет каталог, расположенный на позиции N, из стека. Отрицательный аргумент (-N) означает отсчет снизу. Подсчет начинается с нуля, поэтому "popd +1" удаляет второй каталог сверху:


$ dirs
/var/www/html /etc/apache2 /etc/ssl/certs ~/Web/src

$ popd +1
/var/www/html /etc/ssl/certs ~/Web/src

$ popd +2
/var/www/html /etc/ssl/certs


Будьте аккуратны и внимательны. Если вы используете команду cd, то самый верхний элемент стека затрется на текущий активный каталог. Эту проблему мы научимся решать в пятницу)

LinuxCamp | #shell
🔥24👍165
Команда «ой, я забыл pushd»

Предыдущие посты по стеку каталогов: тут и тут.

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


$ dirs
~/Web/src /var/www/html /etc/apache2

$ cd /etc/ssl/certs

$ dirs
/etc/ssl/certs /var/www/html /etc/apache2


Команда cd заменила каталог "~/Web/src" на "/etc/ssl/certs". Не волнуйтесь, чтобы все это дело пофиксить, нужно запустить pushd с дефисом:


$ pushd -
~/Web/src /etc/ssl/certs /var/www/html /etc/apache2


Команда работает практически аналогично "cd -": добавляет прошлый активный каталог в стек и переходит на него. Теперь к нам вернется потерянный каталог и сохранится тот, в который мы перешли через cd.

Если мы через cd куда-то перешли, осознали проблему, но менять каталог не хотим, используем pushd дважды. Для удобства еще и alias определим:


$ pushd -
~/Web/src /etc/ssl/certs

$ pushd
/etc/ssl/certs ~/Web/src


alias slurp='pushd - && pushd'


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

LinuxCamp | #shell
🔥24👍15❤‍🔥31
Как менять пароли?

Для смены либо создания пароля в linux используется команда passwd. Если пользователь без root прав, то он сможет сменить только свой пароль. Если привилегирован, то сможет менять разным юзерам.

Смена собственного пароля:


$ passwd

Changing password for vitek
current password:
Enter new password:
Retype new password:


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


$ sudo passwd vasya

New password:
Retype new password:


Все, можем сообщить Васе пароль и пусть пользуется системой:


$ su - vasya
Password:
vasya@ubuntu-desktop:~$


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


$ sudo passwd -e vasya
$ sudo su - vasya

You are required to change your password immediately...
Changing password for vasya.
Current password:
New password:
Retype new password:


LinuxCamp | #microhelp
👍49🔥16🤯2💩2
Channel name was changed to «LinuxCamp | DevOps»
Как я познакомился с Димасом Dbus-ом

В общем-то, с dbus я уже был ранее знаком, но последние рабочие такски заставили меня прибегнуть к практике. Если кто не в танке, dbus (Desktop Bus) - это система межпроцессного взаимодействия в Linux. Позволяет она удобно из одного приложения дергать код другого, подписываться на сигналы и передавать информацию.

Задача была следующая - на стороне приложения отслеживать профили энергопотребления системы (balanced, powersave, performance) и корректировать поведение для экономии заряда либо выдавать сверх производительность.

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

1) tuned (com.redhat.tuned) - приложение, которым можно переключать и отслеживать профили. Можно использовать независимо от окружения;

2) PowerManagement (org.kde.Solid.PowerManagement) - kde модуль, который позволяет отслеживать состояние батареи: идет ли питание от провода, низкий ли заряд и т.д.;

По итогу, через PowerManagement получилось отследить 3 состояния: AC (питание по проводу), Battery и LowBattery. Если хотите проверить у себя:


$ qdbus org.kde.Solid.PowerManagement /org/kde/Solid/PowerManagement org.kde.Solid.PowerManagement.currentProfile


Полный интерфейс вывести можно вот так:


$ busctl --user introspect org.kde.Solid.PowerManagement /org/kde/Solid/PowerManagement


Приложение tuned позволило более гибко настроить приложуху и отследить профили (balanced, powersave, performance), которые могут выставляться независимо от заряда батареи. Узнать профиль:


dbus-send --system --dest=com.redhat.tuned --type=method_call --print-reply /Tuned com.redhat.tuned.control.active_profile


Вывести полный интерфейс:


$ busctl --system introspect com.redhat.tuned /Tuned


Конечно же для языка C у нас есть либа (libdbus), через которую аналогичную процедуру можно реализовать кодом. Задача еще в работе, поэтому по мере своего продвижения в dbus буду постить полезности.

LinuxCamp | #story
👍28🔥14❤‍🔥4🌚1🗿1
Утилиты для работы с DBus сервисами

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

1) qdbusviewer: графическая Qt утилита, которая позволяет просматривать активные сервисы в которые можно постучаться по системной (system bus) или пользовательской (session bus) шине. Она предоставляет удобный интерфейс для работы с объектами, методами и сигналами.


$ sudo apt install qttools5-dev-tools
$ qdbusviewer


2) dbus-send: низкоуровневый cmd инструмент, который позволяет вручную отправлять запросы к сервисам:


$ sudo apt install dbus
$ dbus-send --system --dest=com.redhat.tuned --type=method_call --print-reply /Tuned com.redhat.tuned.control.active_profile


Подписаться на сигнал через "dbus-send" не получится, для этого нужны утилиты, которые умеют прослушивать сервисы в реальном времени - "dbus-monitor".

3) dbus-monitor: выводит на консоль информацию о сигналах в момент их получения либо о методах в момент вызова:


$ dbus-monitor "type='method_call',interface='org.kde.Solid.PowerManagement'"


Входит в пакет dbus. Хорошо мне подходил для дебага. Я сначала пытался отследить сигнал - если приходит отбивка, значит сервис активен, интерфейс верный и можно переходить к коду.

4) busctl: современный аналог dbus-send, включен в systemd. С помощью утилиты можно вызывать (busctl call) методы и прослушивать (busctl monitor) события. Также можно выводить список узлов на пользовательской и системной шинах:


$ sudo apt install systemd

$ busctl call com.redhat.tuned /Tuned com.redhat.tuned.control active_profile

$ busctl --system monitor "com.redhat.tuned.control" "profile_changed"


$ busctl --user list
$ busctl --system list


LinuxCamp | #utils
👍26❤‍🔥84
Залутал гуся на cpp конфе 🐥
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥96😁14👍9❤‍🔥53
В смысле DevOps?

Друзья, вижу ваше негодование по поводу добавления DevOps к каналу) И прям читаю мысли: "Где тут вообще DevOps?!" Так вот, правки внесены не просто так.

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

Посты от редакторов будем маркировать тегом: by + имя (#bymaga).

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

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

LinuxCamp | #info
🔥51👍22❤‍🔥5💊21🍾1👨‍💻1