O seu período de teste terminou!
Para acesso total à funcionalidade, pague uma subscrição premium
LI
LinuxCamp | DevOps
https://t.me/linuxcamp_tg
Idade do canal
Criado
Linguagem
Russo
2.02%
ER (semana)
14.78%
ERRAR (semana)

Обо мне: C/C++/Linux эксперт. Говорим про разработку, Linux, DevOps, сети и администрирование.

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

Чат: @linuxcamp_chat

Mensagens Estatísticas
Repostagens e citações
Redes de publicação
Satélites
Contatos
História
Principais categorias
As principais categorias de mensagens aparecerão aqui.
Principais menções
Não foram detectadas menções significativas.
Encontrado 92 resultados
LI
LinuxCamp | DevOps
10 009 assinantes
Repostar
31
15
2.0 k
Мультивселенная существует)

Я как-то о его творчестве поверхностно наслышан, но, вроде, он не эти занимался. Не думал, что PewDiePie и Linux можно увидеть вместе 😕
27.04.2025, 13:14
t.me/linuxcamp_tg/273
LI
LinuxCamp | DevOps
10 009 assinantes
41
20
2.3 k
Как узнать разрядность операционки?

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

Существует две самые популярные: i386 (32 битная) и x86_64 (64 битная). Первая уже устаревшая и поддерживает работу с не больше чем 4ГБ оперативки.

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

Самый простой способ узнать разрядность - воспользоваться утилитой arch:


$ arch
aarch64


Да, это "маковская" история. Aarch64 — это 64-битная архитектура от ARM (иногда её называют arm64).

Есть еще команда uname, которая выводит архитектуру ядра через опцию "-m". Архитектура ядра соответствует системной, поэтому этот метод можно использовать:


$ uname -m
aarch64


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


$ file /lib/systemd/systemd
/lib/systemd/systemd: ELF 64-bit LSB pie executable, ARM aarch64, ...


LinuxCamp | #utils
25.04.2025, 15:02
t.me/linuxcamp_tg/272
LI
LinuxCamp | DevOps
10 009 assinantes
24
6
2.6 k
🐧 Linux Club - без лишних слов полезный канал по Linux

— обзоры дистрибутивов
— команды для терминала
— open source приложения
— полезные фреймворки
— оптимизация серверов
— инсайдерская информация

Подписывайся - @clubLinux
25.04.2025, 12:02
t.me/linuxcamp_tg/271
LI
LinuxCamp | DevOps
10 009 assinantes
36
42
2.4 k
Как удалять ссылки?

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

Обычно мы как проверяем ссылку - выполняем "ls -l" и смотрим на тип:


$ ls -l
lrwxrwxrwx ... sftp-server -> openssh/sftp-server


Если будем работать через find, руками тип смотреть не придется. Для фильтрации по символьным ссылкам у нас есть опция "-type l":


$ find /usr/lib -type l
/usr/lib/gvfs/gvfsd-afp
/usr/lib/libmultipath.so


Если мы переживаем, что удалим что-то лишнее, можем проверить путь к файлу, на который указывает ссылка. Для этого нужно для вывода команды выполнить "-exec ls -l {} \":


$ find /usr/lib -type l -exec ls -l {} \;
/usr/lib/gvfs/gvfsd-afp -> ../../libexec/gvfsd-afp
/usr/lib/libmultipath.so -> libmultipath.so.0


Напоследок разберемся с поиском и удалением битых ссылок, которые никуда не ведут. Для такой цели подойдет параметр "-xtype l":


$ find ~/broken_links/ -xtype l

LinuxCamp | #microhelp
23.04.2025, 18:04
t.me/linuxcamp_tg/270
LI
LinuxCamp | DevOps
10 009 assinantes
19
2
1.7 k
🩵 Как я попал в Яндекс и что узнал о собеседованиях в IT

👋 Привет, подписчики канала Кирилла !
Я — Илья Шишков, С++ разработчик с 20-летним опытом в IT, 11 лет в Яндексе и более 250 проведенных технических интервью. Сейчас работаю в R&D команде СУБД Pangolin в СберТехе.

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

...📋 На моем канале вы получите инсайдерскую информацию:

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

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

✅ Хотите узнать, как на самом деле устроены собеседования в топовых IT-компаниях и многократно увеличить свои шансы на успех?

Подписывайтесь на мой канал!

Там я регулярно раскрываю секреты, которые обычно остаются за закрытыми дверями технических интервью.
23.04.2025, 17:02
t.me/linuxcamp_tg/269
LI
LinuxCamp | DevOps
10 009 assinantes
53
81
3.3 k
Как разбить файл на части?

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

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

Разбить по размеру

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


$ ls -l
721 Apr 20 13:11 file_orig


$ split -b 100 ./file_orig ./file-part_


Помимо оригинала появятся еще 8 файлов:


$ ls -l
721 Apr 20 13:11 file_orig
100 Apr 20 13:12 file-part_aa
...
21 Apr 20 13:12 file-part_ah


Разбить по количеству строк

Может быть нужно разбить один текстовый документ на несколько, с количеством строк "<= n". В этом вопросе полезной окажется опция "-l". Команда поделит большой log-файл на части по 10 тысяч строк в каждом:


$ split -l 1000 ~/Logs/log ~/Logs/log-part_


Разбить на определённое количество файлов

Еще одна интересная задача, в решении которой поможет опция "-n". Размер будет, по возможности, поделен поровну. Достаточно прописать итоговое количество файлов и запустить команду:


$ split -n 3 ./file_orig ./file-part_


$ ls -l
240 Apr 20 13:31 file-part_aa
240 Apr 20 13:31 file-part_ab
241 Apr 20 13:31 file-part_ac
721 Apr 20 13:11 file_orig


Настройка имени частей файла

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

С помощью опций можно изменить его длину "-a", переключиться на числа "-d" или hex-символы "-x". В последних двух сценариях получится выбрать начальную точку отчета "--numeric-suffixes" для чисел и "--hex-suffixes" для hex-символов.

Возьмем задачу – разделить текстовый файл на 3 части равного размера, чтобы каждый из них имел префикс "file-part_" и числовой суффикс из одного символа, начиная с 1:


$ split -a 1 --numeric-suffixes=1 -n 3 ./file_orig ./file-part_


$ ls -l
240 Apr 20 13:36 file-part_1
240 Apr 20 13:36 file-part_2
241 Apr 20 13:36 file-part_3


Объединение частей файла

Следующий шаг – объединение нескольких частей в единый файл. Для этих целей отлично подойдет утилита cat. Сначала нужно задать имена частей, потом итоговый файл:


$ cat ~/Archive/split-archive.part_* > ~/Archives/cat-archive.tar.gz

LinuxCamp | #utils
22.04.2025, 14:02
t.me/linuxcamp_tg/268
LI
LinuxCamp | DevOps
10 009 assinantes
36
35
2.5 k
Не часто советую учебные курсы, но тут нашел интересную возможность пройти бесплатно вводный курс по DevOps. Он для новичков в этой области (но не новичков в IT). Классно, что есть расширенный чек-лист, который поможет сориентироваться в мире DevOps и понять куда двигаться. И, похоже, на собесах может помочь.

А у самой платформы не сотни менторов, а один, он же основатель. Еще увидел у него программу наставничества, формат действительно эффективный.

Ну и любопытный телеграм-канал на почитать, там тоже, на мой взгляд, много полезных публикаций.
22.04.2025, 11:02
t.me/linuxcamp_tg/267
LI
LinuxCamp | DevOps
10 009 assinantes
42
9
2.7 k
ArcoLinux прекращает деятельность

ArcoLinux — открытая операционная система, разрабатываемая группой бельгийских программистов на основе ArchLinux.

Завершает работу после 8 лет существования. Эрик Дюбуа (создатель) сообщил, что проект прекратит выпуск ISO, приложений и скриптов с 1 июля 2025 года. Уже скоро социальные сети проекта также будут деактивированы.

Причины:

— Личные причины Эрика Дюбуа: автор не стремится к новым амбициозным планам и хочет замедлить темп жизни.

Он планирует заниматься Linux исключительно для удовольствия, без давления, связанного с управлением крупной инициативой

