Давай повелосипедим и напишем таймер на со-процессах, без использования каких-то внешних команд типа sleep и т.п.
1. Создаем фоновый со-процесс read
2. Спим 0.10 секунды
3. Выводим на экран new velosiped
4. Опять спим, но уже 11 секунд
5. Выходим
За указания задержки, как раз отвечает параметр -t. А параметр -u говорит что чтение данных нужно осуществлять с файлового дескриптора запущенного в фоне со-процесса. Белиберда? Еще какая!
В sleep, кстати тоже можно указывать миллисекунды: sleep 0.10
Со-процессинг это одновременное выполнение двух процедур, одна из которых считывает вывод другой.
Чтобы запустить со-процесс, используется зарезервированное слово coproc. Доступ к этому со-процессу осуществляется посредствам массива COPROC.
${COPROC[0]} - для записи
${COPROC[1]} - для чтения
В реализации такого таймера есть и подводные камни. Таймер может отставать как механические часы, это зависит от загруженности самой системы.
Если запустить одну команду coproc read, на экран выведется PID запущенного в фоне процесса [1] 126594. Чтобы посмотреть список запущенных в фоне команд, выполняем jobs и видим список:
То есть получается ты запускаешь в фоне какую-то программу, а в другой программе, подключаешься через массив COPROC записываешь либо считываешь нужные тебе данные.
Еще пример:
По итогу получаем вывод на экран, слово: bim
Давай попробуем попроще:
1. Создаем со-процесс, который в фоне выполнит whoami
2. Прочитаем в переменную user, то что вывел со-процесс
3. Выводим на экран, у меня отобразилось root
Фуф, тут вроде более понятно получилось объяснить. Ну а если не понял, значит оно нахер тебе и не нужно.
Короче без бутылки тут не разобраться, это из оперы «высший пилотаж» и брейнфак.
Зачем это нужно и где применять? Понятия не имею. Я обычно не лезу в со-процессы, это усложняет скрипт, а коллеги которые не в теме, вообще не смогут его поддерживать.
Ну и на закуску, совсем уж упороться:
Несколько команд, которые помогут понять, как вся эта шляпа реализована.
1. Создаем со-процесс
2. Выводим содержимое массива COPROC
3. Выводим каналы текущей оболочки.
4. Выводим каналы со-процесса.
Смотрим на имена, биты разрешений (r/w) ссылок и на что они указывают.
Как сказал один западный эксперт:
Вот такие пироги, изучай.
tags: #linux #bash
—
💩 @bashdays
#!/bin/bash
coproc read
read -t 0.10 -u "${COPROC[0]}"
echo 'new velosiped'
read -t 11 -u "${COPROC[0]}"
exit
1. Создаем фоновый со-процесс read
2. Спим 0.10 секунды
3. Выводим на экран new velosiped
4. Опять спим, но уже 11 секунд
5. Выходим
За указания задержки, как раз отвечает параметр -t. А параметр -u говорит что чтение данных нужно осуществлять с файлового дескриптора запущенного в фоне со-процесса. Белиберда? Еще какая!
В sleep, кстати тоже можно указывать миллисекунды: sleep 0.10
Со-процессинг это одновременное выполнение двух процедур, одна из которых считывает вывод другой.
Чтобы запустить со-процесс, используется зарезервированное слово coproc. Доступ к этому со-процессу осуществляется посредствам массива COPROC.
${COPROC[0]} - для записи
${COPROC[1]} - для чтения
В реализации такого таймера есть и подводные камни. Таймер может отставать как механические часы, это зависит от загруженности самой системы.
Если запустить одну команду coproc read, на экран выведется PID запущенного в фоне процесса [1] 126594. Чтобы посмотреть список запущенных в фоне команд, выполняем jobs и видим список:
[1] Running coproc COPROC read &
[2] Running coproc COPROC read &
[3] Running coproc COPROC read &
То есть получается ты запускаешь в фоне какую-то программу, а в другой программе, подключаешься через массив COPROC записываешь либо считываешь нужные тебе данные.
Еще пример:
coproc awk '{print $2;fflush();}'
echo bom bim bom >&${COPROC[1]}
read -ru ${COPROC[0]} var
echo $varПо итогу получаем вывод на экран, слово: bim
Давай попробуем попроще:
coproc (echo $(whoami))
read -r user <&"${COPROC[0]}"
echo $user
1. Создаем со-процесс, который в фоне выполнит whoami
2. Прочитаем в переменную user, то что вывел со-процесс
3. Выводим на экран, у меня отобразилось root
Фуф, тут вроде более понятно получилось объяснить. Ну а если не понял, значит оно нахер тебе и не нужно.
Короче без бутылки тут не разобраться, это из оперы «высший пилотаж» и брейнфак.
Зачем это нужно и где применять? Понятия не имею. Я обычно не лезу в со-процессы, это усложняет скрипт, а коллеги которые не в теме, вообще не смогут его поддерживать.
Ну и на закуску, совсем уж упороться:
Несколько команд, которые помогут понять, как вся эта шляпа реализована.
coproc read
echo "${COPROC[@]}"
ls -l /proc/$$/fd | grep 'pipe'
ls -l /proc/$COPROC_PID/fd | grep 'pipe'
1. Создаем со-процесс
2. Выводим содержимое массива COPROC
3. Выводим каналы текущей оболочки.
4. Выводим каналы со-процесса.
Смотрим на имена, биты разрешений (r/w) ссылок и на что они указывают.
Как сказал один западный эксперт:
Пока я не могу придумать никаких задач для со-процессов, по крайней мере не являющихся надуманными.
Вот такие пироги, изучай.
tags: #linux #bash
—
Please open Telegram to view this post
VIEW IN TELEGRAM
👍83
Доброе всем! Я как ценитель всяких бумажных Bullet Journal и подобных ежедневников, в какой-то момент перегорел. Стало лень писать ручкой, заполнять задачки и планировать рабочий день. Не знаю по какой причине это произошло.
Но скорее всего по причине — если ты спланировал свой день, 100% все пойдетпопизде не по плану. Это как со скрам спринтами, спланировали спринт, тут же прибежала озабоченная обезьяна и насувала в кабину «очень» срочных задач. Понятно дело, это на подсознании отлично демотивирует.
Но без личного таск-трекера опять же никуда. Носить в голове 100500 задач, рабочих, бытовых и т.п. не вариант. Сейчас ты помнишь, что нужно было оплатить домен, а через секунду уже не помнишь. Классика.
Я так недавно промотал оплату корпоративного VPN и пришлось в срочном порядке платить со своей личной карты. Естественно потом мне бабки никто не вернул. Бюрократия. Игра не стоит свеч.
По крайней мере у меня так. Поэтому я стараюсь все выгружать из головы в одно место. Нет, не в жопу. Раньше на бумагу, а теперь прям в консольный TaskWarrior. Щас расскажу, что это за пепяка такая.
TaskWarrior это консольный трекер-задач с открытым исходным кодом. Черношляпы еще его называют ТуДу-ВуДу лист для хакеров.
Короче, открываем консольку…
Конечно же предварительно taskwarrior нужно установить, есть под все операционки и дистрибутивы. Дока по установке тут. Ставится на уровне пакетных менеджеров, но можно и через исходники скомпилировать если ты любитель прекрасного.
Как говорится на этом можно и закончить. Но хотелось бы еще посмотреть список всех задачек, которые мы создали. Для этого фигачим:
Дополнительно у меня создано 2 проекта, home и work. По ним раскидываю задачи, которые относятся к домашним делам и рабочим. Чтобы было проще ориентироваться и выводить нужные на экран.
Чтобы синхронизировать заметки и задачи между устройствами, нужно поднять свой ламповый сервер. Будет единая точка входа с базой данных. А там уже цепляйся к нему хоть с писюка хоть с андроида/ios, и крути педали. Удобнее конечно через docker-compose все поднимать.
Для удобства я сделал себе несколько алиасов, теперь мне не нужно каждый раз писать task и название проекта.
💩 страница проекта
🐱 страница на гитхабе
💩 клиент для андроида и тут
💩 клиент для айфона
Как это выглядит визуально, можешь глянуть тут, подзалил нативно картичночки. А тут крутой sheets по tw.
Ладно, убежал. Если бухгалтерию разгребу, вечерком чего-нибудь забашим или обсудим!
tags: #linux #utilites #рабочиебудни
—
💩 @bashdays
Но скорее всего по причине — если ты спланировал свой день, 100% все пойдет
Но без личного таск-трекера опять же никуда. Носить в голове 100500 задач, рабочих, бытовых и т.п. не вариант. Сейчас ты помнишь, что нужно было оплатить домен, а через секунду уже не помнишь. Классика.
Я так недавно промотал оплату корпоративного VPN и пришлось в срочном порядке платить со своей личной карты. Естественно потом мне бабки никто не вернул. Бюрократия. Игра не стоит свеч.
По крайней мере у меня так. Поэтому я стараюсь все выгружать из головы в одно место. Нет, не в жопу. Раньше на бумагу, а теперь прям в консольный TaskWarrior. Щас расскажу, что это за пепяка такая.
TaskWarrior это консольный трекер-задач с открытым исходным кодом. Черношляпы еще его называют ТуДу-ВуДу лист для хакеров.
Короче, открываем консольку…
У меня вообще с этим отлично реализовано в iTerm. Консолька открывается в Drop-down режиме по нажатию F1. То есть сверху вниз, поверх всех окон выезжает мой основной рабочий инструмент. Ну и также закрывается. Привык, ОЧЕНЬ удобно! Под линуксы и винду такое тоже реализуемо и есть из коробки. Отдельный пост про это надо будет запилить.Давай создадим в TW первую таску:
task add "Написать пост про taskwarrior"Всё! Задачка в бэклоге и про нее уже не забудешь, можно смело выкидывать из головы и торжествовать.
Конечно же предварительно taskwarrior нужно установить, есть под все операционки и дистрибутивы. Дока по установке тут. Ставится на уровне пакетных менеджеров, но можно и через исходники скомпилировать если ты любитель прекрасного.
Как говорится на этом можно и закончить. Но хотелось бы еще посмотреть список всех задачек, которые мы создали. Для этого фигачим:
task lsИ получаем желаемый список Ну а чтобы пометить таску как выполненную, делаем:
task done 1/2/3/4/5Подставляем индекс таски, которую нужно закрыть. Всё! Это основное. Простота и удобство! Не думай что TW на столько ущербен, там из коробки просто нереальный функционал. Но я использую наверное процента два от всего возможного.
Дополнительно у меня создано 2 проекта, home и work. По ним раскидываю задачи, которые относятся к домашним делам и рабочим. Чтобы было проще ориентироваться и выводить нужные на экран.
Чтобы синхронизировать заметки и задачи между устройствами, нужно поднять свой ламповый сервер. Будет единая точка входа с базой данных. А там уже цепляйся к нему хоть с писюка хоть с андроида/ios, и крути педали. Удобнее конечно через docker-compose все поднимать.
Для удобства я сделал себе несколько алиасов, теперь мне не нужно каждый раз писать task и название проекта.
alias th="task project:home add "В общем в TW полный минимализм и отличная кастомизация для всех любителей консольных штук. Еще можно настроить цвета, приоритеты, поглядеть отчеты и многое другое. Но мне хватает коробочного варианта. В общем всем советую потыкать.
alias tw="task project:work add "
alias tlh="task project:home ls "
alias tlw="task project:work ls "
Как это выглядит визуально, можешь глянуть тут, подзалил нативно картичночки. А тут крутой sheets по tw.
Ладно, убежал. Если бухгалтерию разгребу, вечерком чего-нибудь забашим или обсудим!
tags: #linux #utilites #рабочиебудни
—
Please open Telegram to view this post
VIEW IN TELEGRAM
👍145
Тут недавно у нас в чатике пролетал способ как скрыть процессы в Linux от других пользователей. Пожалуй этот момент стоит поподробнее просветить и тут. Тема интересная.
К примеру есть многопользовательский сервер. Юзера конектятся к нему по ssh. И я не хочу чтобы какой-нибудь там Василий Волоёбович знал, что у меня запущена порнокачалка.
По идее если запустить pstree, ps, htop и др. То мы увидим процессы не только свои, но также системные и пользовательские.
Чтобы скрыть свои процессы от других пользователей, всего лишь нужно перемонтировать /proc с опцией hidepid.
Работает только с пользователями, рут будет по-прежнему в курсе запущенной порнокачалки.
Параметр hidepid определяет какую информацию о процессах мы ограничим для пользователей, которые не являются владельцами этих процессов.
Параметры которые можно задать:
hidepid=0 - Включена по умолчанию, все видят всё, полный доступ к /proc/PID/.
hidepid=1 - Разрешает обращаться к информации только о своих процессов. Часть файлов в каталоге /proc/PID/ защищена от любопытных морд.
hidepid=2 - Это тот же самый hidepid=1 + всё в /proc/PID будет невидимо для других пользователей. Граница на замке.
Чтобы убедиться, что ты видишь процессы других, запусти от обычного пользователя например htop. В левой колонке будут имена пользователей, root, грут, пруд, фрукт, daemon, syslog и т.п.
Давай теперь закроем этот «бэкдор».
Запускаем от рута:
Естественно после ребута сервера, вся эта красота сгинет. А чтобы этого не произошло, зафигач монтирование /proc в fstab.
Вставляем в /etc/fstab
Значением gid параметра может быть имя группы в системе, членам которой доступ к процессам будет разрешён. И затем маунтить /proc таким образом:
Такие дела. Изучай. На связи!
tags: #linux #utilites
—
💩 @bashdays
К примеру есть многопользовательский сервер. Юзера конектятся к нему по ssh. И я не хочу чтобы какой-нибудь там Василий Волоёбович знал, что у меня запущена порнокачалка.
По идее если запустить pstree, ps, htop и др. То мы увидим процессы не только свои, но также системные и пользовательские.
Чтобы скрыть свои процессы от других пользователей, всего лишь нужно перемонтировать /proc с опцией hidepid.
Работает только с пользователями, рут будет по-прежнему в курсе запущенной порнокачалки.
Параметр hidepid определяет какую информацию о процессах мы ограничим для пользователей, которые не являются владельцами этих процессов.
Параметры которые можно задать:
hidepid=0 - Включена по умолчанию, все видят всё, полный доступ к /proc/PID/.
hidepid=1 - Разрешает обращаться к информации только о своих процессов. Часть файлов в каталоге /proc/PID/ защищена от любопытных морд.
hidepid=2 - Это тот же самый hidepid=1 + всё в /proc/PID будет невидимо для других пользователей. Граница на замке.
Чтобы убедиться, что ты видишь процессы других, запусти от обычного пользователя например htop. В левой колонке будут имена пользователей, root, грут, пруд, фрукт, daemon, syslog и т.п.
Давай теперь закроем этот «бэкдор».
Запускаем от рута:
mount -o remount,rw,nosuid,nodev,noexec,relatime,hidepid=2 /procТеперь снова запускаем от обычного пользователя htop и наблюдаем интересную картину маслом. Портянка из процессов пропала, у меня осталось лишь 2 штуки, bash и htop. Красота!
Естественно после ребута сервера, вся эта красота сгинет. А чтобы этого не произошло, зафигач монтирование /proc в fstab.
Вставляем в /etc/fstab
proc /proc proc defaults,nosuid, nodev, noexec,relatime,hidepid=2 0 0Вот и всё. Но есть одно НО. Встречаются приложения которые могут отвалиться. Для этого нужно захотфиксить маунт с опцией gid=VALUE.
Значением gid параметра может быть имя группы в системе, членам которой доступ к процессам будет разрешён. И затем маунтить /proc таким образом:
proc /proc proc defaults, hidepid=2, gid=bashdays 0 0Добавляем пользователя от имени которого будет работать приложение/демон в эту группу и проверяем — если всё сделано верно, то зафакапленное приложение заработает как обычно.
Такие дела. Изучай. На связи!
tags: #linux #utilites
—
Please open Telegram to view this post
VIEW IN TELEGRAM
👍133
This media is not supported in your browser
VIEW IN TELEGRAM
Мои студенты недавно интересовались, как и чем я делаю запись экрана с терминала. Поделюсь и с вами.
Начнем с того, что я не записываю терминал в реальном времени. Сначала я создаю сценарий, который в автоматическом режиме будет печатать нужные мне команды. А на выходе получается полноценный gif файл.
Софтина называется VHS. Позволяет ЧЕРЕЗ КОД записать gif файл.
VHS написана на модном golang. Для начала устанавливаем. Есть под все операционки, в документации найди свой дистрибутив и накопипасти в терминал.
Я ничего не устанавливал, а пользуюсь docker версией, мне так удобнее, все зависимости упакованы в контейнер. Но если от докера тебя выворачивает, можешь всегда собрать всё это из исходников.
Создаем файл сценария bashdays.tape
После того как сценарий готов, запускаем:
Получившийся gif файл можно не отходя от кассы сразу зашарить на какой-то расшаренный сервер.
Вот такой командой:
🐱 Сраница проекта на github
Всех с пятницей, хороших предстоящий выходных и береги себя!🤩
tags: #linux #utilites
—
💩 @bashdays
Начнем с того, что я не записываю терминал в реальном времени. Сначала я создаю сценарий, который в автоматическом режиме будет печатать нужные мне команды. А на выходе получается полноценный gif файл.
Софтина называется VHS. Позволяет ЧЕРЕЗ КОД записать gif файл.
VHS написана на модном golang. Для начала устанавливаем. Есть под все операционки, в документации найди свой дистрибутив и накопипасти в терминал.
Я ничего не устанавливал, а пользуюсь docker версией, мне так удобнее, все зависимости упакованы в контейнер. Но если от докера тебя выворачивает, можешь всегда собрать всё это из исходников.
Создаем файл сценария bashdays.tape
vim bashdays.tapeИ пишем код:
Output bashdays.gifДумаю тут все интуитивно понятно, откроется оболочка bash, настроятся шрифты, высота, длиннота и сообщение которое будет напечатано. Либо команда, которая будет выполнена. Настроек там дофига, но как обычно 90% никем не используются.
Require echo
Set Shell "bash"
Set FontSize 32
Set Width 1920
Set Height 1080
Type "echo 'Hello this is BashDays'" Sleep 500ms Enter
Type "apt install -y nginx" Sleep 500ms Enter
Sleep 5s
После того как сценарий готов, запускаем:
docker run --rm -v $PWD:/vhs ghcr.io/charmbracelet/vhs bashdays.tapeНаблюдаем за процессом создания и на выходе получаем файл bashdays.gif. В котором будет вывод строки через echo и процесс установки nginx.
Получившийся gif файл можно не отходя от кассы сразу зашарить на какой-то расшаренный сервер.
Вот такой командой:
docker run --rm -v $PWD:/vhs ghcr.io/charmbracelet/vhs publish bashdays.gifПо итогу получишь прямую ссылку вида:
https://vhs.charm.sh/vhs-62gl16v.gif
Ну а дальше уже втыкай свои гифки в корпоративные wiki, или куда там ты их втыкаешь. Короче штука ОФИГИТЕЛЬНАЯ. Всем рекомендую!Всех с пятницей, хороших предстоящий выходных и береги себя!
tags: #linux #utilites
—
Please open Telegram to view this post
VIEW IN TELEGRAM
👍157 3
[[ ]] vs [ ]
Как оказалось не каждый знает чем, отличается использование двойных квадратных скобок в скриптах от одинарных.
В контексте «не каждый», из 10 человек которых я опросил, правильно ответили лишь двое и то с присказкой - мне кажется и наверное.
Я тоже одно время не обращал на это внимание. Просто писал где-то одинарные, где-то двойные, наверное от погоды зависело. Но в какой-то момент меня это начало ковырять. Пришлось разобраться.
В общем как оказалось все просто. Скрипты с двойными скобками будут работать нативно в bash и ksh. А вот во всяких POSIX оболочках таких, как например sh (и в других на основе sh) - выпадет ошибка.
А еще в двойных скобках можно использовать операторы: ||, &&, <, ==, =~. А вот с sh такое провернуть не получится.
При использовании оператора < в двойных скобках, экранирование не нужно.
Примеры:
Короче говоря, если хочешь чтобы твои скрипты работали везде, используй синтаксис с одинарными скобками. Но в свою очередь использование двойных скобок и связанных с ними фич, делают код более читаемым и ясным для понимания.
В общем я забил на переносимость между системами и теперь всегда использую только двойные скобки. Это как с табами и пробелами, главное однажды сделать выбор и потом этого выбора придерживаться.
Всем привет и увидимся!
tags: #linux #bash
—
💩 @bashdays
Как оказалось не каждый знает чем, отличается использование двойных квадратных скобок в скриптах от одинарных.
В контексте «не каждый», из 10 человек которых я опросил, правильно ответили лишь двое и то с присказкой - мне кажется и наверное.
Я тоже одно время не обращал на это внимание. Просто писал где-то одинарные, где-то двойные, наверное от погоды зависело. Но в какой-то момент меня это начало ковырять. Пришлось разобраться.
В общем как оказалось все просто. Скрипты с двойными скобками будут работать нативно в bash и ksh. А вот во всяких POSIX оболочках таких, как например sh (и в других на основе sh) - выпадет ошибка.
А еще в двойных скобках можно использовать операторы: ||, &&, <, ==, =~. А вот с sh такое провернуть не получится.
При использовании оператора < в двойных скобках, экранирование не нужно.
#/bin/shНу и главная киллер-фича двойных скобок это - возможность пользоваться регулярными выражениями.
[ "$s < abc" ]
#/bin/bash
[[ abc < abc ]]
Примеры:
#/bin/bashЕсли заменить первую строчку на #/bin/sh, то после запуска вылетит ошибка [[: not found.
s="abc123"
[[ "$s" == abc* ]] # true (globbing)
[[ "$s" == "abc*" ]] # false (literal matching)
[[ "$s" =~ [abc]+[123]+ ]] # true (regular expression)
[[ "$s" =~ "abc*" ]] # false (literal matching)
Короче говоря, если хочешь чтобы твои скрипты работали везде, используй синтаксис с одинарными скобками. Но в свою очередь использование двойных скобок и связанных с ними фич, делают код более читаемым и ясным для понимания.
В общем я забил на переносимость между системами и теперь всегда использую только двойные скобки. Это как с табами и пробелами, главное однажды сделать выбор и потом этого выбора придерживаться.
Всем привет и увидимся!
tags: #linux #bash
—
Please open Telegram to view this post
VIEW IN TELEGRAM
👍168
Мы часто встречаемся с этим загадочным словом, например в контексте - Posix Shell. Но что такое этот POSIX?
POSIX = Portable Operating System Interface. Хорошо, ок, понятнее не стало. Короче это такой стандарт типа ГОСТа.
Разработали его в бородатые 80е года, а название придумал Ричард Столлман. Тот самый основатель ГНУтого движения.
Задумка POSIX заключается в том, что разработчик должен создать приложение, которое будет работать в любой системе. Естественно система должна соответствовать этому стандарту.
На сегодняшний момент большинство linux дистрибутивов официально не сертифицированы POSIX. Причина одна — это дофига стоит, а у всяких создателей BolgenOS на это банально нет денег. Да и нафига? С другой стороны большинство этих дистрибутивов стараются придерживаться POSIX.
Так что когда кто-то говорит Posix Shell, это значит то, что оно соответствует стандартам. Написав скрипт который корректно запускается и работает в оболочке sh, ты можешь быть уверен, что этот скрипт будет работать — на всех линуксах.
Если подытожить: для рядовых пользователей linux вся эта кухня избыточна. Мы как велосипедили, так и продолжим. Главное чтобы все работало.
По сути, POSIX предназначен для проектировщиков операционных систем и разработчиков программного обеспечения, но как пользователи системы мы подвержены влиянию POSIX, осознаем мы это или нет.
Вот теперь и ты знаешь, что такое этот POSIX. Увидимся!
tags: #linux
—
💩 @bashdays
POSIX = Portable Operating System Interface. Хорошо, ок, понятнее не стало. Короче это такой стандарт типа ГОСТа.
Разработали его в бородатые 80е года, а название придумал Ричард Столлман. Тот самый основатель ГНУтого движения.
Задумка POSIX заключается в том, что разработчик должен создать приложение, которое будет работать в любой системе. Естественно система должна соответствовать этому стандарту.
На сегодняшний момент большинство linux дистрибутивов официально не сертифицированы POSIX. Причина одна — это дофига стоит, а у всяких создателей BolgenOS на это банально нет денег. Да и нафига? С другой стороны большинство этих дистрибутивов стараются придерживаться POSIX.
Так что когда кто-то говорит Posix Shell, это значит то, что оно соответствует стандартам. Написав скрипт который корректно запускается и работает в оболочке sh, ты можешь быть уверен, что этот скрипт будет работать — на всех линуксах.
Если подытожить: для рядовых пользователей linux вся эта кухня избыточна. Мы как велосипедили, так и продолжим. Главное чтобы все работало.
По сути, POSIX предназначен для проектировщиков операционных систем и разработчиков программного обеспечения, но как пользователи системы мы подвержены влиянию POSIX, осознаем мы это или нет.
Вот теперь и ты знаешь, что такое этот POSIX. Увидимся!
tags: #linux
—
Please open Telegram to view this post
VIEW IN TELEGRAM
👍116
Привет еще раз, извиняй что поздно, так нужно. Сегодня моя продуктивность явно зашкаливает, завтра видимо пластом буду лежать как тюлень. Ладно. Давай по теме. Знал ли ты про такую команду в linux как - «yes»? Сейчас про нее и пойдет речь.
Команда yes служит для вывода в стандартный поток (stdout) строки «y» или любой другой строки. Если ее запустить по умолчанию, команда будет бесконечно сыпать строку «y».
А если указать аргумент и запустить так: yes hues(да - пизда) в stdout насыпет строку «hues». Интересно? Ну такое себе... давай дальше возбуждать интерес.
К примеру есть у тебя какая-нибудь консольная команда, которая во время своей работы будет запрашивать подтверждение, типа - а ты точно уверен, что удаляешь тестовую базу данных? Вот на такие случаи и нужна команда «yes», чтобы не руками вводить подтверждение, а делегировать это действие.
Полезно для пайплайнов. Бывает такое, что у программы нет ключей типа apt -y install, а подтверждать как-то в автоматическом режиме нужно.
Синтаксис проброса стандартный, через систему пайпов:
В примере выше, когда пакетный менеджер попросит нажать Y, команда «yes» автоматически это заапрувит и начнется процесс установки. Красота!
Не забываем, про передачу аргументов, если внешняя программа например хочет чтобы ты ввел слово: «ъyъ» делаем так:
Но обычно на практике, в 99% случаев команда «yes» запускается без аргументов, так как большинство запрашивает именно Yes. POSIX стандарты?🫥
Прикол еще. Раз есть команда «yes» значит должна быть и «no». Но увы, обделили! Так вот если нужно отнекиваться, передай в «yes» аргументом строку «no». Прям лайкфак!
Ааа, еще нюанс. Порой что-то может запросить простого нажатия Enter, например когда gpg ключ добавляешь для репозитория. Как послать Enter? А вот так:
Почему это сработает как Enter? Потому, что команда «yes» выводит в stdout не просто сроку Y, но еще и завершает ее в конце символом Enter. Вот именно поэтому при запуске чистого «yes», строчки на экране будут идти столбиком.
Собственно это всё что тебе нужно знать про «yes». Бери на вооружение, мне пару раз пригодилась, именно в gitlab пайплайнах.
Давай, доброй ночи, завтра обязательно увидимся!
tags: #linux #utilites #bash
—
💩 @bashdays
Команда yes служит для вывода в стандартный поток (stdout) строки «y» или любой другой строки. Если ее запустить по умолчанию, команда будет бесконечно сыпать строку «y».
А если указать аргумент и запустить так: yes hues
К примеру есть у тебя какая-нибудь консольная команда, которая во время своей работы будет запрашивать подтверждение, типа - а ты точно уверен, что удаляешь тестовую базу данных? Вот на такие случаи и нужна команда «yes», чтобы не руками вводить подтверждение, а делегировать это действие.
Полезно для пайплайнов. Бывает такое, что у программы нет ключей типа apt -y install, а подтверждать как-то в автоматическом режиме нужно.
Синтаксис проброса стандартный, через систему пайпов:
yes | apt install nginx
В примере выше, когда пакетный менеджер попросит нажать Y, команда «yes» автоматически это заапрувит и начнется процесс установки. Красота!
Не забываем, про передачу аргументов, если внешняя программа например хочет чтобы ты ввел слово: «ъyъ» делаем так:
yes ъуъ | apt install nginx
Но обычно на практике, в 99% случаев команда «yes» запускается без аргументов, так как большинство запрашивает именно Yes. POSIX стандарты?
Прикол еще. Раз есть команда «yes» значит должна быть и «no». Но увы, обделили! Так вот если нужно отнекиваться, передай в «yes» аргументом строку «no». Прям лайкфак!
Ааа, еще нюанс. Порой что-то может запросить простого нажатия Enter, например когда gpg ключ добавляешь для репозитория. Как послать Enter? А вот так:
yes "" | <твоя команда>
Почему это сработает как Enter? Потому, что команда «yes» выводит в stdout не просто сроку Y, но еще и завершает ее в конце символом Enter. Вот именно поэтому при запуске чистого «yes», строчки на экране будут идти столбиком.
Собственно это всё что тебе нужно знать про «yes». Бери на вооружение, мне пару раз пригодилась, именно в gitlab пайплайнах.
Давай, доброй ночи, завтра обязательно увидимся!
tags: #linux #utilites #bash
—
Please open Telegram to view this post
VIEW IN TELEGRAM
👍275
Вчера не по своей воле дебажил веб апликуху на laravel, в 500ку сопливило. Нашел что не существует путь, куда оно хочет записать сессию, кэш и т.п. шляпу. Типа такого app/data/storage/data. Path not found. Плюсом там еще вывалило кучу вложенных папок которых не существует для нормальной работы. Ок, уже есть с чем работать.
В идеальном мире обычно разработчики сами чекают такие директории и автоматически их создают, но это в идеальном мире. На деле все иначе. Время допиливать нет, поэтому скинем эту задачу на девопсов, пусть закостылят какой-нибудь скрипт.
А как создать структуру папок из скрипта? Можно и так:
Вполне читаемо. Но если ты не знаешь, у mkdir есть аргумент, который создаст полностью структуру несуществующих папок. А если оно существует, то лишний раз орать не станет.
Работает это так:
-p, --parents = no error if existing, make parent directories as needed
Заметь что я отдельно не создаю папку meta и view/public, они создаются в момент создания конченных папок bundle и html.
Если посмотреть strace, то видим с какими параметрами запустился mkdir
А можно вынести все пути в отдельный файл, а потом через цикл прогнать. Но я бы не стал по файлам раскидывать, сделал бы какой-нибудь массив путей и передал на съедение mkdir.
Как я и сказал выше, в данном контексте задачи - это костыль. Но если вернуть эту задачу на разработчиков, 100% вернется техдир и скажет - уважаемый, не делай мне нервы, СОЗДАЙ НУЖНЫЕ ПАПКИ САМ!!! Это проблема на сервере, а не в коде. В этом споре победителей не будет.
Если команда хочет костылей, она их получает. Но я все же придерживаюсь поговорки - Нормально делай, нормально будет. Хотя по большей части это справедливо лишь для моих личных проектов, где я всегда найду время и на юнит-тесты и на рефакторинг.
Хорошего вторника и увидимся вечерком.
tags: #linux #bash #рабочиебудни
—
💩 @bashdays
В идеальном мире обычно разработчики сами чекают такие директории и автоматически их создают, но это в идеальном мире. На деле все иначе. Время допиливать нет, поэтому скинем эту задачу на девопсов, пусть закостылят какой-нибудь скрипт.
А как создать структуру папок из скрипта? Можно и так:
mkdir /var/www/app/storage
mkdir /var/www/app/storage/data
mkdir /var/www/app/storage/data/public
mkdir /var/www/app/storage/data/view
mkdir /var/www/app/storage/data/view/public/html
mkdir /var/www/app/storage/data/meta
mkdir /var/www/app/storage/data/meta/bundle
Вполне читаемо. Но если ты не знаешь, у mkdir есть аргумент, который создаст полностью структуру несуществующих папок. А если оно существует, то лишний раз орать не станет.
Работает это так:
mkdir -p /var/www/app/storage/{data/public,data/view,data/public/html,data/meta/bundle}-p, --parents = no error if existing, make parent directories as needed
Заметь что я отдельно не создаю папку meta и view/public, они создаются в момент создания конченных папок bundle и html.
Если посмотреть strace, то видим с какими параметрами запустился mkdir
execve("/usr/bin/mkdir", ["mkdir", "-p", "/var/www/app/storage/data/public", "/var/www/app/storage/data/view", "/var/www/app/storage/public/html", "/var/www/app/storage/data/meta/b"...А можно вынести все пути в отдельный файл, а потом через цикл прогнать. Но я бы не стал по файлам раскидывать, сделал бы какой-нибудь массив путей и передал на съедение mkdir.
Как я и сказал выше, в данном контексте задачи - это костыль. Но если вернуть эту задачу на разработчиков, 100% вернется техдир и скажет - уважаемый, не делай мне нервы, СОЗДАЙ НУЖНЫЕ ПАПКИ САМ!!! Это проблема на сервере, а не в коде. В этом споре победителей не будет.
Если команда хочет костылей, она их получает. Но я все же придерживаюсь поговорки - Нормально делай, нормально будет. Хотя по большей части это справедливо лишь для моих личных проектов, где я всегда найду время и на юнит-тесты и на рефакторинг.
Хорошего вторника и увидимся вечерком.
tags: #linux #bash #рабочиебудни
—
Please open Telegram to view this post
VIEW IN TELEGRAM
👍139
Многие тут уже в курсе, что я перелез с хакинтоша на винду + wsl. Ну дак вот. В макоси я привык работать в iTerm который работал по принципу - нажал F1 у меня сверху вниз вылез терминал. Нажал еще раз и он залез обратно. Прекрасный режим и называется он quake mode. В линуксах он тоже есть, пользовался им постоянно.
Пересев на винду я сказал в слух - пу, пу, пу.... И как жить дальше с этим Windows Terminal (Preview)? Как мне вернуться в зону комфорта и quake mode? Оказалось достаточно просто.
Добавляем в settings.json (от Windows Terminal) такую фигню:
Сохраняем. И теперь по нажатию F1 у меня выезжает терминал, поверх всех окон, с любого рабочего пространства. А кнопку F1 можешь заменить на любое удобное тебе сочетание.
Так, но радость была не долгая. Терминал то выезжает, но нет TABов и чо мне делать с однимгавном окном? Мне то надо 10 серверов открыть и бегать по вкладкам.
Тут решение тоже неочевидное. Создаешь вкладку сочетанием CTRL+SHIFT+T. Открывается новый терминал, НО предыдущий куда-то исчезает! Да ёбтвоюмать! Короче утро вечера мудренее и с утра я эту тему победил.
Для переключения вкладок нужно нажать CTRL+TAB, выпадет список всех открытых вкладок, между которыми можно переключаться. Уже хорошо, НО!!!! Как без этих контролтабов визуально видеть какие вкладки у меня открыты? Утро вечера мудренее...
Пофиксил и это! Нажимаем в терминале CTRL+SHIFT+P, открывается хрен пойми какая-то менюшка. Набираем Toggle focus mode и активируем. Опа! Вкладочки появились! Теперь можно мышкой по ним кликать. Уверен что можно в settings.json этот focus включить по умолчанию.
Ура! Зона комфорта возвращена! Еще был дискомфорт, что терминал выезжает лишь до середины экрана, но я сильно не стал заморачиваться и растянул его мышкой. Но всяко есть способ через конфиг сделать чтобы он на весь экран открывался. Если знаешь, маякни в комментах.
Вообще quake mode охренительно разгоняет продуктивность, а эффективность повышается. Терминал на расстоянии вытянутого пальца. Всем рекомендую подсесть на это иглу, потом слезть с нее просто так не получится. Ну удобно чо. А почему я променял макось на винду, расскажу в следующих постах.
Пока пока и хорошего вечера!
tags: #рабочиебудни
—
💩 @bashdays
Пересев на винду я сказал в слух - пу, пу, пу.... И как жить дальше с этим Windows Terminal (Preview)? Как мне вернуться в зону комфорта и quake mode? Оказалось достаточно просто.
Добавляем в settings.json (от Windows Terminal) такую фигню:
"command":
{
"action": "globalSummon",
"desktop": "toCurrent",
"dropdownDuration": 5,
"monitor": "any",
"name": "_quake",
"toggleVisibility": true
},
"keys": "f1"
},
Сохраняем. И теперь по нажатию F1 у меня выезжает терминал, поверх всех окон, с любого рабочего пространства. А кнопку F1 можешь заменить на любое удобное тебе сочетание.
Так, но радость была не долгая. Терминал то выезжает, но нет TABов и чо мне делать с одним
Тут решение тоже неочевидное. Создаешь вкладку сочетанием CTRL+SHIFT+T. Открывается новый терминал, НО предыдущий куда-то исчезает! Да ёбтвоюмать! Короче утро вечера мудренее и с утра я эту тему победил.
Для переключения вкладок нужно нажать CTRL+TAB, выпадет список всех открытых вкладок, между которыми можно переключаться. Уже хорошо, НО!!!! Как без этих контролтабов визуально видеть какие вкладки у меня открыты? Утро вечера мудренее...
Пофиксил и это! Нажимаем в терминале CTRL+SHIFT+P, открывается хрен пойми какая-то менюшка. Набираем Toggle focus mode и активируем. Опа! Вкладочки появились! Теперь можно мышкой по ним кликать. Уверен что можно в settings.json этот focus включить по умолчанию.
Ура! Зона комфорта возвращена! Еще был дискомфорт, что терминал выезжает лишь до середины экрана, но я сильно не стал заморачиваться и растянул его мышкой. Но всяко есть способ через конфиг сделать чтобы он на весь экран открывался. Если знаешь, маякни в комментах.
Вообще quake mode охренительно разгоняет продуктивность, а эффективность повышается. Терминал на расстоянии вытянутого пальца. Всем рекомендую подсесть на это иглу, потом слезть с нее просто так не получится. Ну удобно чо. А почему я променял макось на винду, расскажу в следующих постах.
Пока пока и хорошего вечера!
tags: #рабочиебудни
—
Please open Telegram to view this post
VIEW IN TELEGRAM
👍139 2
Сегодня необычный скрипт, который позволит тебе сгенерировать пароль состоящий из пробелов и прочих невидимых символов. Что-то из оперы Шрёдингера — ты никогда не узнаешь гениально это или ужасно, пока сам не попробуешь.
От этой штуки тестировщики разбегаются в ужасе. А веб-сайты на которых ты попытаешься использовать такой пароль, просто-напросто порвутся и выпустят 500ю соплю.
Забрать и потыкать этот прекрасный скрипт можешь из нашей репы.
Не знаю где это можно применить, но идея с паролем которого не видно, очень интересная. Я попробовал сохранить то, что получилось в bitwarden, отлично сохранился. Да, пароль получается с симметричной защитой 128 бит.
tags: #linux #bash #utils
—
💩 @bashdays
От этой штуки тестировщики разбегаются в ужасе. А веб-сайты на которых ты попытаешься использовать такой пароль, просто-напросто порвутся и выпустят 500ю соплю.
Забрать и потыкать этот прекрасный скрипт можешь из нашей репы.
Не знаю где это можно применить, но идея с паролем которого не видно, очень интересная. Я попробовал сохранить то, что получилось в bitwarden, отлично сохранился. Да, пароль получается с симметричной защитой 128 бит.
tags: #linux #bash #utils
—
Please open Telegram to view this post
VIEW IN TELEGRAM
👍81
Привет. Наткнулся вчера на CheatSheet по Расширенным параметрам в Bash. Довольно неплохой и понятный. PDF версию можешь забрать отсюда.
Что такое расширенные параметры? Ну если коротко: допустим есть у меня переменная ${var%}, что такое знак %?
${var%} удалит короткий суффикс
$(var%%} удалит длинный суффикс
${var#} & ${var##} удалит короткий и длинный префикс
На экран выведется слово hello. То есть произошло удаление короткого суффикса. Вариантов масса. Вот еще пример:
Кстати у этого товарища здесь полно всяких полезностей и документашек на все случаи жизни. Видимо отсеивает всякий шлак и собирает для себя только мастхев штуки. Поглядите на досуге, может что-то к себе переместите.
Всех с пятницей, вечером еще увидимся!
tags: #linux #bash #sheets
—
💩 @bashdays
Что такое расширенные параметры? Ну если коротко: допустим есть у меня переменная ${var%}, что такое знак %?
${var%} удалит короткий суффикс
$(var%%} удалит длинный суффикс
${var#} & ${var##} удалит короткий и длинный префикс
var='hello world'
echo ${var%world}
На экран выведется слово hello. То есть произошло удаление короткого суффикса. Вариантов масса. Вот еще пример:
var='hello world'
echo ${var%o*} # hello w
echo ${var%%o*} # hell
Более подробно про расширенные параметры можно почитать на официально ГНУТой странице, с переводчиком норм заходит.
Кстати у этого товарища здесь полно всяких полезностей и документашек на все случаи жизни. Видимо отсеивает всякий шлак и собирает для себя только мастхев штуки. Поглядите на досуге, может что-то к себе переместите.
Всех с пятницей, вечером еще увидимся!
tags: #linux #bash #sheets
—
Please open Telegram to view this post
VIEW IN TELEGRAM
👍104 3
Вот и снова я. Перед выходными давай поговорим про магические числа в процессе перезагрузки Linux.
Тему эту обычно все стороной обходят, да и большинство преподов тебе никогда не расскажут что такое Magic Numbers.
Они про эти числа либо никогда не слышали, либо слышали, но не соизволили с ней ознакомиться. Поехали копаться в кишочках, как мы и любим.
Когда ты запускаешь reboot в linux, происходит масса всего интересного. Но самый главный интерес в «магических числах».
Короче «магические числа» это такая херабора из последовательности байтов, расположенных в фиксированном файле либо структуре данных. Нужны они для идентификации типа файла либо структуры. Для каждого типа файла магические числа уникальны.
Например, для ELF файлов, магические числа будут такими:
Если система видит последовательность этих байтов, она по умолчанию делает вывод, что этот файл является ELF по первым 4м байтам. 45=E, 4c=L, 46=F, перед ними стоит значение 7f.
Посмотреть эту сигнатуру можно командой readelf:
Окей, с этим разобрались. Ну дак каким боком эти магические числа вообще связаны с командой reboot? А самым прямым!
С помощью этих чисел система определяет повреждения файловой системы. На случай если ты после ребута не сможешь загрузить сервак или свою пекарню. То есть, предостерегает и умоляет пофиксить проблему, а потом уже перезагружаться.
Во время процесса перезагрузки или завершения работы, система должна убедиться, что все данные записаны на диск и файловая система находится в согласованном состоянии.
Работает это проверка путем согласованности суперблока файловой системы.
Суперблок это структура данных, которая содержит информацию о файловой системе (размер, расположение блоков данных и журнала файловой системы).
Проверяя магическое число в суперблоке, система определяет, соответствует ли файловая система ожидаемому формату. Если магическое число похерено, значит жопа и пиши пропало, коруптед, нидхелп.
Отсюда и растут ноги, когда система предлагает запустить тебе fsck.
Вот и при reboot система все это проверяет. Кусок исходника kernel/reboot.c:
Как видим magic1 и imagic2 присваиваются магические числа. А сами эти магические числа зашиты в файле reboot.h. При НЕ выполнении данных условий будет возвращена ошибка.
Первая строчка 0xfee1dead звучит забавно - чувствую себя дохлым или мне пезда ! Именно эта константа и отвечает за перезагрузку системы.
Остальные числа:
672274793 зашифрован ДР Линуса Торвальдса
85072278 ДР дочки Линус Патрисия Миранда
369367448 ДР дочки Линус Даниел Юланда
537993216 ДР дочки Линус Целеста Аманда
Нормальная пасхалочка! Чтобы расшифровать эти числа и получить человечные даты ДР можно воспользоваться командой:
Вот такие пироги под капотом этого нашего Linux.
Кстати команда file извлекает данные о файле как раз из магических чисел и заголовков.
Ладно, всем хороших предстоящих выходных и берегите себя! Кстати про суперблоки отдельно попозже разбор сделаю.
tags: #linux
—
💩 @bashdays
Тему эту обычно все стороной обходят, да и большинство преподов тебе никогда не расскажут что такое Magic Numbers.
Они про эти числа либо никогда не слышали, либо слышали, но не соизволили с ней ознакомиться. Поехали копаться в кишочках, как мы и любим.
Когда ты запускаешь reboot в linux, происходит масса всего интересного. Но самый главный интерес в «магических числах».
Короче «магические числа» это такая херабора из последовательности байтов, расположенных в фиксированном файле либо структуре данных. Нужны они для идентификации типа файла либо структуры. Для каждого типа файла магические числа уникальны.
Например, для ELF файлов, магические числа будут такими:
ELF Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Если система видит последовательность этих байтов, она по умолчанию делает вывод, что этот файл является ELF по первым 4м байтам. 45=E, 4c=L, 46=F, перед ними стоит значение 7f.
Посмотреть эту сигнатуру можно командой readelf:
readelf -h /bin/at
Окей, с этим разобрались. Ну дак каким боком эти магические числа вообще связаны с командой reboot? А самым прямым!
С помощью этих чисел система определяет повреждения файловой системы. На случай если ты после ребута не сможешь загрузить сервак или свою пекарню. То есть, предостерегает и умоляет пофиксить проблему, а потом уже перезагружаться.
Во время процесса перезагрузки или завершения работы, система должна убедиться, что все данные записаны на диск и файловая система находится в согласованном состоянии.
Работает это проверка путем согласованности суперблока файловой системы.
Суперблок это структура данных, которая содержит информацию о файловой системе (размер, расположение блоков данных и журнала файловой системы).
Проверяя магическое число в суперблоке, система определяет, соответствует ли файловая система ожидаемому формату. Если магическое число похерено, значит жопа и пиши пропало, коруптед, нидхелп.
Отсюда и растут ноги, когда система предлагает запустить тебе fsck.
Вот и при reboot система все это проверяет. Кусок исходника kernel/reboot.c:
/* We only trust the superuser with rebooting the system. */
if (!capable(CAP_SYS_BOOT))
return -EPERM;
/* For safety, we require "magic" arguments. */
if (magic1 != LINUX_REBOOT_MAGIC1 ||
(magic2 != LINUX_REBOOT_MAGIC2 &&
magic2 != LINUX_REBOOT_MAGIC2A &&
magic2 != LINUX_REBOOT_MAGIC2B &&
magic2 != LINUX_REBOOT_MAGIC2C))
return -EINVAL;
Как видим magic1 и imagic2 присваиваются магические числа. А сами эти магические числа зашиты в файле reboot.h. При НЕ выполнении данных условий будет возвращена ошибка.
/* * Magic values required to use _reboot() system call. */
#define LINUX_REBOOT_MAGIC1 0xfee1dead
#define LINUX_REBOOT_MAGIC2 672274793
#define LINUX_REBOOT_MAGIC2A 85072278
#define LINUX_REBOOT_MAGIC2B 369367448
#define LINUX_REBOOT_MAGIC2C 537993216
Первая строчка 0xfee1dead звучит забавно - чувствую себя дохлым или
Остальные числа:
672274793 зашифрован ДР Линуса Торвальдса
85072278 ДР дочки Линус Патрисия Миранда
369367448 ДР дочки Линус Даниел Юланда
537993216 ДР дочки Линус Целеста Аманда
Нормальная пасхалочка! Чтобы расшифровать эти числа и получить человечные даты ДР можно воспользоваться командой:
printf -v d '%x' 672274793 ; echo "Linus ${d:0:2}-${d:2:2}-${d:4}"Вот такие пироги под капотом этого нашего Linux.
Кстати команда file извлекает данные о файле как раз из магических чисел и заголовков.
Ладно, всем хороших предстоящих выходных и берегите себя! Кстати про суперблоки отдельно попозже разбор сделаю.
tags: #linux
—
Please open Telegram to view this post
VIEW IN TELEGRAM
👍146 3
Привет, выходные пролетают со скоростью света и так по кругу. Порой задумываешься — а что дальше? А дальше поговорим про особенность ядра linux как zram.
ZRAM эта такая штуковина, которая позволяет сжимать оперативную память на лету и таким образом увеличить ее объём. Нет, это реально работает. А то бывают такие приколы - скачай 1гиг памяти бесплатно. Встречал в гуголплее такую хреновину для андроидов.
При включении zram, сжатие переносит часть нагрузки на процессор, но использование zram действительно может улучшить производительность. Особенно на серваках/пекарнях с малым объемом оперативки.
Также есть zswap, которая сжимает данные в разделе подкачки. И которая по умолчанию включена почти во всех официальных ядрах.
Проблема zswap заключается в том, что его приоритет выше чем у zram, который остается неиспользуемым. Чтобы решить эту проблему, нужно задизейблить zswap в ядре.
Но чтобы применить эту опцию, нужно пересобрать ядро. А оно нам нафиг не всралось. Поэтому пойдем легким путем и задизейблим zswap через загрузчик grub.
Редактируем файл /etc/default/grub
Не забываем перегенирировать конфиг grub:
Перезагружаем машину и проверяем отключение zswap:
Если вывелась буква N значит ты все сделал правильно.
Кстати можешь изначально проверить, возможно zswap у тебя по умолчанию выключен. У меня в Selectel сразу выводит букву N, возможно по причине, что у меня вообще swap отсутствует.
Ну и наконец включаем zram. Для этого пишем bash скрипт и кидаем его в автозагрузку:
1. Загружаем модуль zram
2. Выбираем алгоритм сжатия lz4 (либо zstd)
3. Объем zram, у меня 1гиг физической оперативки
4. 2 это количество потоков сжатия (потоки процессора)
5. Создаем блочное устройство и включаем его
Запускаем скрипт и проверяем включение командой: zramctl. Если на экран что-то вывелось, значит всё ок и сжатие начало работать.
Если заморачиваться с bash скриптами не хочется, ставим утилиту которая будет работать через systemd.
Правим конфиг /etc/systemd/zram-generator.conf
Активируем и запускаем:
Всё! Теперь оно само будет запускаться без лишних движений.
Ну и не забываем про минус использования zram. При включении ты теряешь возможность использовать нативный swap раздел. По крайней мере так написано в мануале. Но это не точно.
Надо будет ради интереса бенчмарки снять. Хотя тут наверное проще гуглануть, всяко кто-то уже снимал.
Ладно пойду дальше кубернейтсы шатать. Увидимся!
tags: #linux
—
💩 @bashdays
ZRAM эта такая штуковина, которая позволяет сжимать оперативную память на лету и таким образом увеличить ее объём. Нет, это реально работает. А то бывают такие приколы - скачай 1гиг памяти бесплатно. Встречал в гуголплее такую хреновину для андроидов.
При включении zram, сжатие переносит часть нагрузки на процессор, но использование zram действительно может улучшить производительность. Особенно на серваках/пекарнях с малым объемом оперативки.
Также есть zswap, которая сжимает данные в разделе подкачки. И которая по умолчанию включена почти во всех официальных ядрах.
Проблема zswap заключается в том, что его приоритет выше чем у zram, который остается неиспользуемым. Чтобы решить эту проблему, нужно задизейблить zswap в ядре.
CONFIG_ZSWAP_DEFAULT_ON=N
Но чтобы применить эту опцию, нужно пересобрать ядро. А оно нам нафиг не всралось. Поэтому пойдем легким путем и задизейблим zswap через загрузчик grub.
Редактируем файл /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="zswap.enabled=0" loglevel=3 quiet "
Не забываем перегенирировать конфиг grub:
grub-mkconfig -o /boot/grub/grub.cfg
Перезагружаем машину и проверяем отключение zswap:
cat /sys/module/zswap/parameters/enabled
Если вывелась буква N значит ты все сделал правильно.
Кстати можешь изначально проверить, возможно zswap у тебя по умолчанию выключен. У меня в Selectel сразу выводит букву N, возможно по причине, что у меня вообще swap отсутствует.
Ну и наконец включаем zram. Для этого пишем bash скрипт и кидаем его в автозагрузку:
#!/bin/bash
modprobe zram
mkdir /sys/block/zram0
echo lz4 > /sys/block/zram0/comp_algorithm
echo 1G > /sys/block/zram0/disksize
echo 2 > /sys/block/zram0/max_comp_streams
mkswap --label zram0 /dev/zram0
swapon --priority 100 /dev/zram0
1. Загружаем модуль zram
2. Выбираем алгоритм сжатия lz4 (либо zstd)
3. Объем zram, у меня 1гиг физической оперативки
4. 2 это количество потоков сжатия (потоки процессора)
5. Создаем блочное устройство и включаем его
Запускаем скрипт и проверяем включение командой: zramctl. Если на экран что-то вывелось, значит всё ок и сжатие начало работать.
Если заморачиваться с bash скриптами не хочется, ставим утилиту которая будет работать через systemd.
apt install systemd-zram-generator
Правим конфиг /etc/systemd/zram-generator.conf
[zram0]
zram-size = ram
compression-algorithm = lz4
Активируем и запускаем:
systemctl daemon-reload
systemctl start /dev/zram0
Всё! Теперь оно само будет запускаться без лишних движений.
Ну и не забываем про минус использования zram. При включении ты теряешь возможность использовать нативный swap раздел. По крайней мере так написано в мануале. Но это не точно.
Надо будет ради интереса бенчмарки снять. Хотя тут наверное проще гуглануть, всяко кто-то уже снимал.
Ладно пойду дальше кубернейтсы шатать. Увидимся!
tags: #linux
—
Please open Telegram to view this post
VIEW IN TELEGRAM
👍100
ну раз пошла такая пьянка, минутка юмора, ребята тут глобальные проблемы решают... и не поспоришь...
tags: #linux #рабочиебудни
—
💩 @bashdays
tags: #linux #рабочиебудни
—
Please open Telegram to view this post
VIEW IN TELEGRAM
👍179 2
This media is not supported in your browser
VIEW IN TELEGRAM
Хеллоу май диа френдз! Я тот еще любитель интерактивных штук, особенно консольных, где чето можно стрелочками побегать, понажимать, с минимумом геморроя. Короче фетиш у меня на всякие потыкать.
Приобщился тут к утилите hstr, которая выводит историю команд в формате списка. А в этом списке уже стрелками можно перемещаться по истории. Но это не главное. Лично я использую ее исключительно в режиме фильтрации.
HSTR (HiSToRy) - это утилита командной строки, которая обеспечивает улучшенное bash/zsh выполнение команд из истории. Она направлена на то, чтобы сделать твою работу проще и эффективнее, чем Ctrl-r.
Запускаю hstr, на экран вываливается вся история, я ввожу к примеру prometheus и получаю выборку из истории, конкретно где я задрачивал prometheus. Выбираю курсором нужную мне команду и вуаля! Никаких тебе грепов и лишних телодвижений.
Рекомендую попробовать, весьма топовая штука, боюсь приживется надолго.
🐱 Страница проекта на гитхаб
💩 Лендинг по установке
tags: #linux #utils
—
💩 @bashdays
Приобщился тут к утилите hstr, которая выводит историю команд в формате списка. А в этом списке уже стрелками можно перемещаться по истории. Но это не главное. Лично я использую ее исключительно в режиме фильтрации.
HSTR (HiSToRy) - это утилита командной строки, которая обеспечивает улучшенное bash/zsh выполнение команд из истории. Она направлена на то, чтобы сделать твою работу проще и эффективнее, чем Ctrl-r.
Запускаю hstr, на экран вываливается вся история, я ввожу к примеру prometheus и получаю выборку из истории, конкретно где я задрачивал prometheus. Выбираю курсором нужную мне команду и вуаля! Никаких тебе грепов и лишних телодвижений.
Рекомендую попробовать, весьма топовая штука, боюсь приживется надолго.
tags: #linux #utils
—
Please open Telegram to view this post
VIEW IN TELEGRAM
👍94
Привет. Как оказалось, не все знают что nginx позволяет нативно писать логи в json формате. Вообще в продакшене это бест-практика. Для этого в конфиг nginx.conf нужно добавить такой блок:
Получаем максимальную информацию о клиенте в json формате, которую пробиваем средствами nginx. И теперь все это можно легко скармливать всяким эластикам и т.п. без парсинга и гроков. Так сказать — избавляемся от костылей.
Но хранить логи в файлах, такое себе. Поэтому мастхэв запихать логи непременно в system journal.
Забиваем пару строк в nginx.conf и всё логирование будет перенаправлено в system journal.
А можно комбинировать, писать одновременно логи в файл в дефолтном шаблоне nginx’а и параллельно писать в system journal в json. Я иногда такое проворачиваю для дебага, где в логах требуется вывести лишь время, айпишник и ури-ури. Типа такого:
Но конечно если есть Kibana, дела с отладкой в разы становятся лучше. Ну а чтобы посмотреть логи в system journal, воспользуйся такой командой: journalctl -f
Сегодня если руки дойдут, обсудим судо-мудо или другие линукс кишочки. Давай, хорошей тебе пятницы, увидимся!
tags: #nginx
—
💩 @bashdays
log_format nginx_json escape=json '{"time_local":"$time_local", "cloud_ip":"$http_x_real_ip", "ip":"$http_cf_connecting_ip", "connection":"$connection", "request_completion":"$request_completion", "status":"$status", "rtime":"$request_time", "rlenght":"$request_length", "content_type":"$content_type", "content_length":"$content_length", "bytes_sent":"$bytes_sent", "body_bytes_sent":"$body_bytes_sent", "raddr":"$remote_addr", "ruser":"$remote_user","upstream_addr":"$upstream_addr", "upstr_resp_time":"$upstream_response_time", "upstr_cache_status":"$upstream_cache_status", "upst_status":"$upstream_status", "gzip_ratio":"$gzip_ratio", "http_x_forwarded_for":"$http_x_forwarded_for", "proxy":"$proxy_host:$proxy_port", "proxy_int_body_length":"$proxy_internal_body_length", "server_proto":"$server_protocol", "rmethod":"$request_method", "uri":"$uri", "args":"$args", "http_referer":"$http_referer", "uag":"$http_user_agent"}';
access_log /var/log/nginx/access.log nginx_json;
error_log /var/log/nginx/error.log;Получаем максимальную информацию о клиенте в json формате, которую пробиваем средствами nginx. И теперь все это можно легко скармливать всяким эластикам и т.п. без парсинга и гроков. Так сказать — избавляемся от костылей.
Но хранить логи в файлах, такое себе. Поэтому мастхэв запихать логи непременно в system journal.
Забиваем пару строк в nginx.conf и всё логирование будет перенаправлено в system journal.
error_log syslog:server=unix:/dev/log;
access_log syslog:server=unix:/dev/log nginx_json;
А можно комбинировать, писать одновременно логи в файл в дефолтном шаблоне nginx’а и параллельно писать в system journal в json. Я иногда такое проворачиваю для дебага, где в логах требуется вывести лишь время, айпишник и ури-ури. Типа такого:
log_format nginx_json ...
log_format nginx_default ...
access_log /var/log/nginx/access_json.log nginx_json;
access_log /var/log/nginx/access_default.log nginx_default;
Но конечно если есть Kibana, дела с отладкой в разы становятся лучше. Ну а чтобы посмотреть логи в system journal, воспользуйся такой командой: journalctl -f
Сегодня если руки дойдут, обсудим судо-мудо или другие линукс кишочки. Давай, хорошей тебе пятницы, увидимся!
tags: #nginx
—
Please open Telegram to view this post
VIEW IN TELEGRAM
👍154
Тебе частенько приходится пользоваться всякими su, sudo и т.п. Ввод этих команд зашит на подкорке в башке. Забил команду, получил результат. Но опять же особо никто не задумывается чем, отличается su от sudo + там же еще всякие непонятные ключи и дефисы. Поехали разбираться.
su = «substitute user» — заменить пользователя
sudo = «substitute user and do» - подменить пользователя и выполнить
Уже видно разницу. Различия такие: su требует пароль целевой учетной записи, на кого переключаемся. А sudo требует пароль текущего пользователя и запускает от его имени команды, которым требуются права супербога.
Например, мы сидим под пользователем user и хотим стать Иваном, делаем так:
Будет запрошен пароль, нужно ввести пароль именно от учетной записи ivan, а не от user.
А вот пример с sudo:
А здесь нужно ввести пароль от учетной записи user, а не от Ивана или рута. Но для этого случая сперва необходимо добавить пермишены для пользователя user в файл /etc/sudoers.
Редактировать этот файл можно по средствам команды visudo. А свалидировать конфиг можно командой visudo -c. Редактирование этого файла через visodu хорошо тем, что если ты накосячишь, то при сохранении, оно скажет — лось ты дырявый, тут ошибочка!
Вообще предпочтительнее использовать sudo, но если ты не криворукий можно и под su нормально работать. Ты сейчас меня конечно же осудишь, но я предпочитаю работать исключительно под root, за 20 лет пока не факапил. Ну не люблю я всякие эти судо-мудо-рыба-конь и ущемление своих серверных прав.
Окей. А для чего нужен этот странный дефис после su?
А чтобы очищать переменные и пользоваться чистой оболочкой при переключении на другого пользователя. Ща покажу на котиках.
Авторизуемся под пользователем user и экспортируем переменную:
Теперь у пользователя user есть переменная «a» которая = test.
Переключаемся на пользователя ivan и смотрим переменную «a»
Опа! Вывелась строчка test. То есть получается все что ты задал под user, перекочевало в оболочку ivan. Нормально! А теперь давай добавим дефис:
И пустота! Переменная $a больше не выводится. Чистая оболочка! Кстати с этим дефисом часто косячат и потом долго не могут понять в чем причина. Переменные вроде были заданы, а потом куда-то пропали. Все потому, что азов не знаем и бездумно суём этот дефис где нужно и не нужно.
Теперь ты знаешь азы и будешь с умом к этим судо-мудо подходить. По крайней мере у тебя добавится дополнительный кейс для дебага.
su (с дефисом) = сначала переключается пользователь, а затем запускается shell, зачищаются все переменные.
su (без дефиса) = переключает пользователя, оставляя переменные окружения старого пользователя.
У sudo есть подобные ключи -s -i
Запустится оболочка с правами root
Запустится оболочка, но уже с чтением файлов root/.profile/.bashrc и т.п. Можешь попробовать добавить экспорт переменной в .profile, сделать sudo -s/-i и увидишь что с ключом -i переменная выведется на экран.
По сути sudo -i = команде sudo su -. Но обычно за sudo su - в приличных местах выгоняют ссаными тряпками. Это плохая практика! Так как это порождает дополнительный процесс и больше гемора с набором самой команды.
Фуф… пардон за простыню, но мне нужно было тебе это рассказать. Изучай и ставь лайк. Хороших выходных. Увидимся!
upd: если я что-то упустил, докидывайте в комментарии, всем будет полезно.
tags: #linux
—
💩 @bashdays
su = «substitute user» — заменить пользователя
sudo = «substitute user and do» - подменить пользователя и выполнить
Уже видно разницу. Различия такие: su требует пароль целевой учетной записи, на кого переключаемся. А sudo требует пароль текущего пользователя и запускает от его имени команды, которым требуются права супербога.
Например, мы сидим под пользователем user и хотим стать Иваном, делаем так:
user@dev:/$ su ivan
Будет запрошен пароль, нужно ввести пароль именно от учетной записи ivan, а не от user.
А вот пример с sudo:
user@dev:/$ sudo -u ivan whoami
А здесь нужно ввести пароль от учетной записи user, а не от Ивана или рута. Но для этого случая сперва необходимо добавить пермишены для пользователя user в файл /etc/sudoers.
user ALL=(ALL:ALL) ALL
Редактировать этот файл можно по средствам команды visudo. А свалидировать конфиг можно командой visudo -c. Редактирование этого файла через visodu хорошо тем, что если ты накосячишь, то при сохранении, оно скажет — лось ты дырявый, тут ошибочка!
Вообще предпочтительнее использовать sudo, но если ты не криворукий можно и под su нормально работать. Ты сейчас меня конечно же осудишь, но я предпочитаю работать исключительно под root, за 20 лет пока не факапил. Ну не люблю я всякие эти судо-мудо-рыба-конь и ущемление своих серверных прав.
Окей. А для чего нужен этот странный дефис после su?
А чтобы очищать переменные и пользоваться чистой оболочкой при переключении на другого пользователя. Ща покажу на котиках.
Авторизуемся под пользователем user и экспортируем переменную:
ssh user@dev
export a="test"
Теперь у пользователя user есть переменная «a» которая = test.
Переключаемся на пользователя ivan и смотрим переменную «a»
su ivan
echo $a
Опа! Вывелась строчка test. То есть получается все что ты задал под user, перекочевало в оболочку ivan. Нормально! А теперь давай добавим дефис:
su - ivan
echo $a
И пустота! Переменная $a больше не выводится. Чистая оболочка! Кстати с этим дефисом часто косячат и потом долго не могут понять в чем причина. Переменные вроде были заданы, а потом куда-то пропали. Все потому, что азов не знаем и бездумно суём этот дефис где нужно и не нужно.
Теперь ты знаешь азы и будешь с умом к этим судо-мудо подходить. По крайней мере у тебя добавится дополнительный кейс для дебага.
su (с дефисом) = сначала переключается пользователь, а затем запускается shell, зачищаются все переменные.
su (без дефиса) = переключает пользователя, оставляя переменные окружения старого пользователя.
У sudo есть подобные ключи -s -i
user@dev:/$ sudo -s
Запустится оболочка с правами root
user@dev:/$ sudo -i
Запустится оболочка, но уже с чтением файлов root/.profile/.bashrc и т.п. Можешь попробовать добавить экспорт переменной в .profile, сделать sudo -s/-i и увидишь что с ключом -i переменная выведется на экран.
По сути sudo -i = команде sudo su -. Но обычно за sudo su - в приличных местах выгоняют ссаными тряпками. Это плохая практика! Так как это порождает дополнительный процесс и больше гемора с набором самой команды.
Фуф… пардон за простыню, но мне нужно было тебе это рассказать. Изучай и ставь лайк. Хороших выходных. Увидимся!
upd: если я что-то упустил, докидывайте в комментарии, всем будет полезно.
tags: #linux
—
Please open Telegram to view this post
VIEW IN TELEGRAM
👍364 12 2
Доброе утро. Возможно кто-то в прошлом месяце пропустил интересное чтиво, подборка ТОП постов:
- Какой Linux подходит для просмотра XXX контента (14270)
- Альтернатива _try/catch_ в bash (10777)
- Запускаем скрипт в фоне без nohup и screen (10003)
- Чем отличаются файлы .bashrc .bash_profile .profile (8255)
- Таймер на со-процессах (8151)
- Топовая софтина на сценариях для записи терминала (7782)
- Windows + WSL + quake mode terminal (7381)
- Генерируем пароли из пробелов (7327)
- Отличия [[ ]] от [ ] (7285)
- Taskwarrior или ТуДу-ВуДу лист для хакеров (7125)
- CheatSheet по Расширенным параметрам в Bash (5793)
Да, вечером закину вкусное на почитать, пока в работе. Хорошего дня. На связи!
tags: #итогимесяца 11/23
—
💩 @bashdays
- Какой Linux подходит для просмотра XXX контента (14270)
- Альтернатива _try/catch_ в bash (10777)
- Запускаем скрипт в фоне без nohup и screen (10003)
- Чем отличаются файлы .bashrc .bash_profile .profile (8255)
- Таймер на со-процессах (8151)
- Топовая софтина на сценариях для записи терминала (7782)
- Windows + WSL + quake mode terminal (7381)
- Генерируем пароли из пробелов (7327)
- Отличия [[ ]] от [ ] (7285)
- Taskwarrior или ТуДу-ВуДу лист для хакеров (7125)
- CheatSheet по Расширенным параметрам в Bash (5793)
Да, вечером закину вкусное на почитать, пока в работе. Хорошего дня. На связи!
tags: #итогимесяца 11/23
—
Please open Telegram to view this post
VIEW IN TELEGRAM
👍73
Фух, закончились 2 часа партнерских интеграций... Недавно я делал пост по отличиям su от sudo, но есть еще одна вкусная альтернатива, которая называется doas.
doas – утилита, которая позволяет обычным пользователям выполнять задачи от имени root, так же как это делает sudo. Она была разработана проектом OpenBSD как минималистичная альтернатива sudo.
Интересно кстати звучит: do ass (делать жопу)
Утилита доступна в большинстве официальных репозиториев. Поэтому с установкой проблем не возникает.
Запускай
Так как doas не входит по умолчанию в коробочные версии linux, утилита требует немного бОльших настроек, в отличие от sudo. Но конфигурация намного проще для понимания чем sudo. Настраивается все это через файл /etc/doas.conf. Если файла нет, создай!
Цель doas - решить сложность sudo.
Давай эмитируем поведение sudo и позволим пользователю выполнять любые команды от пользователя root. Добавляем в конфиг такую херабору:
Теперь пользователь user сможет выполнять команды от root + пользователь получает льготный период, когда не нужно вводить пароль в течение нескольких минут после последовательных команд doas.
Допустим мне нужно сделать подобное, но для определенной группы, добавляем в конфиг строчку:
Теперь все кто заключен в группу wheel смогут побыть рутом. Также и с белым списком команд, которые можно выдать для запуска без пароля:
Да, конфиг более читабельный чем у sudo. И в обозримом будущем есть очень большая вероятность того, что sudo закинут в деприкейтед, а doas сделают основным рабочим инструментом. Так как sudo уже непроходимоегавно болото в плане поддержки кода, который трудно понимать и использовать.
Возьмем даже валидатор конфига visudo. Который проверяет синтаксис конфига. А это говорит о том, что синтаксис файла sudoers ну совсем фу и воняет. Требует проверки. Да и 99% пользователей используют sudo исключительно для установки софта.
Разница налицо (попахивает порнохабом):
Конфиг sudo
Конфиг «делать жопу»
Ну и с помощью doas можно запустить root shell такой командой:
Кстати был казус с портированием под FreeBSD, спустя несколько часов после публикации doas, в ней нашли критическую уязвимость. Которая позволяла выполнить привилегированные операции даже если был указан неверный пароль пользователя. Как обычно накосячил разработчик, который раздеплоился в прод без тестирования. Ну либо специально заложил бекдор, история умалчивает.
Вот такие пироги. Увидимся совсем скоро и сделаем что-нибудь полезное, например сломаем прод, ну или ногу...
tags: #linux #utils
—
💩 @bashdays
doas – утилита, которая позволяет обычным пользователям выполнять задачи от имени root, так же как это делает sudo. Она была разработана проектом OpenBSD как минималистичная альтернатива sudo.
Интересно кстати звучит: do ass (делать жопу)
Утилита доступна в большинстве официальных репозиториев. Поэтому с установкой проблем не возникает.
Запускай
apt install «делатьжопу» (или какой там у тебя пакетный менеджер) и погнали смотреть на эти булки поближе.Так как doas не входит по умолчанию в коробочные версии linux, утилита требует немного бОльших настроек, в отличие от sudo. Но конфигурация намного проще для понимания чем sudo. Настраивается все это через файл /etc/doas.conf. Если файла нет, создай!
Цель doas - решить сложность sudo.
Давай эмитируем поведение sudo и позволим пользователю выполнять любые команды от пользователя root. Добавляем в конфиг такую херабору:
permit persist user as root
Теперь пользователь user сможет выполнять команды от root + пользователь получает льготный период, когда не нужно вводить пароль в течение нескольких минут после последовательных команд doas.
Допустим мне нужно сделать подобное, но для определенной группы, добавляем в конфиг строчку:
permit persist :wheel as root
Теперь все кто заключен в группу wheel смогут побыть рутом. Также и с белым списком команд, которые можно выдать для запуска без пароля:
permit persist user as root
permit nopass :user as root cmd apt
Да, конфиг более читабельный чем у sudo. И в обозримом будущем есть очень большая вероятность того, что sudo закинут в деприкейтед, а doas сделают основным рабочим инструментом. Так как sudo уже непроходимое
Возьмем даже валидатор конфига visudo. Который проверяет синтаксис конфига. А это говорит о том, что синтаксис файла sudoers ну совсем фу и воняет. Требует проверки. Да и 99% пользователей используют sudo исключительно для установки софта.
Разница налицо (попахивает порнохабом):
Конфиг sudo
%wheel ALL=(ALL) NOPASSWD: ALL
Конфиг «делать жопу»
permit nopass :wheel as root
Ну и с помощью doas можно запустить root shell такой командой:
doas -s
Кстати был казус с портированием под FreeBSD, спустя несколько часов после публикации doas, в ней нашли критическую уязвимость. Которая позволяла выполнить привилегированные операции даже если был указан неверный пароль пользователя. Как обычно накосячил разработчик, который раздеплоился в прод без тестирования. Ну либо специально заложил бекдор, история умалчивает.
Вот такие пироги. Увидимся совсем скоро и сделаем что-нибудь полезное, например сломаем прод, ну или ногу...
tags: #linux #utils
—
Please open Telegram to view this post
VIEW IN TELEGRAM
👍93
Как бы странно это не звучало, но в оболочке bash есть набор очень полезных хоткеев для эффективной работы. Держу пари многие тут пользуются только ctrl+r и ctrl+l, да чо греха таить я из этого же числа. Давай залезем поглубже и возможно возьмем что-то на вооружение.
Навигация
Хм… фигня какая-то, я пользуюсь ctrl+стрелочки, хватает.
Редактирование
Тут уже поинтереснее. Мне зашло преобразование в заглавные и строчные символы, не знал. Ну и откат порадовал по Ctrl+Y.
Bash History
Избыточно. Максимум оставляем Ctrl+R, остальное ну такое.
Общие хоткеи
Большинство из них мы с вами знаем. Из интересного это остановка прокрутки, например когда нужно приостановить вывод информации на экран и прочитать ее.
Как видим никаких киллер-фич нет. За исключением пары-тройки хоткеев. Разогнать workflow особо не получится, но для ознакомления вполне сойдет.
Если знаешь какие-нибудь еще вкусные сочетания или хаки, велком в комментарии.
tags: #linux #bash
—
💩 @bashdays
Навигация
Ctrl+A переместить курсор в начало строки
Ctrl+E переместить курсор в конец строки
Ctrl+F переместить курсор на один символ вправо
Ctrl+B переместить курсор на один символ влево
Alt+B / Esc+B переместить курсор влево на одно слово
Хм… фигня какая-то, я пользуюсь ctrl+стрелочки, хватает.
Редактирование
Ctrl+U удалить все и вернуться в начала строки
Ctrl+K удалить все после курсора
Ctrl+W удалить слово перед курсором
Alt+D удалить слово после курсора
Ctrl+Y вернуть удаленное
Ctrl+D удалить символ под курсором
Ctrl+H аналогично backspace
Alt+T смена позиции текущего слова на предыдущее
Ctrl+T замена местами двух символа перед курсором
Alt+U перевод слова в заглавные после курсора
Alt+L перевод слова в строчные после курсора
Ctrl+_ отмена последнего ввода
Тут уже поинтереснее. Мне зашло преобразование в заглавные и строчные символы, не знал. Ну и откат порадовал по Ctrl+Y.
Bash History
Ctrl+R режим обратного поиска
Ctrl+P переход к предыдущей команде
Ctrl+N переход к следующей команде
Ctrl+O выполнить найденную команду
Ctrl+G выход из режима поиска
!! выполнить предыдущую команду
!vim выполнить последнюю команду, которая начиналась на vim
!vim:p вывести последнюю команду, которая начиналась на vim
!n запустить n команду из history
Избыточно. Максимум оставляем Ctrl+R, остальное ну такое.
Общие хоткеи
Ctrl+C завершить команду
Ctrl+L очистить экран
Ctrl+S приостановить вывод, остановить прокрутку
Ctrl+Q возобновить прокрутку
Ctrl+D закрыть оболочку
Ctrl+Z приостановить процесс
Большинство из них мы с вами знаем. Из интересного это остановка прокрутки, например когда нужно приостановить вывод информации на экран и прочитать ее.
Как видим никаких киллер-фич нет. За исключением пары-тройки хоткеев. Разогнать workflow особо не получится, но для ознакомления вполне сойдет.
Если знаешь какие-нибудь еще вкусные сочетания или хаки, велком в комментарии.
tags: #linux #bash
—
Please open Telegram to view this post
VIEW IN TELEGRAM
👍162
Привет, дело было вечером, делать было нечего. Начнем это утро с мнемоники прав доступа. Оно нам сегодня вечером пригодится. Возможно будет сумбурно, но постараюсь разжевать. А вечером будем заниматься хитрой стеганографией на bash, как раз с помощью прав доступа.
Для стандартных трех троек прав доступа справедливо следующее:
Сразу обрати внимание на разряды с единицей (1) в двоичной системе счисления. Они соответствуют позициям прав доступа в символьном представлении из вывода команды ls -l.
Наглядная табличка соответствий:
Если на пальцах, у нас есть 3 базовых цифры 1, 2, 4 которые означают такое:
Берем эти цифры, складываем как угодно и получаем например 7, что равно 1+2+4 = rwx (читаем, пишем, исполняем).
Ладно, большинству из вас оно нахрен не вперлось, но я продолжу. У меня коллега например всегда всем ставит 777 даже не задумываясь. Мол всё работает и никогда нет проблем с доступом к файлам и папкам. Ну ок, возможно однажды встретит своего черношляпа и пересмотрит свои практики. Работает кстати в крупном банке. Только представь какой 3.14здец на серверах у него творится где наши денюжки лежат.
Давай по теме. Создаем массив:
Получаем права в двоичной системе счисления:
На экран выведется:
В bash при указании индекса массива можно применять арифметические операции. Давай воспользуемся и наглядно посмотрим как суммируются права доступа.
Получаем:
То есть когда мы делали arr[1] у нас было 000, а когда применили сложение arr[1+2], 000+001 = 011.
В общем математика и кишочки. Голову сильно не забивай, в повседневных задачах достаточно восьмеричной и символичной системы счислений. Из полезного: теперь ты знаешь как создавать массивы и складывать их.
Ну и на закуску команда, которая выведет права в восьмеричной системе:
Получим такое:
Не забываем что у всей этой ерунды есть еще дополнительные биты, это когда права указываются четырьмя цифрами.
Короче базу рассмотрели, если ничо не понял, забей. Это как Джаз, чтобы от него блевать не хотелось, нужно стать старым пердуном. Но мы же с вами еще так молоды!
Увидимся вечером. Хорошего понедельника!
tags: #linux #bash
—
💩 @bashdays
Для стандартных трех троек прав доступа справедливо следующее:
4 2 1 # восьмеричная система
r-- -w- --x # символьное представление
100 010 001 # двоичная система
Сразу обрати внимание на разряды с единицей (1) в двоичной системе счисления. Они соответствуют позициям прав доступа в символьном представлении из вывода команды ls -l.
Наглядная табличка соответствий:
- 0: 000 / —Если требуется определенный набор прав, то складываем 4, 2, 1. Первая строка это, права, которые получаются при сложении.
- 1: 001 / –x
- 2: 010 / -w-
- 3: 011 / -wx
- 4: 100 / r–
- 5: 101 / r-x
- 6: 110 / rw-
- 7: 111 / rwx
3 5 6 7
1+2 1+4 2+4 1+2+4
-wx r-x rw- rwx
011 101 110 111
Если на пальцах, у нас есть 3 базовых цифры 1, 2, 4 которые означают такое:
4 = r
2 = w
1 = x
Берем эти цифры, складываем как угодно и получаем например 7, что равно 1+2+4 = rwx (читаем, пишем, исполняем).
Ладно, большинству из вас оно нахрен не вперлось, но я продолжу. У меня коллега например всегда всем ставит 777 даже не задумываясь. Мол всё работает и никогда нет проблем с доступом к файлам и папкам. Ну ок, возможно однажды встретит своего черношляпа и пересмотрит свои практики. Работает кстати в крупном банке. Только представь какой 3.14здец на серверах у него творится где наши денюжки лежат.
Давай по теме. Создаем массив:
arr=({0..1}{0..1}{0..1})Получаем права в двоичной системе счисления:
echo ${arr[1]}
echo ${arr[2]}
echo ${arr[3]}
echo ${arr[4]}
echo ${arr[5]}
echo ${arr[6]}
echo ${arr[7]}На экран выведется:
000
001
010
011
100
101
110
В bash при указании индекса массива можно применять арифметические операции. Давай воспользуемся и наглядно посмотрим как суммируются права доступа.
echo ${arr[1+2]}
echo ${arr[1+4]}
echo ${arr[2+4]}
echo ${arr[1+2+4]}Получаем:
010
100
101
110
То есть когда мы делали arr[1] у нас было 000, а когда применили сложение arr[1+2], 000+001 = 011.
В общем математика и кишочки. Голову сильно не забивай, в повседневных задачах достаточно восьмеричной и символичной системы счислений. Из полезного: теперь ты знаешь как создавать массивы и складывать их.
Ну и на закуску команда, которая выведет права в восьмеричной системе:
stat -c'%a %n' /tmp/*
Получим такое:
700 snap-private-tmp
700 ssh-XXXXXX5Fyxmr
700 ssh-XXXXXXENecCm
700 ssh-XXXXXXkPO9QF
700 systemd-logind.tkfPcb
700 systemd-r1KRzA
777 test.txt
Не забываем что у всей этой ерунды есть еще дополнительные биты, это когда права указываются четырьмя цифрами.
Короче базу рассмотрели, если ничо не понял, забей. Это как Джаз, чтобы от него блевать не хотелось, нужно стать старым пердуном. Но мы же с вами еще так молоды!
Увидимся вечером. Хорошего понедельника!
tags: #linux #bash
—
Please open Telegram to view this post
VIEW IN TELEGRAM
👍120 5