Как я потрошил iso образ
Был обычный рабочий день: я усердно делил пиццу на равные части. Все шло гладко, как вдруг прилетает тикет с крайне необычным багом - в virtualbox ломается рендер рабочего стола... И это происходит в момент работы с загрузчиком ОС.
Надо что-то делать, т.к. впечатления после такого, скажем, не очень.
Немного помозговав, было принято решение вскрыть ISO образ и подменить несколько бинарников для проверки работоспособности предыдущих версий.
Почему нельзя просто обновить пакеты после установки ОС? Баг воспроизводился в очень специфических условиях, исключительно при первом запуске live образа.
Честно говоря, ранее я не особо вникал в структуру iso-шников и это был первый опыт их пересборки. Сейчас расскажу о нескольких фейлах.
Первое время я пытался подменить deb пакет, т.к. думал, что именно он будет распакован в момент первого запуска. Подменил и как же удивился, когда ничего не поменялось и "dpkg -l" показал изначальную версию))
Оказалось, что пакеты распаковываются, но не сразу, а когда система выполняет финальную "доустановку".
Далее я осмелился посмотреть через "ls -l" расширенные параметры бинарника и увидел, что он не только что поставлен, а был вшит в образ еще на этапе сборки.
И тут я задался вопросом: "Стоп, а как в iso образе представлена файловая система для live пользователя, от которого мы выполняем базовую настройку системы?". В процессе страшного ресерча до меня дошло, что она сжата в:
И если мы "разожмем" ее через:
То увидим внутри что-то очень знакомое:
Именно тут-то и сидели те самые бинари, которые изначально требовалось подменить. Дальше пазл примерно сложился, я обратно собрал всю эту иерархию в ".squashfs":
После упаковал новый iso образ, отладил багу и проработал фикс. На всякий, сразу приложу команду, которой готовил образы:
В общем, вот такой интересный опыт был получен. Как вы, вообще, хотите больше поговорить о файловых системах, внутрянке iso образов, grub?
LinuxCamp | #story
Был обычный рабочий день: я усердно делил пиццу на равные части. Все шло гладко, как вдруг прилетает тикет с крайне необычным багом - в 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❤🔥3❤2🤔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
Сегодня выдам персональный список ресурсов (книги, видео), по которым можно на вполне достойном уровне освоить 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
Настройка прав по умолчанию
Каждому файлу или каталогу присваивается ряд дефолтных прав, которые определяют кто и как может им распоряжаться:
Команда 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
Суть работы команды - не добавить права, а ограничивает их, убрав заданные биты доступа.
Итоговый набор бит рассчитывается довольно просто: от максимальных прав отнимается маска.
Дефолтное значение маски обычно следующее:
Поэтому права по умолчанию для файла будут:
А для каталога:
Важное замечание: с помощью маски не получится сохранить либо исключить бит выполнения "x" для файлов. Этот флаг можно обработать только для каталогов:
Напомню, что права файла рассчитываются на основе адского набора "666", где выполнение уже отключено.
Формы синтаксиса umask
У команды довольно простой синтаксис и несколько способов определения маски:
Посмотреть текущее значение маски можно двумя способами:
Способы задания маски
Вообще, маска может определяться 4 цифрами, но первую можно опустить, т.к. она не используется:
Команда umask работает с цифрами справа налево, поэтому незначащие нули можно тоже опустить, по необходимости:
Маску можно задать и с помощью более традиционных обозначений:
В таком формате оно, как пишется, так и понимается - работает по принципу chmod.
Мы не исключаем "rwx" для пользователя и группы, а чистим все права для "остальных" персон. Такая запись равна маске "007":
Группы прав также можно объединять:
Или же задавать сразу для всех категорий, использовав "a" (all):
Также можно работать с отдельными правами. Оператором "+" или "-" можно разрешить или запретить целевое действие:
Можно и комбинировать два предыдущих способа. Например, разрешить пользователю все операции, а группе и остальным убрать право на чтение:
LinuxCamp | #utils
Каждому файлу или каталогу присваивается ряд дефолтных прав, которые определяют кто и как может им распоряжаться:
$ 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
Как получить доступ к данным iso образа?
Когда я решал проблему с переделкой iso образа - первой ступенью была задача понять то, как можно получить доступ к его внутрянке. Тыкался-мыкался и что-то, вроде, понял) Об этом и поговорим.
Так, а чем по своей сути вообще является iso файл? Грубо говоря, это несжатый архив с точной копией данных блочного устройства (hdd, ssd, cd) в формате файловой системы ISO9660:
В зависимости от содержимого образ может быть загрузочным и не загрузочным. Давайте из приведенного выше описания iso-шника выведем возможные способы работы с ним:
1) он представляет собой архив - его можно распаковать;
2) он содержит файловую систему ISO9660 - его можно монтировать;
Начнем с "распакоуки". Для этого можем воспользоваться утилитой 7z:
После завершения процесса мы вольны вносить в файловую структуру свои коррективы. После правок нужно будет заново собрать установочный iso образ. Для этого есть утилитка mkisofs, которая корректно собирает ISO9660 архивы из файлов и каталогов.
Второй способ - монтировать образ и скопировать его содержимое.
В привычном для нас понимании, монтирование относится к блочным устройствам (usb, ssd, hdd), которые содержат определенную файловую систему (exFAT, ext, zfs). Такой механизм позволяет нам получить доступ к содержимому носителей.
Но вот в чем дело, iso файл не является блочным устройством и его нельзя просто так примонтировать... Ничего, есть решение - механизм loop device.
Loop device — это виртуальное блочное устройство, которое позволяет использовать обычный ресурс с файловой системой, как физический девайс. Через него можно смонтировать образ и получить доступ к его файловой системе.
Посмотреть то, какое устройство с каким ресурсом соотносится, можно через команду losetup:
Для того, чтобы создать и монтировать "loop device", используем mount:
Теперь, т.к. файловая система ISO9660 является "read-only", нам нужно скопировать все содержимое образа в отдельный каталог:
Далее "по уму" редактируем образ и пересобираем его с помощью mkisofs:
Если все сделано правильно, на выходе мы получим "bootable" образ.
LinuxCamp | #filesystem
Когда я решал проблему с переделкой 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👏5❤1
Прокачиваемся в tr
Сегодня у нас на разборе одна из культовых утилит "tr". Используется она для форматирования текста: удаления и замены символов.
Чаще всего можно встретить в паре со сторонними командами, которые выводят в stdout текстовый поток: cat, head, echo и т.д.
Команда имеет следующий вид:
Сетами представлены наборы символов, с которыми tr будет работать. Второй набор не всегда используется.
Команда разбирает текст посимвольно и выполняет операцию для каждого элемента отдельно.
Флаги команды tr:
1) -d (--delete): удаляет элементы из первого набора:
2) -c (--complement): обработать каждый символ, который не входит в набор "SET1":
В примере мы удалили все символы, которые не входят в перечисление 'a-zA-Z\n';
Таким же макаром можно все буквы удалить и оставить только цифры:
3) -s (--squeeze-repeats): cжимает повторяющиеся символы из первого набора до одного:
4) -t (--truncate-set1): обрезает первый набор до длины второго:
Если длина первого набора больше и мы не указываем флаг, каждый последующий его символ, который (по номеру > конец "SET2"), будет заменен:
При своем дефолтном поведении, программа заменяет символы из "SET1" на элементы "SET2":
Команда умеет парсить шаблоны: [:upper:], [:lower:] и т.д. Детальнее можно ознакомиться в мануале:
Данные на вход можно получить и через файлик. Для этого мы используем перенаправление:
Измененные данные нужно куда-то записать? Правильно, перенаправляем вывод:
LinuxCamp | #utils
Сегодня у нас на разборе одна из культовых утилит "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❤🔥5❤4🎉1🌭1
Инъекция пользы
Если хотим передать файлы или каталоги с локальной системы на удаленный ssh сервер или наоборот, используем команды: scp и sftp.
Скопируем файл с удаленного хоста в локальный каталог:
Скопируем файлы с локального компьютера на удаленный хост:
Скопируем файл с одного удаленного хоста на другой:
Прога sftp не требует постоянно указывать адрес ssh сервера. Вместо этого мы подключаемся к нему один раз и используем интерфейс get и put:
Для передачи каталогов используем флаг "-r":
Также хочется отметить, что sftp имеет важное преимущество перед обычным ftp — она не требует, чтобы на удаленном узле работал сервер FTP. Ей необходим только SSH.
LinuxCamp | #microhelp
Если хотим передать файлы или каталоги с локальной системы на удаленный 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❤🔥4❤1😁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
По традиции набросал сводку ключевых постов (декабрь - февраль 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❤🔥4❤2
Перемещайся по файловой системе как флеш: CDPATH
Многие из вас умеют быстро ходить по файловой системе через автодополнение пути по TAB, использование '~' для указания домашнего каталога или команде "cd -", которая позволяет переключаться между текущим и прежним каталогами:
Но этого мало для того, чтобы считать себя профи. Предположим, у вас есть важный каталог "/home/smith/Family/Memories/Photos", который вы часто посещаете.
Скорее всего, чтобы попасть в него, вы введете путь:
Да, но было бы круто сократить этот путь до Photos, независимо от того, где мы находимся:
Если вы не сидите где-то, где есть подкаталог Photos, то получите ошибочку:
Можно сделать так, чтобы команда cd проверяла дополнительные пути помимо текущего каталога. Для этого нужно перечислить их в переменной CDPATH:
Несколько каталогов можно указать через разделитель:
Итого: определяем переменную либо в локальном "~/.bashrc" либо в глобальном "/etc/profile" и перечисляем в ней самые популярные каталоги поиска.
Для меня это, допустим, каталог "Sources", в котором лежат исходники различных утилит:
Если нужно быстро переключиться на другой проект, я не буду вводить полный путь до него и укажу только название.
LinuxCamp | #utils
Многие из вас умеют быстро ходить по файловой системе через автодополнение пути по 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👍32❤12
Разница между su и su -
Ни для кого не секрет, что Linux - система, с которой можно работать от разных пользователей. Сегодня я запускаю сессию от Паши, завтра от Пети.
Когда вы в сессии открываете терминал, стартует оболочка, которая подстраивает окружение под конкретного юзера: выполняет скрипты, определяет переменные.
Бывает, приходится, работая в сессии одного пользователя, переключиться на другого, например, чтобы использовать ресурсы, ограниченные правами доступа. Для этого мы используем команду "su" (substitute user), которая позволяет сменить пользователя в текущей оболочке:
После того, как мы выполним команду, создастся дочерняя оболочка, которая переймет все переменные окружения родителя, определит пользовательские (USER, HOME ...) и выполнит локальные "Васины" скрипты: /home/vasya/.bashrc и т.д.:
Чет какая-то каша выходит. Половина Васиных переменных, половина юзера xoadmin. Такой способ полезен, когда нам нужно быстро поменять пользователя и не требуется его окружение в изначальном виде.
Если нужно полностью воссоздать среду, как при чистом входе в систему, следует использовать "su -":
Окружение родителя мы не наследуем и запускаем оболочку типа "login shell", которая выполнит дополнительные скрипты инициализации "/etc/profile", "~/.bash_profile". Подробнее про типы оболочек говорили вот тут, а про этапы их инициализации тут.
Также, когда мы используем "su -", наш рабочий каталог переключается на домашний для целевого пользователя. Мелочь, но факт:
LinuxCamp | #shell
Ни для кого не секрет, что 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❤🔥8❤5
Стрелка за 200 в работе с файловой системой
Представим такой рабочий процесс, когда нам нужно перемещаться между 4 каталогами, расположенными по совершенно разным путям.
Использовать "cd -" не вариант, т.к. оболочка запоминает только 1 прошлый каталог. Можно использовать CDPATH, но тогда нужно запоминать названия директорий, с которыми работаем.
Команды оболочки pushd, popd и dirs позволяют обойти это ограничение. Предположим, вы создаете локальный сайт и работаете с ресурсами:
Быстро переключаться между ними можно с помощью функции оболочки - "стеком каталогов".
Стек каталогов — это список директорий, которые вы посетили и решили отслеживать в текущем экземпляре оболочки. Изначально он содержит только текущий путь.
Просмотреть стек можно, используя команду dirs:
Вывод команды можно напечатать столбцом "-p":
А можно и пронумеровать "-v". Это нам позволит вдальнейшем удобнее переключаться между каталогами:
Вы управляете стеком, выполняя две операции: pushing и popping (есть, кста, такой стиль танца - весело выглядит).
Pushing каталога добавляет его в начало списка (вершину стека) и переходит в него:
Для того, чтобы только добавить каталог в стек и не переходить на него, нужно использовать флаг "-n".
Popping удаляет верхний каталог из стека и возвращает нас на следующий за ним:
Если хотим полностью очистить стек, тогда либо выполняем "dirs -c", либо зовем popd до тех пор, пока не увидим:
Принцип работы со стеком заключается в том, что мы добавляем туда каталоги, после чего прыгаем по ним, используя аргументы для pushd и popd, которые рассмотрим далее.
LinuxCamp | #shell
Представим такой рабочий процесс, когда нам нужно перемещаться между 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 без аргументов меняет местами два верхних каталога в стеке и переходит к новому верхнему. Давайте несколько раз переместимся между "/etc/ssl/certs" и "/etc/apache2":
Что делать, если нужно перейти в другие каталоги стека, помимо двух верхних? pushd и popd принимают целочисленные аргументы для данной задачи. Давайте для наглядности выведем текущий стек в столбец:
Команда "pushd +N" сдвигает N каталогов с вершины стека в самый низ, а затем переходит к новому верхнему. Если нужно попасть в "/var/www/html" и сохранить структуру стека, используем:
Отрицательный аргумент (-N) сдвигает каталоги в противоположном направлении. Чтобы перейти к каталогу в нижней части стека, можно либо сдвинуть все, кроме последнего, либо просто использовать "pushd -0":
Можно также удалять каталоги из стека, используя popd с аргументом. Команда "popd +N" удаляет каталог, расположенный на позиции N, из стека. Отрицательный аргумент (-N) означает отсчет снизу. Подсчет начинается с нуля, поэтому "popd +1" удаляет второй каталог сверху:
Будьте аккуратны и внимательны. Если вы используете команду cd, то самый верхний элемент стека затрется на текущий активный каталог. Эту проблему мы научимся решать в пятницу)
LinuxCamp | #shell
И так, вернемся к задаче, над которой начали работать тут. Для того, чтобы быстро переключаться между 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👍16❤5
Команда «ой, я забыл pushd»
Предыдущие посты по стеку каталогов: тут и тут.
Предположим, вы перемещаетесь между несколькими директориями с помощью pushd, а потом случайно запускаете cd и теряете первый элемент стека:
Команда cd заменила каталог "~/Web/src" на "/etc/ssl/certs". Не волнуйтесь, чтобы все это дело пофиксить, нужно запустить pushd с дефисом:
Команда работает практически аналогично "cd -": добавляет прошлый активный каталог в стек и переходит на него. Теперь к нам вернется потерянный каталог и сохранится тот, в который мы перешли через cd.
Если мы через cd куда-то перешли, осознали проблему, но менять каталог не хотим, используем pushd дважды. Для удобства еще и alias определим:
Такой прием, конечно, не поможет, если мы несколько раз через cd походили по разным местам. Тут нужно вовремя раздуплиться, иначе придется вводить полный путь.
LinuxCamp | #shell
Предыдущие посты по стеку каталогов: тут и тут.
Предположим, вы перемещаетесь между несколькими директориями с помощью 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❤🔥3❤1
Как менять пароли?
Для смены либо создания пароля в linux используется команда passwd. Если пользователь без root прав, то он сможет сменить только свой пароль. Если привилегирован, то сможет менять разным юзерам.
Смена собственного пароля:
А теперь представим, что за нашей системой работает образный "Васек", который забыл свой пароль. Мы, будучи админом, можем создать для "Васька" новый пароль и пустить его в систему:
Все, можем сообщить Васе пароль и пусть пользуется системой:
А если мы, как админ, заметили, что у пользователя слабый пароль, то можем принудительно сделать его недействительным и заставить юзера обновить данные при следующей попытке входа. Для этого добавим флаг "-e":
LinuxCamp | #microhelp
Для смены либо создания пароля в 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
Как я познакомился с Димасом 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. Если хотите проверить у себя:
Полный интерфейс вывести можно вот так:
Приложение tuned позволило более гибко настроить приложуху и отследить профили (balanced, powersave, performance), которые могут выставляться независимо от заряда батареи. Узнать профиль:
Вывести полный интерфейс:
Конечно же для языка C у нас есть либа (libdbus), через которую аналогичную процедуру можно реализовать кодом. Задача еще в работе, поэтому по мере своего продвижения в dbus буду постить полезности.
LinuxCamp | #story
В общем-то, с 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) шине. Она предоставляет удобный интерфейс для работы с объектами, методами и сигналами.
2) dbus-send: низкоуровневый cmd инструмент, который позволяет вручную отправлять запросы к сервисам:
Подписаться на сигнал через "dbus-send" не получится, для этого нужны утилиты, которые умеют прослушивать сервисы в реальном времени - "dbus-monitor".
3) dbus-monitor: выводит на консоль информацию о сигналах в момент их получения либо о методах в момент вызова:
Входит в пакет dbus. Хорошо мне подходил для дебага. Я сначала пытался отследить сигнал - если приходит отбивка, значит сервис активен, интерфейс верный и можно переходить к коду.
4) busctl: современный аналог dbus-send, включен в systemd. С помощью утилиты можно вызывать (busctl call) методы и прослушивать (busctl monitor) события. Также можно выводить список узлов на пользовательской и системной шинах:
LinuxCamp | #utils
Пока я решал задачу с профилями энергопотребления, использовал ряд утилит, которые помогали мне взаимодействовать с 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❤🔥8❤4
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥96😁14👍9❤🔥5❤3
В смысле DevOps?
Друзья, вижу ваше негодование по поводу добавления DevOps к каналу) И прям читаю мысли: "Где тут вообще DevOps?!" Так вот, правки внесены не просто так.
К нам присоединяется редактор, который будет отвечать за данную тематику и дополнительно публиковать материалы по сетям.
Посты от редакторов будем маркировать тегом: by + имя (#bymaga).
Попробуем в рамках данного проекта выйти за рамки базового системного администрирования и расширить список рубрик, чтобы быть полезными большему количеству людей.
Если нововведения приживутся, сделаем ультимативный канал, который будет захватывать несколько профилей.
LinuxCamp | #info
Друзья, вижу ваше негодование по поводу добавления DevOps к каналу) И прям читаю мысли: "Где тут вообще DevOps?!" Так вот, правки внесены не просто так.
К нам присоединяется редактор, который будет отвечать за данную тематику и дополнительно публиковать материалы по сетям.
Посты от редакторов будем маркировать тегом: by + имя (#bymaga).
Попробуем в рамках данного проекта выйти за рамки базового системного администрирования и расширить список рубрик, чтобы быть полезными большему количеству людей.
Если нововведения приживутся, сделаем ультимативный канал, который будет захватывать несколько профилей.
LinuxCamp | #info
🔥51👍22❤🔥5💊2❤1🍾1👨💻1
Полезные опции для поиска файлов через grep
Иногда нужно найти один/несколько файлов, содержащих определённую строку в: логах, конфигах или исходном коде. Для этого очень часто под рукой оказывается утилита grep. Для сводки, интересные флаги и регулярные выражения для grep мы рассматривали тута.
По умолчанию команда фильтрует один файл. Для того чтобы выполнять поиск по каталогу, нужно добавить флаг "-r":
Если хотим подсветить вхождения цветом, используем опцию "--color=always":
Опции "-C, -B, -A" вообще имбовые, использую их целую неделю) Вы можете включить отображение не только текущей строки, в которой было найдено вхождение, но и n строк до/после:
1) -C: выводит n строк до и после вхождения;
2) -B: выводит n строк перед вхождением;
3) -A: выводит n строк после вхождения;
Если наш шаблон поиска походит на регулярное выражения, нужно использовать флаг "-F". Таким образом мы говорим команде искать ровно то, что мы запросили - без скрытых подтекстов.
Без флага мы получим строки, в которых присутствует хотя бы 1 символ из набора (H, e, l, o). С флагом получим строки с буквальным совпадением:
LinuxCamp | #utils
Иногда нужно найти один/несколько файлов, содержащих определённую строку в: логах, конфигах или исходном коде. Для этого очень часто под рукой оказывается утилита grep. Для сводки, интересные флаги и регулярные выражения для grep мы рассматривали тута.
По умолчанию команда фильтрует один файл. Для того чтобы выполнять поиск по каталогу, нужно добавить флаг "-r":
$ grep -r "root" /etc/
/etc/mdadm/mdadm.conf:MAILADDR root
...
Если хотим подсветить вхождения цветом, используем опцию "--color=always":
$ grep --color=always -r "root" /etc/
Опции "-C, -B, -A" вообще имбовые, использую их целую неделю) Вы можете включить отображение не только текущей строки, в которой было найдено вхождение, но и n строк до/после:
1) -C: выводит n строк до и после вхождения;
$ grep -C2 -r --color=always "Hello3" ./
./hello-Hello1
./hello-Hello2
./hello:Hello3
./hello-Hello4
./hello-Hello5
2) -B: выводит n строк перед вхождением;
$ grep -B2 -r --color=always "Hello3" ./
./hello-Hello1
./hello-Hello2
./hello:Hello3
3) -A: выводит n строк после вхождения;
$ grep -A2 -r --color=always "Hello3" ./
./hello:Hello3
./hello-Hello4
./hello-Hello5
Если наш шаблон поиска походит на регулярное выражения, нужно использовать флаг "-F". Таким образом мы говорим команде искать ровно то, что мы запросили - без скрытых подтекстов.
Без флага мы получим строки, в которых присутствует хотя бы 1 символ из набора (H, e, l, o). С флагом получим строки с буквальным совпадением:
$ grep "[Hello]" hello
Help me please
Helloup
[Hello]
$ grep -F "[Hello]" hello
[Hello]
LinuxCamp | #utils
🔥38👍24❤🔥6
Как сделать службу недоступной?
Иногда возникает необходимость удалить службу Systemd или хотя бы сделать её недоступной для использования.
Сам юнит файл удалять нет смысла, потому что при следующем обновлении пакета он восстановится.
Самый простой способ избавиться от службы - это удалить пакет, вместе с котором она поставляется. Сначала нужно найти путь к файлу юнита. Это можно сделать с помощью команды "status":
Теперь узнаем имя пакета, с которым служба поставляется. Если мы работаем с deb сборками, используем флаг "-S":
После того, как имя пакета известно, удаляем его:
Если вы не хотите удалять пакет, например, потому что он системный и это может что-то сломать, можно замаскировать службу.
Замаскированные службы нельзя запустить вручную и они не активируются на старте системы (даже если добавлены в автозагрузку). Для маскировки используется команда mask:
Прикольно, конечно, реализована маскировка - в системном каталоге для сервисов создается симлинка на устройство "/dev/null" (говорили о нем тут).
Если посмотрим на состояние службы, увидим, что она замаскирована:
Для того, чтобы убрать маскировку используем команду unmask. Ссылка удалится и не будет мешать старту сервиса:
LinuxCamp | #systemd
Иногда возникает необходимость удалить службу Systemd или хотя бы сделать её недоступной для использования.
Сам юнит файл удалять нет смысла, потому что при следующем обновлении пакета он восстановится.
Самый простой способ избавиться от службы - это удалить пакет, вместе с котором она поставляется. Сначала нужно найти путь к файлу юнита. Это можно сделать с помощью команды "status":
$ systemctl status docker
docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Теперь узнаем имя пакета, с которым служба поставляется. Если мы работаем с deb сборками, используем флаг "-S":
$ dpkg -S /lib/systemd/system/docker.service
docker.io: /lib/systemd/system/docker.service
После того, как имя пакета известно, удаляем его:
$ sudo apt remove docker.io
Если вы не хотите удалять пакет, например, потому что он системный и это может что-то сломать, можно замаскировать службу.
Замаскированные службы нельзя запустить вручную и они не активируются на старте системы (даже если добавлены в автозагрузку). Для маскировки используется команда mask:
$ sudo systemctl mask docker
Created symlink /etc/systemd/system/docker.service → /dev/null
Прикольно, конечно, реализована маскировка - в системном каталоге для сервисов создается симлинка на устройство "/dev/null" (говорили о нем тут).
Если посмотрим на состояние службы, увидим, что она замаскирована:
$ sudo systemctl status docker
docker.service
Loaded: masked (Reason: Unit docker.service is masked.)
Для того, чтобы убрать маскировку используем команду unmask. Ссылка удалится и не будет мешать старту сервиса:
$ sudo systemctl unmask docker
Removed /etc/systemd/system/docker.service.
LinuxCamp | #systemd
🔥33👍25❤6