— Появление мелких ошибок, влияющих на качество работы, из-за потери концентрации и внимания создателя проекта

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

LinuxCamp | #news
21.04.2025, 17:26
t.me/linuxcamp_tg/266
LI
LinuxCamp | DevOps
10 009 assinantes
21
2.5 k
21.04.2025, 14:02
t.me/linuxcamp_tg/261
LI
LinuxCamp | DevOps
10 009 assinantes
22
2.6 k
21.04.2025, 14:02
t.me/linuxcamp_tg/265
LI
LinuxCamp | DevOps
10 009 assinantes
22
2.6 k
21.04.2025, 14:02
t.me/linuxcamp_tg/264
LI
LinuxCamp | DevOps
10 009 assinantes
22
2.5 k
21.04.2025, 14:02
t.me/linuxcamp_tg/262
LI
LinuxCamp | DevOps
10 009 assinantes
31
21
2.4 k
👩‍💻 Docker — лучший канал для ускоренного обучения DevOps и Linux.

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

Прокачать скиллы: t.me/DevopsDocker
21.04.2025, 14:02
t.me/linuxcamp_tg/260
LI
LinuxCamp | DevOps
10 009 assinantes
22
2.6 k
21.04.2025, 14:02
t.me/linuxcamp_tg/263
LI
LinuxCamp | DevOps
10 009 assinantes
49
28
2.3 k
Релиз Ubuntu 25.04 Plucky Puffin

По информации OpenNET, основные изменения и доработки включают:

— Рабочий стол обновлён до GNOME 48, в котором реализована поддержка HDR, тройной буферизации, стековой компоновки. Добавлены оптимизации потребления памяти и производительности;

— Вместо Evince для просмотра PDF задействована программа Papers;

— Задействован пакетный менеджер APT 3.0, в котором предложен новый движок разрешения зависимостей Solver3;

— Улучшены возможности для использования устройств на базе архитектуры ARM64 в качестве рабочих станций с графическим окружением;

— Ядро Linux обновлено до 6.14;

— На ноутбуках с GPU NVIDIA по умолчанию включён сервис nvidia‑powerd, обеспечивающий поддержку Dynamic Boost;

— Обеспечена полная поддержка GPU Intel на базе архитектуры Xe2;

LinuxCamp | #news
18.04.2025, 10:49
t.me/linuxcamp_tg/259
LI
LinuxCamp | DevOps
10 009 assinantes
1
2
Timeline 1.mp4
Хз, видели ли этот прикол, но иначе же и не скажешь) Как вспомню свои первые дни, ухх...

LinuxCamp | #memes
16.04.2025, 19:14
t.me/linuxcamp_tg/258
LI
LinuxCamp | DevOps
10 009 assinantes
37
61
1.8 k
Размонтирование файловой системы: unmount

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

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

Сначала посмотрим полный список доступных дисков:


$ sudo lsblk -o NAME,FSTYPE,SIZE,MOUNTPOINT,LABEL


loop0 4K /snap/bare/5
sda 104G
├─sda1 vfat 1G /boot/efi
├─sda2 ext4 2G /boot
...
sdb 500G
├─sdb1 ntfs 500G /media/root-user/C2D8...


USB-диск объемом 500 ГБ маркирован как sdb1. Для его размонтирования следует выполнить команду:


$ sudo umount /dev/sdb1


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

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


$ sudo umount -l /dev/sdb1


Для принудительного отключения можно использовать флаг "-f". Все выполняемые операции незамедлительно прервутся, и ждать ничего не придется:


$ sudo umount -f /dev/sdb1


Размонтировать все устройства

Опция "-a" отвечает за размонтирование всех файловых систем. Eсть несколько разделов с исключениями: roc, devfs, devpts, sysfs, rpc_pipefs и nfsd. Запускать ее нужно с осторожностью:


$ sudo umount -a


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


$ sudo umount --fake -v -a

/run/user/1000/doc: successfully unmounted
/snap/firefox/6015: successfully unmounted
...


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

Размонтировать путь

Если вы хотите отключить конкретный путь от корневой FS, то подход будет иной.

В качестве примера возьмем каталог "/run/lock/tmpfs". Команда для размонтирования будет выглядеть следующим образом:


$ sudo umount /run/lock/tmpfs


Рекурсивное размонтирование

Для рекурсивного размонтирования определенной директории, к описанной выше команде следует добавить опцию "-R":


$ sudo umount -R /run/lock/tmpfs


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


$ sudo umount -R -v /run/lock/tmpfs


LinuxCamp | #utils
16.04.2025, 11:26
t.me/linuxcamp_tg/257
LI
LinuxCamp | DevOps
10 009 assinantes
11
3
2.1 k
⚡️ Все о программировании от экспертов BigTech!

Собрались разработчики бигтеха и решили создать крутой канал, на котором простым языком расскажут все о мире IT:

Лучшие практики чистого кода
Продвинутые техники и рекомендации по разработке
Подробные разборы вопросов с собеседований
Интересные факты и новости из мира технологий
Полезные open-source утилиты

🌐 Присоединяйся к нам и учись на скоростях: IT CoLibry
16.04.2025, 10:17
t.me/linuxcamp_tg/256
LI
LinuxCamp | DevOps
10 009 assinantes
27
39
1.8 k
docker init: как использовать на Windows

Команда "docker init" создает стартовые файлы, связанные с Docker, для вашего проекта == автоматически генерирует их для запуска приложения под ваш стек. Docker init сейчас доступен только на Docker Desktop на Windows и MacOS, в большинстве ОС на linux данной команды нет:


- .dockerignore
- Dockerfile
- compose.yaml
- README.Docker.md


Устанавливаем Docker Desktop на устройство если не установлен. Если не имели раньше дела с питухоном питоном, также скачиваем его. Как все готово, создаем рабочий каталог:


mkdir my-fastapi-project
cd my-fastapi-project


Создаем и активируем виртуальное окружение чтобы изолировать зависимости проекта и с помощью команды pip freeze автоматически сформировать requirements.txt, не заполняя его вручную:


python3 -m venv venv
source venv/bin/activate


Cкачиваем необходимые для создания API зависимости с помощью пакетного менеджера pip и сохраняем их в requirements.txt:


pip install fastapi uvicorn
pip freeze > requirements.txt


Создадим в каталоге проекта файл "main.py" с простым API:


from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def root():
return {"Hello": "Docker Init"}


Теперь наконец можем запустить магию:


docker init


Нас встречает приветственное сообщение, которое просит нас выбрать язык проекта (python), его версию (3.12.7), порт на котором будет слушать приложение (8000). Далее нужно вписать команду для запуска. Он увидел что я работаю с fastapi и предлагает:


uvicorn 'main:app' --host=0.0.0.0 --port=8000


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


docker compose up --build


Дожидаемся пока сбилдится наше приложение и проверяем все ли ок. Переходим в браузер и видим заветное:


http://127.0.0.1:8000
{"Hello":"Docker Init"}

LinuxCamp | #devops #docker #bymaga #win
14.04.2025, 10:35
t.me/linuxcamp_tg/255
LI
LinuxCamp | DevOps
10 009 assinantes
58
27
2.2 k
Реально же, SIGKILL не контрится)

LinuxCamp | #memes
11.04.2025, 10:01
t.me/linuxcamp_tg/254
LI
LinuxCamp | DevOps
10 009 assinantes
43
80
2.3 k
Из чего состоит Dockerfile

Dockerfile - это набор команд, по которым docker собирает образ контейнера. Для начала нужно немного разъяснить, как это работает под капотом.

Docker-образ - это как слоеный пирог. Почти каждая инструкция в Dockerfile создает новый слой поверх предыдущих.

В одном из предыдущих постов, где мы собирали минимальный образ докера, фигурировал вот такой Dockerfile:


FROM python:3.11-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install -r requirements.txt

COPY . .

CMD ["uvicorn", "main:app", "--host", "127.0.0.1", "--port", "8000"]


Его и разберем построчно:

1) FROM - команда, которая создает базовый образ. В нашем случае это python:3.11-slim. Но что это и откуда берется? - из Docker Hub!

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

