BashMaster
8.27K subscribers
725 photos
18 videos
1 file
748 links
Удобные консольные наработки на каждый день для разработчиков, девопсов и сисадминов.

Реклама: @Kone4noVasya

Канал на бирже: https://telega.in/c/bash_help
Download Telegram
⚙️ Полезные команды GNU/Linux для разработчика. Часть 2

✔️Подборка ориентирована на тех, кто не хочет залезать глубоко в систему, но по работе вынужден иногда ходить на Linux-сервер. Речь пойдет о возможностях bash, работе с сетью и ssh.

➡️ Команды bash
По умолчанию в большинстве дистрибутивов Linux сейчас используется оболочка bash. У нее есть много интересных возможностей.

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

▶️Очистить консоль от предыдущего хлама, который там накопился можно командой clear

▶️Альтернативная команда позволяет также вернуть клиентскую часть терминала в первоначальный режим (если внезапно все сломалось) — reset

🖼️ Дочитать статью

🔨 bash_help
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥73
⚙️ Advanced Bash-Scripting Guide

✔️Искусство программирования на языке сценариев командной оболочки.

➡️ Данное руководство не предполагает наличие у читателя познаний в области программирования на языке сценариев, однако, быстро восполняет этот недостаток, постепенно, шаг за шагом, раскрывая мудрость и красоту UNIX. Это руководство может рассматриваться как учебник, предназначенный для самостоятельного изучения или как справочник по программированию на shell.

▶️Руководство снабжено серией хорошо прокомментированных примеров, поскольку лучший путь к изучению языка сценариев — это написание сценариев.

🖼️ Перейти к руководству

🔨 bash_help
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥73
Бесплатный однодневный интенсив по искусственному интеллекту!

За 1 день научим тебя писать нейронные сети. Напишешь 9 нейронок с нуля, без опыта программирования!

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

Регистрируйся прямо сейчас, исследуй футуристичный мир нейросетей с нами!

Реклама. ООО "ТЕРРА ЭЙАЙ". ИНН 9728019395. erid: LjN8KQEYZ
3😐2👍1
⚙️ Как отправлять и обрабатывать графические уведомления на bash

✔️Сегодня будет разбор интересной задачи: как рисовать красивые графические уведомления и взаимодействовать с ними из скриптов bash.

➡️ Демонстрация будет осуществляться не на абстрактных примерах, а на вполне реальной задаче — необходимо уведомить пользователя о скором истечении пароля и дать возможность его сменить. Ситуация не надуманная — компьютер в домене, sssd даёт возможность авторизоваться/аутентифицироваться пользователю, но вот демонстрировать ему информацию о необходимости смены пароля не может — не его уровень. Вроде как gdm готов этим заняться, только весьма специфически — при удачном логине быстро проскакивает малозаметная строчка с информацией о последнем входе и количестве дней до смены. Раньше, когда все пользователи Linux в большинстве своём были сисадминами/гиками, это никого особо не напрягало. А вот сейчас, из-за активного импортозамещения, появилось большое количество «начинающих» пользователей Linux и, как следствие, достаточно глупые заявки — учётка заблочилась, потому что кто-то не поменял пароль вовремя.

✔️Архитектура проекта
Мы люди серьёзные — сначала думаем, а потом делаем (или не делаем). Набросаем нечто вроде ТЗ: Уведомление должно быть ненавязчивым, а также всё должно быть красиво и удобно!

В качестве среды исполнения будет bash, coreutils — в общем всё, что есть в фундаментальных трудах предков, с учётом современных реалий.

➡️ Скрипт будет исполняться при старте графической сессии пользователя и производить следующие действия:

▶️Определять дату истечения пароля данного пользователя.
▶️В случае, если до истечения пароля осталось менее 7 дней, выводить уведомление пользователю с предложением изменить его.
▶️Если пользователь согласился изменить пароль — вызвать штатную утилиту изменения пароля.
▶️Если пользователь бездействует, уведомление исчезает.

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

🖼️ Дочитать статью

🔨 bash_help
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥53
Курс "Профессия Пентестер" стартует 22 июля!

- Научитесь атаковать сети, WEB-сайты, операционные системы и локальные устройства и проводить внутренний и внешний пентест
- Участвуйте в BugBounty программах или постройте карьеру в сфере информационной безопасности

Полный цикл обучения:
- от освоения Kali Linux и администрирования, до написания эксплойтов и шелл-кода, обхода антивирусных решений
- от сетевой разведки до эксплуатации уязвимостей, повышения привилегий и закрепления в сети

Хотите стать пентестером? Присоединяйтесь к нам – защищайте мир от угроз, находя уязвимости и предотвращая кибератаки!

Пишите нам @Codeby_Academy или 
Узнайте подробнее о курсе
👍31🔥1
⚙️ Как запускать команды внутри контейнера Docker?

✔️ Контейнер Docker – это изолированная среда, которая обычно содержит одно приложение со всеми необходимыми зависимостями.
Зачастую нам необходимо запустить некоторые команды внутри контейнера. Есть несколько способов, которыми мы можем выполнить команду внутри контейнера и получить требуемый результат.

➡️ Использование интерактивного шелла
Мы можем напрямую обращаться к оболочке контейнера и выполнять наши команды, как в обычном терминале Linux. Чтобы получить интерактивную оболочку остановленного (не в рабочем состоянии) контейнера, вы можете использовать:
$ docker run -it ubuntu bash


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

Если контейнер уже запущен, вы можете использовать команду exec, как показано ниже.

Узнаем идентификатор контейнера.
$ docker ps


Затем зайдем в контейнер с идентификатором, например, c2d969adde7a
$ docker exec -it c2d969adde7a bash 
root@c2d969adde7a:/#


В приведенном выше выводе вы можете заметить, что мы запустили сеанс bash контейнера nginx, который находился в рабочем состоянии.
Здесь мы можем выполнить любую поддерживаемую команду и получить результат.

Обратите внимание: в вашем контейнере может не быть bash, и если это так, вы можете использовать sh.
docker exec -it c2d969adde7a sh


➡️ Прямой вывод
Зачастую нам просто нужен вывод одной или двух команд и не требуется полноценный интерактивный сеанс для нашей задачи.
Вы можете запустить требуемую команду внутри контейнера и получить ее вывод напрямую, не открывая новый сеанс оболочки, используя команду exec без флага -it.

Cинтаксис будет таким:
$ docker exec <container-id or name> <command>


➡️ Использование Dockerfile
Это не совсем тот способ, которым вы можете запускать команды внутри контейнера, хотя он может быть полезен в ситуациях разработки или для начальной отладки развертывания и т.д.

Мы можем использовать команду RUN внутри Dockerfile.
Вот наш пример Dockerfile:
FROM nginx:latest
RUN nginx -V


Данный метод просто извлекает последний образ nginx из реджестри, а затем запускает команду nginx -V, чтобы отобразить версию Nginx при создании образа.

🖼️ Дочитать статью

🔨 bash_help
Please open Telegram to view this post
VIEW IN TELEGRAM
8🔥5👍3
Курс по Kubernetes для разработчиков. Видеокурс по Docker в подарок ⤵️

Ваша компания решила мигрировать сервисы на Kubernetes?
Большая часть интересных вам вакансий требует навыков в K8s?
Вы не врубаетесь, где границы ответственности девопсов и разработчиков в работе с кубами?

Разбираемся с этим на курсе Слёрма «Kubernetes для разработчиков» 😎

Старт потока — 22 июля

ПРОГРАММА КУРСА

Вас ждут:
7 недель обучения 
112 часов практики + 26 часов теории
Общий чат со студентами, экспертами и куратором
Стенды для отработки практических навыков
Сдача сертификации
Итоговый проект

Эксперты — действующие devops-инженеры:
➡️ Марсель Ибраев, Senior System Engineer G42 Cloud
➡️ Павел Селиванов, архитектор Yandex Cloud