python:3.11-slim — это официальный образ Python версии 3.11 в минималистичной вариации "slim";

2) WORKDIR - создает рабочую директорию проекта, в которой все команды будут выполняться. Также как и большинство инструкций, создает новый слой;

3) COPY - копирует файлы с хоста в контейнер. Можно заметить, что данная команда выполняется дважды в файле.

Сначала копируется только файл requirements.txt для того, чтобы разделить установку зависимостей и основной код. Это делается ради кэширования слоёв: файл зависимостей меняется редко, и при пересборке будет использоваться уже готовый слой;

4) RUN - выполняет команду внутри контейнера на этапе сборки и создаёт новый слой. В данном случае ставит зависимости из requirements.txt;

5) Ещё один "COPY . ." — теперь закидываем остальной код проекта в контейнер.

6) Последняя инструкция CMD - не создает новый слой, там указаны команды которые выполняются при запуске контейнера. В нашем Dockerfile выполняются команды запуска fastapi-приложения:

— "uvicorn" - сервер, который запускает fastapi-приложение
— "main:app" - main — это имя файла python, а app — это объект fastapi внутри этого файла.
— "--host", "127.0.0.1" - указывает, что сервер будет слушать на локальном интерфейсе.
— "--port", "8000" - указывает порт, на котором работает приложение.

LinuxCamp | #devops #docker #bymaga
10.04.2025, 14:35
t.me/linuxcamp_tg/253
LI
LinuxCamp | DevOps
10 009 assinantes
9
2
2.1 k
🧩 Соберите свой комплект курсов как пазл!

3 видеокурса на ваш выбор за 55 000₽

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

Собрать свой пазл  ➡️ по ссылке
10.04.2025, 12:59
t.me/linuxcamp_tg/252
LI
LinuxCamp | DevOps
10 009 assinantes
52
73
2.2 k
Удаление файлов старше n дней

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

Для CLI существует специальная команда find, которая отвечает за поиск файлов. Подробно говорили о ней тут.

С помощью опции "-mtime" получится найти только те файлы, дата изменения которых старше заданного временного промежутка. В качестве примера возьмем каталог Downloads и срок в 35 дней:


$ find ~/Downloads -type f -mtime +35


Следующий шаг – непосредственно чистка:


$ find ~/Downloads -type f -mtime +35 -delete


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


$ find ~/Downloads -name "*.zip" -type f -mtime +35 -delete


Также, чтобы сгоряча не удалить нужный и недавно используемый файл, можно для каждого элемента вывода выполнить "ls -l" и посмотреть дату последнего изменения ресурса:


$ find ~/Downloads -type f -mtime +5 -exec ls -l {} \;
... Feb 17 17:30 ./file


LinuxCamp | #microhelp #utils
8.04.2025, 12:33
t.me/linuxcamp_tg/251
LI
LinuxCamp | DevOps
10 009 assinantes
34
18
2.3 k
8.04.2025, 10:17
t.me/linuxcamp_tg/250
LI
LinuxCamp | DevOps
10 009 assinantes
46
60
2.5 k
Если часто просматриваешь логи, помни про "tail -f"

Команда "tail -f" отображает последние строки файла и продолжает обновлять вывод в реальном времени. Это особенно полезно, когда работаешь с журналами, типа syslog. Утилиты head и tail рассматривали тут.

Много раз слышал от людей, что они для дебага какого-то функционала сначала инициировали вывод в syslog, после чего либо через GUI редактор, либо через постоянный вызов tail просматривали логи. Как-то неэффективно...

Для решения задач такого типа предлагаю использовать:


$ tail -f /var/log/syslog


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


$ tail -n 100 -f /var/log/nginx/access.log


$ tail -f /var/log/nginx/error.log | grep "timeout"


Я помню, как сам мучился с дебагом, когда не был в курсе про этот чудо-флаг) Дело в том, что не все приложения выдают лог в консоль. Если вы работаете с демоном, то у него нет управляющего терминала и все идет в журналы. Как раз тут и было бы весьма удобно использовать "tail -f".

LinuxCamp | #microhelp #utils
7.04.2025, 18:03
t.me/linuxcamp_tg/249
LI
LinuxCamp | DevOps
10 009 assinantes
25
2.6 k
7.04.2025, 17:01
t.me/linuxcamp_tg/246
LI
LinuxCamp | DevOps
10 009 assinantes
25
2.6 k
7.04.2025, 17:01
t.me/linuxcamp_tg/247
LI
LinuxCamp | DevOps
10 009 assinantes
25
2.6 k
7.04.2025, 17:01
t.me/linuxcamp_tg/245
LI
LinuxCamp | DevOps
10 009 assinantes
25
2.6 k
7.04.2025, 17:01
t.me/linuxcamp_tg/248
LI
LinuxCamp | DevOps
10 009 assinantes
18
25
2.6 k
⚡️ Ты неправильно используешь нейросети!

Нет смысла писать в ChatGPT обычные вопросы, пока кто-то с помощью других ИИ получает себе профессии.

Подписывайтесь, тут айтишник делится нейросетями, которые ищет каждый: https://t.me/+J76vZFqMsJBmZGYy
7.04.2025, 17:01
t.me/linuxcamp_tg/244
LI
LinuxCamp | DevOps
10 009 assinantes
25
2.4 k
Приветствую. Я тут себе лайф канал забубенил: @zhilnikov_it. Буду с вами делиться актульными планами, идеями и насущными мыслями. В дальнейшем все анонсы сначала буду прогонять через него. Если интересен такой формат, залетайте.

Сделал небольшой опрос, буду рад, если пройдете и озвучите свое мнение)
7.04.2025, 13:13
t.me/linuxcamp_tg/243
LI
LinuxCamp | DevOps
10 009 assinantes
30
5
2.4 k
Пацаны/девчата, напоминаю, что у нас есть чат "LinuxCamp | Chat", в котором вы можете задавать вопросы по администрированию, разработке и прочим техническим штукам. Там и я подмогу и другие активисты.

Добавил в него бота-модератора, с которым по приятнее должна быть атмосферка)
5.04.2025, 11:31
t.me/linuxcamp_tg/242
LI
LinuxCamp | DevOps
10 009 assinantes
45
45
2.7 k
Как узнать тип сессии: Wayland или Xorg?

Многие популярные дистрибутивы уже используют Wayland по умолчанию. Однако у Wayland всё ещё есть проблемы. Многие старые программы не поддерживаются или работают плохо.

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

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


$ echo $XDG_SESSION_TYPE
wayland


Кроме того, можно узнать тип текущей сессии с помощью loginctl. Для этого нужно сначала вывести список активных сессий через list-sessions:


$ loginctl list-sessions

SESSION UID USER SEAT TTY
3 1000 parallels seat0 tty2
c1 127 gdm seat0 tty1

2 sessions listed.


Потом выводим тип конкретной сессии через опцию show-session:


$ loginctl show-session 3 -p Type
Type=wayland


Или можно сделать всё одной командой, получив идентификатор сессии из переменной окружения XDG_SESSION_ID (если определена):


$ loginctl show-session "$XDG_SESSION_ID" -p Type


LinuxCamp | #microhelp #sessions
4.04.2025, 11:49
t.me/linuxcamp_tg/241
LI
LinuxCamp | DevOps
10 009 assinantes
52
68
2.3 k
Где же сидят эти службы?

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

1) системные службы, которые запускаются от суперпользователя. Для управления такими службами нужно использовать sudo.

2) пользовательские службы, которые запускаются от определённого юзера, который имеет над ними полный контроль без необходимости в sudo.

Системные службы лежат в:

1) /usr/lib/systemd/system;
2) /lib/systemd/system;
3) /etc/systemd/system;

Пользовательские служы лежат в:

1) /usr/lib/systemd/user;
2) /lib/systemd/user;
3) /etc/systemd/user;
4) /home/user/.config/systemd/user;

Файлы сервисов, поставляемые с пакетами, как правило, располагаются в каталогах lib и /usr/lib, а в /etc/ расположены модифицированные юниты, переопределяющие стандартные настройки.

LinuxCamp | #systemd
2.04.2025, 11:06
t.me/linuxcamp_tg/240
LI
LinuxCamp | DevOps
10 009 assinantes
22
3
2.5 k
Курсы пройдены. Диплом на руках. А оффера всё нет?