🎁 При оплате обучения до 22 июля — видеокурс по основам Docker в подарок🎁

🔗 ПРОЙТИ ПЕРВЫЕ ТРИ УРОКА БЕСПЛАТНО
👍2
⚙️ Подборка часто используемых инструментов удаленного подключения

▶️ Xshell — это очень мощное программное обеспечение для эмуляции защищенного терминала, которое поддерживает SSH1, SSH2 и протокол TELNET платформы Windows. Xshell можно использовать в интерфейсе Windows для доступа к удаленным серверам на различных системах, тем самым лучше достигая цели терминала удаленного управления.

▶️ SecureCRT — это мощное программное обеспечение для эмуляции защищенного терминала, которое может помочь пользователям более безопасно подключаться к удаленным серверам, а также может быть использовано для реализации функций удаленного управления сервером и передачи файлов. SecureCRT поддерживает протоколы SSH1, SSH2, Telnet, Rlogin, Serial и SSL/TLS, которые могут быть использованы для подключения к различным удаленным терминалам, что позволяет удовлетворить различные потребности пользователей.

▶️ WinSCP — это графический клиент SFTP с открытым исходным кодом, который использует SSH в среде Windows. Он также поддерживает протокол SCP. Его основная функция — безопасное копирование и передача файлов между локальным и удаленным компьютерами.

▶️ Putty — это легкий клиент SSH и Telnet, который может помочь пользователям подключиться к удаленным серверам, а также поддерживает протокол шифрования аутентификации SSH-2, что может сделать доступ пользователей к сети более безопасным. Putty также поддерживает протокол SSH на платформе Windows, что позволяет пользователям лучше контролировать удаленные серверы.

▶️ MobaXterm предоставляет комплексные возможности, почти все важные удаленные сетевые инструменты (такие как SSH, X11, RDP, VNC, FTP, MOSH и т.д.), а также команды Unix на рабочем столе Windows (bash, ls, cat, sed, grep, awk, rsync и т.д.), и автоматически открывает режим sftp после входа в систему.

▶️ Tabby — это современный инструмент терминального подключения, с открытым исходным кодом и кроссплатформенный, поддерживающий системы Windows, MacOS и Linux. Tabby имеет более 20k+ Star на Github, что говорит о том, что это очень популярный терминальный инструмент!

🖼️ Ссылка на источник

🔨 bash_help
Please open Telegram to view this post
VIEW IN TELEGRAM
👍74🔥4😐3
⚠️ Как создать собственный тип данных с помощью PostgreSQL?

Расскажем на открытом уроке «Пользовательские типы данных в PostgreSQL» в рамках практического курса «PostgreSQL для администраторов баз данных и разработчиков» от OTUS

🔹На открытом уроке рассмотрим как можно создать пользовательский тип и как с ним работать.

🔹Разберем несколько примеров детально "до винтика"

🦾  PostgreSQL — навык, открывающий двери в более интересные и перспективные проекты. Тестируйте занятие на бесплатном уроке и начните обучение уже 30 июля. 

👉  Регистрация и подробности
https://otus.pw/KVCL/?erid=LjN8KRVSz
2
⚙️ Каталог /bin

✔️В каталоге /bin находятся бинарные или исполняемые файлы. Программы пишутся в исходном коде, который представляет собой текст, читаемый человеком. Затем исходный код компилируется в машинный двоичный код. Они называются двоичными, потому что машинный код представляет собой серию нулей и единиц. Важно знать, что команды, программы и приложения, которые вы можете использовать, иногда находятся в каталоге /bin.

/bin содержит оболочки типа bash и часто используемые команды, такие как cp, mv, rm, cat, ls, grep, tar, kill, echo, ps, gzip, ping, su и vi, которые используются как системным администратором, так и непривилегированными пользователями. Он содержит необходимые двоичные файлы (в отличие от каталога /usr/bin), в том числе для загрузки. Он также может содержать команды, которые косвенно используются скриптами.