Вы не одиноки. Многие разработчики застревают между «я всё знаю» и «меня никто не зовёт».

На этой неделе в канале «Код Меркури» вместе с опытным DevOps-инженером мы разбираем:
📌 как заявить о себе в IT?
📌 зачем вам pet-проекты и личный бренд?
📌 и что нужно, чтобы не быть вечным мидлом?

С 31 марта по 4 апреля — реальные кейсы, ошибки и советы из практики.

Подпишитесь на @mercdev, чтобы прокачать карьеру — по-настоящему.

#реклама
О рекламодателе
2.04.2025, 10:02
t.me/linuxcamp_tg/239
LI
LinuxCamp | DevOps
10 009 assinantes
47
60
2.7 k
systemd: проверка статуса службы

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

Для просмотра информации о сервисе используется команда status утилиты systemctl. Например, чтобы посмотреть состояние docker нужно выполнить:


$ systemctl status docker

docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled;>
Active: active (running) since ...

Давайте рассмотрим полный вывод:

Loaded - означает что файл юнита загружен успешно и здесь же выводится путь к этому файлу.

Тут возможны и другие значения, например, masked если юнит скрыт или not-found если он не найден. Также здесь находится информация добавлен ли юнит в автозагрузку (enabled/disabled);

Active - текущее состояние и подсостояние юнита, если он запущен, выводится active(running), если он не был запущен, то inactive(dead) если что-то пошло не так, failed и т.д.

Docs - название man страницы с документацией для службы.

Process - запускаемые процессы, их состояние и код выхода.

Main PID - идентификатор основного процесса службы.

Tasks - количество процессов, запущенных в рамках этой службы.

Memory - потребление памяти службой.

CPU - использование процессора службой.

Для того чтобы посмотреть все доступные значения состояний для полей Loaded и Active выполните:


$ systemctl --state help


Списочек получите некороткий) За доп. инфой направлю вас в man.

После всех полей статуса выводится журнал службы - последние 10 строк вывода основного процесса.

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


$ systemctl status --lines=50 avahi-daemon


LinuxCamp | #systemd
30.03.2025, 18:50
t.me/linuxcamp_tg/238
LI
LinuxCamp | DevOps
10 009 assinantes
48
76
1.6 k
Собираем минимальный Docker образ

Docker — это инструмент для запуска приложений в изолированных контейнерах. Он делает разработку и развертывание проще, быстрее и безопаснее.

Нужен он для: изоляции приложений и зависимостей, переносимости (софтина работает одинаково на любой системе) и DevOps-процессов.

Плюсы докера: простота развёртывания, экономия ресурсов по сравнению с виртуальными машинами, стандартизация окружения.

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

Минимальный пример запуска первого Docker-контейнера с Python (FastAPI):

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


$ sudo apt install python3 python3-pip -y
$ sudo apt install docker.io -y


После установки создаем рабочую папку:


$ mkdir fastapi_backend && cd fastapi_backend


Активируем виртуальное окружение, чтобы изолировать зависимости проекта и с помощью команды pip freeze автоматически сформировать requirements.txt, не заполняя его вручную:


$ python3 -m venv venv
$ source venv/bin/activate


Cкачиваем необходимые для создания API зависимости с помощью пакетного менеджера pip и сохраняем их в requirements.txt:


$ pip install fastapi uvicorn
$ pip freeze > requirements.txt


2. Создадим в каталоге проекта файл "main.py" с простым API:


$ touch main.py


from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
return {"Hello": "LinuxCamp"}


3. Ну и наконец добавим в локальный каталог сам Dockerfile - это инструкция по созданию docker контейнера. Cейчас приведу общий пример, в следующих постах подробнее разберем его структуру:


FROM python:3.11-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install -r requirements.txt

COPY . .

CMD ["uvicorn", "main:app", "--host", "127.0.0.1", "--port", "8000"]


4. На этом все! Мы уже можем собрать свой Docker-образ и запустить его, после чего приложение будет доступно по адресу ниже:


$ sudo docker build -t myapp .
$ sudo docker run -d -p 8000:8000 myapp


$ curl -L http://127.0.0.1:8000 
$ {"Hello":"LinuxCamp"}


http://127.0.0.1:8000


Также можно посмотреть наличие нашего docker контейнера в списке запущенных контейнеров с помощью команды docker ps:


$ docker ps

CONTAINER ID IMAGE COMMAND
640d6f4d1acb fastapi_backend "uvicorn main:app --…"


LinuxCamp | #devops #docker #bymaga
28.03.2025, 13:02
t.me/linuxcamp_tg/237
LI
LinuxCamp | DevOps
10 009 assinantes
15
12
2.0 k
Чемпионат для подростков по 14 направлениям от «Алабуга Политех»☺️

Программирование и Битва роботов, Экономика и Юриспруденция, 3D моделирование и Английский язык и многое другое, чтобы каждый нашел свою дисциплину.

Для участия тебе нужно☺️
☺️Оставь заявку на сайте😀
☺️Пройди заочный этап на HR-платформе: Business Cats до 1,0 по «Общению» и «Аналитике» для оплаты дороги туда и обратно😀
☺️Приезжай на чемпионат😀

Мы предлагаем тебе☺️
☺️Общий призовой фонд турнира составляет 450 000 рублей😀
☺️Проживание и дорога бесплатно😀
☺️Возможность поступить в «Алабуга Политех»😀

Участвуй в турнире от образовательного центра мирового уровня и получай призы и преимущество в поступлении☺️
28.03.2025, 12:06
t.me/linuxcamp_tg/236
LI
LinuxCamp | DevOps
10 009 assinantes
43
59
2.0 k
Как сделать службу недоступной?

Иногда возникает необходимость удалить службу 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
26.03.2025, 17:47
t.me/linuxcamp_tg/235
LI
LinuxCamp | DevOps
10 009 assinantes
16
10
2.3 k
😎 PyLinux - канал для тех, кто изучает Python и хочет начать разбираться в Linux!

➡️ Почему не стоит упустить:

- удобные инструменты Linux
- библиотеки и полезные материалы по Python
- bash скрипты и гайды
- а также, многое другое!

🔥 Заходи прямо сейчас, чтобы не потерять - PyLinux!
26.03.2025, 14:35
t.me/linuxcamp_tg/234
LI
LinuxCamp | DevOps
10 009 assinantes
44
66
1.7 k
Полезные опции для поиска файлов через grep

Иногда нужно найти один/несколько файлов, содержащих определённую строку в: логах, конфигах или исходном коде. Для этого очень часто под рукой оказывается утилита 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
24.03.2025, 16:02
t.me/linuxcamp_tg/233
LI
LinuxCamp | DevOps
10 009 assinantes
81
2.1 k
24.03.2025, 11:11
t.me/linuxcamp_tg/230
LI
LinuxCamp | DevOps
10 009 assinantes
80
2.2 k
24.03.2025, 11:11
t.me/linuxcamp_tg/232
LI
LinuxCamp | DevOps
10 009 assinantes
80
2.2 k
24.03.2025, 11:11
t.me/linuxcamp_tg/231
LI
LinuxCamp | DevOps
10 009 assinantes
37
82
2.2 k
⚡️ Дождались! Ребята сделали крутейший канал про Linux

Здесь на простых картинках и понятном языке обучают работе с этой ОС, делятся полезными фишками и инструментами

Подписывайтесь: @linuxos_tg
24.03.2025, 11:11
t.me/linuxcamp_tg/228
LI
LinuxCamp | DevOps
10 009 assinantes
83
2.1 k
24.03.2025, 11:11
t.me/linuxcamp_tg/229
LI
LinuxCamp | DevOps
10 009 assinantes
58
2
2.3 k
В смысле DevOps?

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

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

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

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

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

LinuxCamp | #info
24.03.2025, 10:26
t.me/linuxcamp_tg/227
LI
LinuxCamp | DevOps
10 009 assinantes
98
8
2.3 k
Залутал гуся на cpp конфе 🐥
20.03.2025, 16:12
t.me/linuxcamp_tg/226
LI
LinuxCamp | DevOps
10 009 assinantes
28
31
2.3 k
Утилиты для работы с 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
20.03.2025, 13:03
t.me/linuxcamp_tg/225
LI
LinuxCamp | DevOps
10 009 assinantes
26
4
2.2 k
Возможности для молодых людей в «Алабуге», Республике Татарстан