Список всех программ в /bin можно посмотреть с помощью команды ls, которая обычно используется для просмотра содержимого каталогов : ls /bin

➡️ Следующие команды или символические ссылки на них должны находиться в /bin:

cat — Утилита для конкатенации файлов в стандартный вывод
chgrp — Утилита для изменения группы, которой принадлежит файл или директория
chmod — Утилита для изменения прав доступа к файлам
chown —Утилита для изменения владельца и группы файлов
cp — Утилита для копирования файлов и каталогов
date — Утилита для вывода или установки системных данных и времени
dd — Утилита для преобразования и копирования файла
df — Утилита для создания отчета об использовании дискового пространства файловой системы
dmesg — Утилита для вывода буфера сообщений ядра в стандартный поток вывода (по умолчанию на экран)
echo — Утилита для отображения строки текста
false — Утилита, единственное действие которой — возвратить ненулевое значение (обычно 1)
hostname — Утилита для отображения или установки имени хоста системы
kill — Утилита отправляет сигнал процессу(-ам), указанному с помощью каждого из операндов идентификатор_процесса
ln — Утилита командной строки для создания ссылок между файлами
login — Утилита, которая позволяет пользователям войти в систему
ls — Утилита для просмотра содержимого каталога
mkdir — Утилита для создания каталогов
mknod — Утилита создаёт запись в файловой системе (обычный файл, файл устройства или именованный канал)
more — Утилита для постраничного просмотра текста
mount — Утилита для монтирования файловой системы
mv — Утилита для перемещения/переименования файлов
ps — Утилита для сообщения о состоянии процесса
pwd — Утилита выводит полный путь от корневого каталога к текущему рабочему каталогу
rm — Утилита для удаления файлов или каталогов
rmdir — Утилита для удаления пустых каталогов
sed — Утилита Sed работает с текстовыми файлами
sh — Это интерпретатор командного языка, который выполняет команды, прочитанные из строки командной строки, стандартный ввод или указанный файл
stty — Утилита для изменения и печати настроек терминальной строки
su — Утилита для изменения идентификатора пользователя
sync — Утилита Unix, предназначенная для обновления файловых систем и для синхронизации данных на диске с данными в памяти
true — Утилита, единственное действие которой — возвратить значение 0
umount — Утилита для размонтирования файловых систем
uname — Утилита для вывода информации о системе

🔨 bash_help
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥75😐1
Курс "Профессия Пентестер" стартует 22 июля!

- Научитесь атаковать сети, WEB-сайты, операционные системы и локальные устройства и проводить внутренний и внешний пентест
- Участвуйте в BugBounty программах или постройте карьеру в сфере информационной безопасности

Полный цикл обучения:
- от освоения Kali Linux и администрирования, до написания эксплойтов и шелл-кода, обхода антивирусных решений
- от сетевой разведки до эксплуатации уязвимостей, повышения привилегий и закрепления в сети

Хотите стать пентестером? Присоединяйтесь к нам – защищайте мир от угроз, находя уязвимости и предотвращая кибератаки!

Пишите нам @Codeby_Academy или 
Узнайте подробнее о курсе
1
⚙️ Шпаргалка по Docker для DevOps-инженера

✔️Ловите полезную шпаргалку по Docker, которая содержит примеры различных команд и их пояснение.

➡️ Содержание:
▶️Установка Docker
▶️Информация и регистрация
▶️Управление контейнерами (Container Management)
▶️Управление образами (Images Management)
▶️Отличия Save, Load от Export, Import
▶️Запуск docker (Run)
▶️Хранилище (Volumes)
▶️Сеть (Network)
▶️CMD VS ENTRYPOINT
▶️Лучшая практика(Best Practice)

🖥 Ссылка на шпаргалку

🔨 bash_help
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥107👍3
⚙️ LUKS. Автомонтирование при загрузке

✔️Для автоматической расшифровки LUKS разделов и их монтирования можно использовать небольшой bash скрипт, который запускается при старте системы.