В особой экономической зоне «Алабуга» активно развивается лидерская программа «100 Лидеров». В ней могут поучаствовать молодые специалисты от 19 до 26 лет.

У участников есть возможность познакомиться с топ-менеджерами компании, поиграть в бизнес-игры, пройти собеседования с реальным шансом трудоустройства в компанию «Алабуга».

Питание и проживание за счет компании.

Работа в «Алабуге» - это зарплата от 110 до 240 тысяч рублей и участие в реализации проектов мирового уровня.

Следующий поток - с 5 по 9 апреля!
Заявку можно подать на сайте
20.03.2025, 12:05
t.me/linuxcamp_tg/224
LI
LinuxCamp | DevOps
10 009 assinantes
34
33
2.3 k
Как я познакомился с Димасом 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
19.03.2025, 17:33
t.me/linuxcamp_tg/223
LI
LinuxCamp | DevOps
10 009 assinantes
50
43
2.4 k
Почему BIOS нужно называть UEFI и как его разрабатывают

BIOS — это системное программное обеспечение, которое встроено прямо в материнскую плату и хранится в энергонезависимой памяти: как правило, это SPI Flash. Даже если на материнской плате нет жесткого диска или другого накопителя данных, BIOS уже присутствует. Сейчас BIOS правильнее называть UEFI, но по инерции многие продолжают называть эту систему BIOS.

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

Примеры таких сервисов: работа с клавиатурой, дисками и выводом изображения на экран. Эта система получила название BIOS, то есть базовая система ввода-вывода.

Первые PC были системами с 16-битной адресацией и реальным режимом работы, они поддерживали максимум один мегабайт памяти, адресуемой посегментно. Использовать язык высокого уровня для написания ПО первичной инициализации таких систем было неэффективно, а порой и невозможно, поэтому для разработки BIOS использовали максимально низкоуровневый язык программирования — ассемблер.

В середине 90-х годов компания Intel начала разрабатывать процессоры с архитектурой Itanium. Анализируя BIOS, инженеры поняли, что его возможностей недостаточно для инициализации сложных систем с большим объемом памяти и 64-битными процессорами. В результате была разработана новая спецификация программной инициализации под названием EFI.

Что было дальше и как сейчас разрабатывают прошивки для ноутбуков и серверов, читайте в статье руководителя отдела разработки BIOS/UEFI российской компании YADRO.
19.03.2025, 14:33
t.me/linuxcamp_tg/222
LI
LinuxCamp | DevOps
10 009 assinantes
47
55
2.3 k
Как менять пароли?

Для смены либо создания пароля в 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
16.03.2025, 19:08
t.me/linuxcamp_tg/220
LI
LinuxCamp | DevOps
10 009 assinantes
27
20
1.9 k
Команда «ой, я забыл 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
14.03.2025, 11:22
t.me/linuxcamp_tg/218
LI
LinuxCamp | DevOps
10 009 assinantes
31
32
1.9 k
Практика использования: 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
12.03.2025, 12:05
t.me/linuxcamp_tg/217
LI
LinuxCamp | DevOps
10 009 assinantes
36
39
1.8 k
Стрелка за 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
10.03.2025, 17:03
t.me/linuxcamp_tg/216
LI
LinuxCamp | DevOps
10 009 assinantes
21
12
2.4 k
У K2 Cloud скоро будет митап о карьере в Linux

Эксперты компании и приглашенный гость — блогер Константин Дипеж (DeusOps) — обсудят профессиональный путь Linux-специалиста.

Среди тем: как безболезненно «вкатиться» в Linux, с чем откликаться на вакансию, какие вопросы задают на техническом интервью и как расти после оффера. Полезный контент для начинающих спецов, которые хотят развиваться в DevOps и не только.

Встреча пройдет онлайн, 19 марта в 18:00 (msk). Подробности и регистрация по ссылке
10.03.2025, 13:42
t.me/linuxcamp_tg/215
LI
LinuxCamp | DevOps
10 009 assinantes
79
63
2.1 k
Разница между 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
7.03.2025, 09:00
t.me/linuxcamp_tg/214
LI
LinuxCamp | DevOps
10 009 assinantes
59
61
1.7 k
Перемещайся по файловой системе как флеш: 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
5.03.2025, 18:06
t.me/linuxcamp_tg/213
LI
LinuxCamp | DevOps
10 009 assinantes
41
7
2.2 k
Хочу много зарабатывать и писать инновационные проекты, что же выбрать.... Очевидно C++

Сегодня рынок IT особенно ценит опытных C++ разработчиков. Нужно же кому-то поручить алгоритм для беспилотников написать или сверх быстрый бэкенд. Тут так просто не отделаешься высокоуровневыми инструментами.

Я сам пишу на C/C++ и очень ценю качественные обучающие ресурсы. Вашему вниманию мой фаворит среди ТГ каналов по плюсам: Грокаем С++.

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

Свое место найдет каждый:

Если ты еще совсем новичок, то забирай список всех полезных материалов для старта.

Хочешь устроиться на работу? Забирай гайд по собеседованиям.

Вообще, у них куча годных постов и гайдов на любой вкус. Все найдете в закрепе. Не теряем ресурс и становимся частью элитного клуба плюсовиков: Грокаем С++
5.03.2025, 15:04
t.me/linuxcamp_tg/212
LI
LinuxCamp | DevOps
10 009 assinantes
59
85
1.7 k
Итоги квартала

По традиции набросал сводку ключевых постов (декабрь - февраль 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
3.03.2025, 13:04
t.me/linuxcamp_tg/211
LI
LinuxCamp | DevOps
10 009 assinantes
30
5
2.0 k
YADRO приглашает С++ Software Engineer в команду Telecom 🔍

Вендор и производитель IT-инфраструктуры YADRO проводит SPRINT OFFER для С++ Software Engineer в двух направлениях:

→ В Telecom Platform вы будете развивать платформу, обеспечивающую middleware services, high avaliability, node management и delivery для приложений в составе базовой станции LTE/GS. А также участвовать в проектировании и развитии архитектуры телеком-платформы и разработке её компонентов в технологическом стеке C++/Linux.

→ Занимаясь разработкой базовой станции LTE/GSM и 5G Core, вы сможете создавать телекоммуникационные решения от этапа исследования и прототипирования до вывода в коммерческое использование пакетного ядра сети 5-го поколения. А также разрабатывать ПО для базовых станций LTE и реализовывать полный стек протокола 3GPP.

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

🔵 Читайте подробности на сайте и оставляйте заявку до 9 марта.
3.03.2025, 10:01
t.me/linuxcamp_tg/210
LI
LinuxCamp | DevOps
10 009 assinantes
42
62
1.7 k
Инъекция пользы

Если хотим передать файлы или каталоги с локальной системы на удаленный 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
27.02.2025, 13:03
t.me/linuxcamp_tg/209
LI
LinuxCamp | DevOps
10 009 assinantes
16
6
1.9 k
⚡️Истовый инженер теперь в Telegram!

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

— Quake 2 на нашем RISC-V, или как мы поднимали старый Radeon на FPGA (читать)
— Ядро и драйверы Linux: настоящее и будущее (читать)
— Игра в имитацию: как разрабатывать и отлаживать ПО для процессора, которого нет (читать)
— Между процессором и пользователем: как разрабатывают операционные системы (читать)

📝 и ещё 100+ полезных статей, лекций, подкастов и кейсов от практиков

Подписываемся, чтобы не потерять полезный канал @ultimate_engineer
27.02.2025, 10:03
t.me/linuxcamp_tg/208
LI
LinuxCamp | DevOps
10 009 assinantes
57
74
1.7 k
Прокачиваемся в 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
26.02.2025, 14:12
t.me/linuxcamp_tg/207
LI
LinuxCamp | DevOps
10 009 assinantes
26
11
2.1 k
Устали от одинаковых каналов про девопс с полотнами кода, которые вы никогда не прочтёте, и несмешными мемами?

Тогда вам в DevOps Human Help - авторский канал, созданный двумя профессионалами: ⌨️ Senior DevOps-инженером и 👰‍♀️ айти-рекрутером! Здесь делимся своим опытом, рассказываем о нюансах профессии и поиске работы. Разбираем реальные вопросы интервью, даём советы по составлению эффективного резюме. Обсуждаем возможные препятствия при трудоустройстве и в карьере.

Помимо этого, даём возможность обратиться к нам за помощью со своим кейсом - мы обязательно поможем!
DevOps \\ Human Help всегда на стороне соискателя.

Как вкатиться в Devops избегая джуниор позиций?

Как впечатлить рекрутера своим английским?

Контейнеры и Zero Trust. Познаём безопасность, прокачиваем резюме

Как точно НЕ получить работу в айти: 5 простых шагов

Чудовищные технические собеседования, какие они?

Профессия в IT, где джуны могут получать $5000 в месяц

🚨Ваш маяк в океане высококонкурентного рынка🚨
26.02.2025, 11:11
t.me/linuxcamp_tg/206
LI
LinuxCamp | DevOps
10 009 assinantes
49
58
2.1 k
Как получить доступ к данным 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
24.02.2025, 09:05
t.me/linuxcamp_tg/205
LI
LinuxCamp | DevOps
10 009 assinantes
37
26
1.8 k
Когда уронил прод и готовишься пересекать границу вплавь)

LinuxCamp | #memes
22.02.2025, 09:13
t.me/linuxcamp_tg/204
LI
LinuxCamp | DevOps
10 009 assinantes
32
64
1.7 k
Настройка прав по умолчанию

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


$ 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
21.02.2025, 14:33
t.me/linuxcamp_tg/203
LI
LinuxCamp | DevOps
10 009 assinantes
61
13
2.0 k
«Вместо философии учил java, вместо доты — питон. Через 3 месяца нашёл работу с зп 90к»

Думаете, повезло?

Уверен, что так сможет каждый — потому что эти языки востребованы (70% программ и сервисов работают на них) и просты в усвоении (за 3 месяца можно выйти на достойный уровень без напряга).

А вот и каналы, где нашёл всю инфу. Её грамотно собрали, даже сложные темы изучаются легко:

Java (теория)
Java (практика)
Python

Уже через месяц сможете писать простеньких ботов для телеги и продавать по 5-7к, кайф же 🥰
21.02.2025, 11:11
t.me/linuxcamp_tg/202
LI
LinuxCamp | DevOps
10 009 assinantes
48
148
1.7 k
Топ ресурсов по изучению 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
19.02.2025, 13:17
t.me/linuxcamp_tg/201
LI
LinuxCamp | DevOps
10 009 assinantes
5
1.9 k
19.02.2025, 10:17
t.me/linuxcamp_tg/198
LI
LinuxCamp | DevOps
10 009 assinantes
13
5
1.9 k
😈 Senior-безопасник создал крутейший канал про ИБ

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

Присоединяйтесь: @infosec
19.02.2025, 10:17
t.me/linuxcamp_tg/196
LI
LinuxCamp | DevOps
10 009 assinantes
5
1.9 k
19.02.2025, 10:17
t.me/linuxcamp_tg/199
LI
LinuxCamp | DevOps
10 009 assinantes
5
1.9 k
19.02.2025, 10:17
t.me/linuxcamp_tg/200
LI
LinuxCamp | DevOps
10 009 assinantes
5
1.8 k
19.02.2025, 10:17
t.me/linuxcamp_tg/197
LI
LinuxCamp | DevOps
10 009 assinantes
99
42
1.8 k
Как я потрошил 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
17.02.2025, 15:17
t.me/linuxcamp_tg/195
LI
LinuxCamp | DevOps
10 009 assinantes
12
12
2.0 k
Освой сети и командную строку с лучшими обучающими каналами

🤩 Network Admin - обучающий канал по сетевым технологиям

🤩 Network Admin | Guides - канал, где рассказывают полезную информацию про Windows/Linux

📱 BashTex - обучение работе с командной строкой
17.02.2025, 12:17
t.me/linuxcamp_tg/194
LI
LinuxCamp | DevOps
10 009 assinantes
47
72
1.4 k
Прокачиваемся в 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
15.02.2025, 12:07
t.me/linuxcamp_tg/193
LI
LinuxCamp | DevOps
10 009 assinantes
20
19
1.8 k
Крутая программа для тех, кто уже работает с Linux и хочет погрузиться DevOps.

В двух словах: программа на 2 месяца, ты учишься, тебе еще и платят. Начинка: начинающий и продвинутый курс по Linux, погружение в DevOps. Обучение с практикой, лабораторными и под контролем экспертов из K2 Сloud.

Подробнее можно узнать на сайте
15.02.2025, 09:07
t.me/linuxcamp_tg/192
LI
LinuxCamp | DevOps
10 009 assinantes
47
85
1.4 k
Прокачиваемся в 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
12.02.2025, 13:37
t.me/linuxcamp_tg/191
LI
LinuxCamp | DevOps
10 009 assinantes
9
11
1.9 k
⚡️ Море IT-информации, а полезное найти все сложнее?

Мы собрали лучшие Telegram-ресурсы, которые помогут тебе развиваться:

📱 Python — от фишек языка и уроков, до практических примеров и готовых скриптов.

👩‍💻 Linux\Python — сообщество для изучающих Linux и Python одновременно.

📱 GitHub — лучшие находки с гитхаба и просторов open-source.

📱 IT Курсы — более 2ТБ проверенных курсов по Python, Devops, Backend, Frontend и др...

➡️ Ссылки действительны всего 48 часов, успей подписаться!
12.02.2025, 10:37
t.me/linuxcamp_tg/190
LI
LinuxCamp | DevOps
10 009 assinantes
24
35
1.6 k
Ничего лишнего, только head и tail

Утилиты head и tail можно назвать сестрами. Они обе позволяют просматривать только часть того, что поступило на вход: head показывает начало, а tail — конец.

Команды могут принимать входные данные либо с какого-то ресурса (файла) либо от других утилит через конвейер "|":


$ head test
Line 1
Line 2
Line 3
...

$ ls | head
adduser.conf
alsa
alternatives
...

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

Для того, чтобы ограничить вывод и просмотреть N элементов, используем параметр "-n":


$ head -n2 test
Line 1
Line 2

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

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


$ head -n-7 test
Line 1
Line 2
Line 3

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


$ head -n2 test test2
==> test <==
Line 1
Line 2

==> test2 <==
Line 11
Line 12

Если вывод названий файлов и разделителей "\n" нам не нужен, используем флаг "-q":


$ head -n2 -q test test2
Line 1
Line 2
Line 11
Line 12


Команда tail печатает последние строки файла — по умолчанию также 10:


$ tail test
Line 1
Line 2
Line 3
...


Принцип использования команды tail практически аналогичен head. Если хотим ограничить вывод последними 3 строками, добавляем флаг "-n":


$ tail -n3 test
Line 8
Line 9
Line 10


Если поставить перед номером знак "+", печать начнется со строки этого номера и продолжится до конца файла:


$ tail -n+9 test
Line 9
Line 10


Обе команды вместе

Объединяйте head и tail, чтобы напечатать любой диапазон строк.

Например, чтобы вывести строки c 4 по 7, используем head для элементов "1-7" и tail для "7-4":


$ head -n7 test | tail -n4
Line 4
Line 5
Line 6
Line 7


В общем, чтобы отобразить строки от M до N, извлеките первые N строк с помощью head, затем выведите последние N-M+1 строк с помощью tail.

Чуток жизненной практики

Последнее время частенько приходится работать с патчами - накладывать их на приложения через quilt и снимать.

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


$ quilt series | head -n 10 | xargs -L1 quilt push


1) quilt series выводит список патчей в столбец;

2) head -n 10 отображает только первые 10 строк;

3) xargs -L1 quilt push выполняет команду для каждого отдельного патча;