Причина написания этой статьи: "все диски необходимо шифровать!". Это нужно не только на случай утери устройства, но и на случай замены на новое. Зачастую об этом вспоминаешь только после того, как выбросил незашифрованный носитель. После чего молишься, чтобы его на свалке никто никогда не нашёл. Но чтобы шифрование не превратилось в боль, оно должно открываться незаметно...

➡️ Далее действия для создания скрипта делаем от лица root пользователя.
▶️Создаём файл /root/luks_passwd пишем пароль для расшифровки тома.
▶️Создаём скрипт /root/luks_unlock, который будет разблокировать и монтировать раздел:

key_file='/root/luks_passwd'  # путь к файлу с ключом
mount_point='/mnt/files' # точка монтирования
UUID='658f0eb8-fdc6-4440-a8fd-46b7bc8ae0ba' # UUID диска, который надо примонтировать к точке
name='files' # название диска для mapper

# определяем имя диска по его UUID (напр. /dev/sda1)
disk=''
while [[ ${#disk} == 0 ]]; do
# диск может подключаться не сразу после старта системы, поэтому делаем много попыток с задержко
echo "Получаем путь к диску по его UUID=${UUID}"
disk=$( blkid | grep ${UUID} | awk '{print $1}' | tr -d ':|\n' )
if [[ ${#disk} == 0 ]]; then
sleep 5
else
echo "Диск ${name} найден тут: ${disk}"
fi
done

# расшифровываем диск
while [[ ! -e /dev/mapper/${name} ]]; do
echo "Расшифровываем диск ${name}: ${disk}"
cat ${key_file} | cryptsetup luksOpen ${disk} ${name} -
if [[ ! -e /dev/mapper/${name} ]]; then
sleep 5
else
echo "Диск успешно расшифрован ${name}: ${disk}"
fi
done

# монтируем
while [[ "$( lsblk -o MOUNTPOINT | grep -i ${mount_point} | wc -l | tr -d '\n' )" == 0 ]]; do
echo "Монтируем ${name}: ${disk}"
mount /dev/mapper/${name} ${mount_point}
sleep 5
done

Ставим скрипт /root/luks_unlock на автозагрузку через крон. Для этого можно в файле /etc/crontab добавить в конец такую строку:
@reboot root bash /root/luks_unlock


Но этот файл затрётся при полном обновлении системы (например, через команду do-release-upgrade в Ubuntu). Поэтому лучше записать в персональные cron задачи. Для этого выполняем crontab -e и пишем в конец:

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

@reboot bash /root/luks_unlock


Обратите внимание, что если не задать SHELL и PATH, то скрипт не выполнится корректно, потому что ему будет непонятно, откуда брать утилиты lsblk и blkid. А вот в общесистемном crontab файле эти директивы определены.

🖼️ Ссылка на источник

🔨 bash_help
Please open Telegram to view this post
VIEW IN TELEGRAM
👍96🔥5
Если ты читаешь «BashMaster», скорее всего у тебя уже имеется базовый опыт системного администрирования. И это хорошо, потому что уже в этот вторник, 23-го июля, школа IT-профессий Level Up запускает новый поток курса «DevOps-инженер. Интенсив», который поможет ускоренно изучить профессию, а точнее перейти на новый уровень.

Чему ты научишься?
- понимать основные принципы и философию DevOps
- пользоваться инструментами для автоматизации процессов разработки
- автоматизировать процессы деплоя с помощью инструментов CI/CD
- понимать основные этапы и методы разработки ПО
- четко видеть свою роль в процессах разработки
- лучше контролировать и управлять production, development, и тестовыми-средами
- многое другое
Подробнее о курсе, программе, преподавателе (он хорош) - по ссылке.

Эксклюзивно для подписчиков «BashMaster» честная (действует даже при рассрочке) скидка 20% по промокоду BASHHELP

Реклама. ООО "ОБРАЗОВАТЕЛЬНЫЕ РЕШЕНИЯ". ИНН 7801715236. erid: 2VtzqvLWQMQ
👍3🔥1
⚙️ Подводные камни Bash

✔️В этой статье мы поговорим об ошибках, совершаемых программистами на Bash. Во всех приведённых примерах есть какие-то изъяны. Вам удастся избежать многих из нижеописанных ошибок, если вы всегда будете использовать кавычки и никогда не будете использовать разбиение на слова (wordsplitting)! Разбиение на слова — это ущербная легаси-практика, унаследованная из оболочки Bourne. Она применяется по умолчанию, если вы не заключаете подстановки (expansions) в кавычки. В общем, подавляющее большинство подводных камней так или иначе связаны с подстановкой без кавычек, что приводит к разбиению на слова и глоббингу (globbing) получившегося результата.

➡️ Содержание
▶️for i in $(ls *.mp3)
▶️cp $file $target
▶️Имена файлов с предшествующими дефисами
▶️[ $foo = «bar» ]
▶️cd $(dirname "$f")
▶️[ "$foo" = bar && "$bar" = foo ]
▶️[[ $foo > 7 ]]
▶️grep foo bar | while read -r; do ((count++)); done
▶️if [grep foo myfile]
▶️if [bar="$foo"]; then ...
▶️if [ [ a = b ] && [ c = d ] ]; then ...
▶️read $foo
▶️cat file | sed s/foo/bar/ > file
▶️echo $foo
▶️$foo=bar
▶️foo = bar
▶️echo <<EOF
▶️su -c 'some command'
▶️cd /foo; bar
▶️[ bar == "$foo" ]
▶️for i in {1..10}; do ./something &; done
▶️cmd1 && cmd2 || cmd3
▶️echo «Hello World!»
▶️for arg in $*
▶️function foo()
▶️echo "~"
▶️local varname=$(command)
▶️export foo=~/bar
▶️sed 's/$foo/good bye/'
▶️tr [A-Z] [a-z]
▶️ps ax | grep gedit
▶️printf "$foo"
▶️for i in {1..$n}
▶️if [[ $foo = $bar ]] (в зависимости от цели)
▶️if [[ $foo =~ 'some RE' ]]
▶️[ -n $foo ] or [ -z $foo ]
▶️[[ -e "$broken_symlink" ]] возвращает 1, несмотря на существование $broken_symlink
▶️Сбой ed file <<<«g/d\{0,3\}/s//e/g»
▶️Сбой подцепочки (sub-string) expr для «match»
▶️Про UTF-8 и отметках последовательности байтов (Byte-Order Marks, BOM)
▶️content=$(<file)
▶️for file in ./*; do if [[ $file != *.* ]]
▶️somecmd 2>&1 >>logfile
▶️cmd; ((! $? )) || die
▶️y=$(( array[$x] ))
▶️read num; echo $((num+1))
▶️IFS=, read -ra fields <<< "$csv_line"
▶️export CDPATH=.:~/myProject

🖼️ Дочитать статью

🔨 bash_help
Please open Telegram to view this post
VIEW IN TELEGRAM
👍86🔥4
Уйти в пентест? Стать devops-инженером или системным администратором? 
Только вам решать, куда расти, если вы знаете Linux.

Курс "Основы Linux" обучит вас тонкостям работы с ОС: от работы в командной строке до создания прикладных программ.

- 70% практики
- сопровождение куратора
- финальный проект для портфолио
- сертификат или удостоверение о повышении квалификации
- одна из самых низких цен на обучение

Старт 8 августа (длительность 3,5 месяца)

@Codeby_Academy
+74994441750

Узнать подробнее
3👍2
⚙️ SSH. Получить отпечаток ключа сервера по ip

✔️Получить отпечаток всех публичных SSH ключей сервера по его ip адресу можно с помощью следующей команды:
ssh-keygen -lf <(ssh-keyscan ip_адрес 2>/dev/null)


▶️Или можно так:
ssh-keyscan ip_адрес | ssh-keygen -lf -


▶️Или себя самого:
ssh-keyscan 127.0.0.1 | ssh-keygen -lf -


➡️ Вывод формата ключа будет таким, как при первом соединении с сервером через SSH, когда система спрашивает надо ли добавить ключ в список доверенных.

▶️Если необходимо показать ключ, обработанный определённым алгоритмом, то для ssh-keygen надо указать параметр с ключом -E и названием алгоритма:
ssh-keygen -E md5 -lf <(ssh-keyscan ip_адрес 2>/dev/null)


🖼️ Ссылка на источник

🔨 bash_help
Please open Telegram to view this post
VIEW IN TELEGRAM
11👍6🔥3
This media is not supported in your browser
VIEW IN TELEGRAM
"Разработка игр — это дорого!" Но как же minecraft, among us?

Indie Spotlight 👈 чат для инди-разработчиков, в котором найдётся ответ на любой вопрос:

— Как собрать и управлять командой по разработке игр?
— Как продвинуть игру без бюджета?
— Как монетизировать проект в условиях санкций?

👆Также у проекта есть телеграм-канал, где вы сможете ознакомиться с играми других разработчиков, оценить игры других участников, а также принять участие в розыгрышах призов таких, как Playstation 5, мониторы и раздачи ключей к играм💡

Это первое подобное комьюнити в телеграм:
➡️ Вступить в чат
➡️ Перейти в канал
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
⚙️ Почему нельзя парсить вывод ls(1)

✔️Команда ls(1) достаточно хорошо справляется с отображением атрибутов одного файла (по крайней мере, в некоторых случаях), но когда просишь у неё список файлов, возникает огромная проблема: Unix позволяет использовать в имени файла почти любой символ, в том числе пробелы, переносы строк, точки, символы вертикальной черты, да и практически всё остальное, что вы можете использовать как разделитель, за исключением NUL. Существуют предложения по «исправлению» этой ситуации внутри POSIX, но они не помогут в решении текущей ситуации.

➡️ Если в качестве стандартного вывода не используется терминал, в режиме по умолчанию ls разделяет имена файлов переносами строк. И никаких проблем не возникает, пока не встретится файл, в имени которого есть перенос строки. Так как очень немногие реализации ls позволяют завершать имена файлов символаи NUL, а не переносами строк, это не позволяет получить безопасным образом список имён файлов при помощи ls (по крайней мере, портируемым способом).
$ touch 'a space' $'a\nnewline'
$ echo "don't taze me, bro" > a
$ ls | cat
a
a
newline
a space

Этот вывод показывает, что у нас есть два файла с именем a, один с именем newline и один с именем space.

Но если воспользоваться ls -l, то можно увидеть, что это совершенно не так:
$ ls -l
total 8
-rw-r----- 1 lhunath lhunath 19 Mar 27 10:47 a
-rw-r----- 1 lhunath lhunath 0 Mar 27 10:47 a?newline
-rw-r----- 1 lhunath lhunath 0 Mar 27 10:47 a space

Проблема в том, что из вывода ls ни пользователь, ни компьютер не может сказать, какие его части составляют имя файла. Это каждое слово? Нет. Это каждая строка? Нет. На этот вопрос есть только один правильный ответ: мы не можем этого понять.

▶️Также стоит отметить, что иногда ls повреждает данные имён файлов (в нашем случае она превратила символ переноса строки между словами a и newline в вопросительный знак. (Некоторые системы вместо него ставят \n.) В некоторых системах команда не делает этого, когда вывод происходит не в терминал, а в других имя файла всегда повреждается. В конечном итоге, никогда не стоит считать, что вывод ls будет истинным представлением имён файлов, с которыми вы работаете.

🖼️ Дочитать статью на Habr'е

🔨 bash_help
Please open Telegram to view this post
VIEW IN TELEGRAM
👍87🔥4
Forwarded from localhost
Media is too big
VIEW IN TELEGRAM
С днём сисадмина! 🍺

Предлагаю в очередной раз насладиться классикой :)

localhost › IT-юмор
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥39👍11