LinuxCamp | #utils
9.02.2025, 12:07
t.me/linuxcamp_tg/189
LI
LinuxCamp | DevOps
10 009 assinantes
18
4
2.0 k
Наткнулись на промо новой облачной конференции. Пошли подробнее узнавать, кто её организует — оказалось, это создатель первого в России публичного облака собственной разработки.

У ребят планируется много технических докладов: от обзоров новых типов сетевых дисков до приоритетов бизнеса в области ИТ — звучит интересно.

Подробнее можете посмотреть тут
9.02.2025, 09:07
t.me/linuxcamp_tg/188
LI
LinuxCamp | DevOps
10 009 assinantes
70
121
1.9 k
Прокачиваемся в grep

При работе в командной строке невозможно обойтись без grep - очень полезная утилита для работы с текстом.

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

Найти точное соответствие

Для того чтобы искать соответствия только целым словам, используйте флаг "-w":


$ ls
'test script.sh' test test_1 test_2

$ ls | grep -w test
test script.sh
test


Аналогичного результата можно добиться через регулярное выражение:


$ ls | grep "\"
test script.sh
test


"\<" — начало слова.
"test" — искомый текст.
"\>" — конец слова.

Угловые скобки должны экранироваться, иначе они будут интерпретироваться как простые символы.

Игнорировать регистр

По умолчанию, grep чувствительна к регистру, что немного мешает поиску. Проблема решается путем добавления ключа "-i" к команде:


ls | grep -i new
newFile
NewFile


Вывод файлов с совпадениями

Используйте параметр "-l", чтобы вывести не сами строки, а только пути к файлам, в которых они содержатся:


$ grep -r -l "libnma" /usr/share
/usr/share/doc/libnma-gtk4-0/copyright


Параметр "-r" отвечает за рекурсивный поиск - grep прошерстит не только 1 уровень каталога, а пойдет вглубь.

Поиск по нескольким параметрам

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


$ ls | grep -i -e new -e old
NewFile
newFile
oldFile


Эту команду система понимает, как "или-или" и выводит все вхождения указанных слов.

Использование регулярных выражений

Настоящая сила grep проявляется, когда вы переходите от сопоставления простых строк к сопоставлению шаблонов - регулярных выражений.

Выражения бывают 2 типов: basic и extended. Одна из особенностей второго типа заключается в том, что некоторые символы требуют экранирования для сохранности фич: ?, +, {, |, (, ), <, >.

Но можно обойтись просто добавлением флага "-E":


$ ls | grep -E "script|test"


1. Квадратные скобки "[]" используются, чтобы провести проверку на соответствие одному из указанных символов:


$ ls | grep "test[23]"
test2
test3


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


$ ls | grep "test[1-3]"
test2
test3


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


$ grep "^[A-Z]" myfile
A lot of text
Hello world


3. Знак доллара "$" означает конец строки. В результат входят только те элементы, конец которых подходит под шаблон:


$ grep "world$" myfile
Hello world
hello world


4. Точка "." обозначает любой одиночный символ, кроме новой строки. Регулярное выражение "....." обозначает любую строку, содержащую минимум 5 символов:


$ grep '.....' myfile


5. Вертикальная черта "|" выполняет роль логического оператора "ИЛИ":


$ ls | grep "script\|test"
script
test


В общем, регулярные выражения прекрасны и многообразны. Детальнее ознакомиться с ними можете по ссылке.

Экранирование

Иногда выражения приводят к неожиданным результатам.

Предположим, вы хотите найти в файле "myfile" только те строки, которые заканчиваются на ".sh".

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


$ grep ".sh" myfile
script_name.sh
script_namesh


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


$ grep "\.sh" myfile
script_name.sh


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

Для этого используется параметр (fixed) "-F":


$ grep -F ".sh" myfile
script_name.sh

LinuxCamp | #utils
7.02.2025, 13:08
t.me/linuxcamp_tg/187
LI
LinuxCamp | DevOps
10 009 assinantes
27
2
2.1 k
Привет, друзья!
Кирилл любезно предоставил мне трибуну, чем я с удовольствием и воспользуюсь!

Меня зовут Александр Логач, я IT- руководитель, с 17 годами опыта в индустрии.
Если вам интересны темы роста, лидерства, креативности и высоких технологий, то мне есть о чём рассказать.

О чём я пишу:

💡 Реальные практические рекомендации:
Как увереннее выступать – практические советы для публичных выступлений.
Начни с малого – как закрыть ментальные долги и сосредоточиться на главном.

🧠 Истории CTO, который за более чем 17 лет повидал всякого:
Три вопроса – методика, которая меняет всё.
Процесс или результат – как не дать клиенту управлять вами.
Идеальное резюме - пошаговая инструкция

🤔 Заставляю задуматься:
Грейды в IT: можно ли стать CTO в 24 года? – о быстром карьерном росте и его реальных перспективах.
6 часов в неделю на работе – как эффективность отличается от иллюзии продуктивности.

Подписывайтесь на мой канал, нам есть о чем поговорить!
7.02.2025, 10:07
t.me/linuxcamp_tg/186
LI
LinuxCamp | DevOps
10 009 assinantes
50
50
2.3 k
Копирование и вставка "по уму"

Вы наверняка умеете работать с копированием и вставкой через сочетания клавиш: Ctrl + C, Ctrl + V.

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

Буфер обмена — это общее название для блока памяти, в котором временно находится скопированная информация.

Большинство X11 окружений рабочего стола поддерживают два варианта буфера:

1. Системный буфер обмена (clipboard). Когда вы выполняете операции "cut/copy" через горячие клавиши, содержимое попадает в этот буфер. После вставки информация извлекается.

2. Первичный буфер обмена (primary selection). Запись происходит, когда вы мышью выделяете текст в определенных приложениях. Для извлечения используется нажатие на колесо.

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

Обычно эти буферы не связаны и хранящиеся в них данные не влияют друг на друга. Записываем что-то в clipboard, primary selection остается нетронутым.

Подключение буферов к потокам

В Linux есть команда xclip, которая соединяет X-буферы обмена с потоками stdin и stdout.

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

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


$ xclip < myfile.txt
$ echo "Some cool text" | xclip



Теперь выведем текст в stdout, перенаправим его в файл и передадим команде wc:


$ xclip -o
Some cool text

$ xclip -o > file.txt
$ xclip -o | wc -w
3


Очистим первичный буфер обмена, поместив в него пустую строку:


$ echo -n | xclip


Параметр "-n" важен, так как в противном случае echo выведет в stdout символ новой строки "\n", который окажется в первичном буфере обмена.

Команда поддерживает явное указание буфера. Чтобы скопировать текст в системный буфер обмена вместо первичного, запустим xclip с параметром "-selection clipboard":


$ ls | grep scr | xclip -selection clipboard

$ xclip -selection clipboard -o
script.sh


Теперь вы можете либо использовать комбинации клавиш для вывода либо просто флаг "-o".

При необходимости параметры xclip могут быть сокращены "-selection clipboard == -sel c"

Немного практики

Чтобы дополнительно облегчить себе жизнь, можно создать на xclip несколько алиасов:


$ alias ccopy="xclip -sel c"
$ alias cpaste="xclip -sel c -o"


Теперь, допустим, нам нужно установить определенный deb пакет, предварительно определив его среди общей массы:


$ ls ~/Downloads | grep code
code_1.96.4-1736994636_arm64.deb


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


$ ls ~/Downloads | grep code | ccopy

$ sudo dpkg -i ~/Downloads/$(cpaste)


LinuxCamp
5.02.2025, 09:07
t.me/linuxcamp_tg/185
LI
LinuxCamp | DevOps
10 009 assinantes
1.8 k
Познаем brace expansion

Продолжаем серию постов по спецсимволам оболочки: (), $(), []. Сегодня говорим про расширение фигурных скобок (brace expansion).

Символы {} позволяют развернуть выражение внутри в последовательность аргументов:


$ echo {1..10}
1 2 3 4 5 6 7 8 9 10

$ echo {10..1}
10 9 8 7 6 5 4 3 2 1


Внутрь скобок может быть добавлен опциональный 3 параметр. С ним выражение {x..y..z} генерирует значения от x до y с шагом z:


$ echo {1..501..100}
1 101 201 301 401 501

$ echo {501..1..100}
501 401 301 201 101 1


Расширение {}, в отличие от команды seq, может создавать последовательность букв:


$ echo {A..P}
A B C D E F G H I J K L M N O P


При желании, можем добавить шаг, например, чтобы выводить символ через 1 в диапазоне от A до P:


$ echo {A..P..2}
A C E G I K M O


Использование перечислений

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


$ mkdir ~/Sources/{test1,test2,test3}


Вариант практического применения данной техники - получение различий между файлами:


$ diff {orig,patched}/path/to/prog.c


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

Немного отойдем от общего вида паттерна, оставим 1 аргумент и создадим бэкап файла:


$ cp -p file.txt{,.bak}
$ ls
file.txt file.txt.bak


Если перед запятой отсутствует значение, подстановка в этом месте пропускается, но вывод, при наличии текста вне {}, выполняется:


$ echo file.txt{,.bak}
file.txt file.txt.bak


Предупреждение: не ставьте пробелы внутри скобок иначе расширение не отработает:


$ echo file{1.. 2}.txt
file{1.. 2}.txt


Изменение формата вывода

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


$ echo {A..P..2} | tr -d " "
ACEGIKMO


Теперь можно создать псевдоним, который печатает n букву английского алфавита:


$ alias nth="echo {A..Z} | tr -d ' ' | cut -c"
$ nth 10
J


Фигурные скобки vs квадратные

Квадратные скобки — это оператор сопоставления имен файлов с шаблоном. Фигурные, в свою очередь, не имеют к файлам никакого отношения. Они просто просчитывают и возвращают последовательность значений.

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


$ ls
file1.txt file2.txt file3.txt file4.txt


Используем сопоставление по шаблону в диапазоне от 1 до 9:


$ ls file[1-9].txt
file1.txt file2.txt file3.txt file4.txt


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

Теперь в этом же диапазоне используем расширение {}:


$ ls file{1..9}.txt

ls: cannot access 'file5.txt': No such file or directory

ls: cannot access 'file6.txt': No such file or directory
...
file1.txt file2.txt file3.txt file4.txt


Оболочка без разбора подставила всю последовательность. Что-то нашлось, что-то нет.

Группировка расширений

Спокойно можно использовать группу символов {} в 1 выражении, чтобы, например, создать несколько файлов с разными расширеними:


$ touch {a,b,c}.{hpp,cpp}
$ ls
a.cpp a.hpp b.cpp b.hpp c.cpp c.hpp


Bash берёт каждую букву из первого набора и комбинирует её со всеми вариантами второго.

Либо еще опция - использовать вложенность. Бывает полезно при создании группы подкаталогов:


$ mkdir -p {source,help{/pages,/yelp,/images}}


$ tree
.
├── help
│   ├── images
│   ├── pages
│   └── yelp
└── source


LinuxCamp
3.02.2025, 10:01
t.me/linuxcamp_tg/184
LI
LinuxCamp | DevOps
10 009 assinantes
2.5 k
Что такое /dev/null и почему туда направляют данные?

Если вы активно работаете в командной строке, то, вероятно, использовали файл /dev/null для следующих целей:

1) убрать из вывода всю ненужную инфу (предупреждения, ошибки и т.д.):


$ find / -name "*.conf" 2>/dev/null


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


$ picom --config /dev/null


3) полностью очистить файл:


$ cat /dev/null > bigfile


Окей, принято, а чем является этот самый /dev/null?

В сущности - это cимвольное псевдо-устройство, которое создается на этапе запуска системы и работает с потоками данных:


$ ls -l
crw-rw-rw- 1 root root 1, 3 Sep 6 08:37 null


О типе устройства говорит первый бит режима файла "c (character)".

Ресурс удаляет все записанное в него и возвращает при чтении EOF (End of File). Когда мы взаимодействуем с /dev/null, неявно отрабатывает специальный драйвер ядра, в который и зашита логика.

Если интересно, можно порыться в исходниках с реализацией: drivers/char/mem.c. Код имеет отношение не только к /dev/null, но и к другим символьным устройствам.

Развернем более подробную информацию:


$ stat /dev/null

File: /dev/null
Size: 0 Blocks: 0 IO Block: 4096   character special file
Access: (0666/crw-rw-rw-)  Uid: (0/ root)   Gid: (0/ root)
Access: 2025-01-25 14:42:20.101000002 +0300
...


Этот вывод показывает, что файл имеет размер 0 байт, для него выделено 0 блоков на диске, дата создания = дата запуска системы:


$ who -b
system boot  2025-01-25 14:42


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


$ echo hello | /dev/null
-bash2: /dev/null: Permission denied


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

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

LinuxCamp
31.01.2025, 12:11
t.me/linuxcamp_tg/183
LI
LinuxCamp | DevOps
10 009 assinantes
2.8 k
Свободное программное обеспечение в высшей школе

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

«Базальт СПО» — российский разработчик операционных систем семейства «Альт». Специалисты компании активно вносят вклад во многие свободные проекты: ядро Linux, glibc, Samba и т. д.

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

Реклама. ООО «Базальт СПО», ИНН 7714350892, erid: 2VtzqxPAT9e
31.01.2025, 09:07
t.me/linuxcamp_tg/182
LI
LinuxCamp | DevOps
10 009 assinantes
3.1 k
Не самый стандартный способ использовать syslog

Расскажу историю о том, как очередная хотелка заказчика заставила меня немного под другим углом взглянуть на syslog. И так, какой самый привычный вам способ обращаться к файлу /var/log/syslog?

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

Если вы разработчик, то можете захотеть направлять туда отладочную информацию. А-ля, подключение к VPN прошло успешно, сертификат принят и т.д. Если вы пишите демон, за которым не может быть закреплен терминал, то вариант с syslog - вынужденная мера.

Так вот, пришел заказчик и говорит: "Нашим пользователям абсолютно неясна причина, по которой подключение к VPN было отклонено. То ли это ошибка в конфигах, то ли сертификат просрочен. Хочется, чтобы на рабочий стол выводилось уведомление с подробным описанием ошибки".

Принято, сделаем. Первое, что пришло в голову - использовать libnotify. Библиотека позволяет через код собирать уведомления и направлять их специальному демону (зависит от окружения) для вывода. Утилита "notify-send" демонстрирует работу API:


$ notify-send header body


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


$ NOTIFD_ID=$(qdbus org.freedesktop.DBus /org/freedesktop/DBus org.freedesktop.DBus.GetConnectionUnixProcessID org.freedesktop.Notifications)

$ ps aux | grep $NOTIFD_ID


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

Частично о проблеме можно почитать тут.

Дальше либо добавлять новые коды ошибок, патчить 3 утилиты "strongswan -> network manager -> nm-applet" и выводить сообщения через nm-applet, либо использовать сторонний ПОЛЬЗОВАТЕЛЬСКИЙ сервис, который бы отслеживал логи и по ним собирал уведомления.

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

В результате, задача решилась следующим образом:

1) проработан ряд конфигов, по которым производился парсинг сообщений syslog и настройка уведомлений;

2) в код strongswan добавлен вывод отладочной информации (в централизованном формате) в файл /var/log/syslog:


DBG1(DBG_CFG, "type=STRONGSWAN action='CONNECTION ERROR REPORT' body='%s'", "Не удалось загрузить сертификат клиента");


3) в правила "роспакоуки" deb пакета добавлены инструкции установки конфигов в системные директории;

С высоты текущего полета не сказал бы, что решение супер гибкое и легко масштабируемое, но правки оказались минимальными и безопасными, что особенно важно при работе с таким софтом, как strongswan.

LinuxCamp
29.01.2025, 09:38
t.me/linuxcamp_tg/181
Os resultados da pesquisa são limitados a 100 mensagens.
Esses recursos estão disponíveis apenas para usuários premium.
Você precisa recarregar o saldo da sua conta para usá-los.
Filtro
Tipo de mensagem
Cronologia de mensagens semelhante:
Data, mais novo primeiro
Mensagens semelhantes não encontradas
Mensagens
Encontre avatares semelhantes
Canais 0
Alta
Título
Assinantes
Nenhum resultado corresponde aos seus critérios de pesquisa