Не переношу жару, черт его знает как в детстве мы сидели во дворе и пили водку на солнце в +45 градусов, сейчас бы я так не смог.
Сегодня будем проводить ректальное тестировать переменной PATH с помощью кишки.
Эта кишка проверяет элементы в переменной PATH. И выводит на экран которые не существуют, или к которым нет доступа на чтение.
Давай разберем каждый элемент отдельно:
Отключает функцию pathname expansion (или globbing). Это предотвращает интерпретацию символов
Устанавливает разделитель полей (Internal Field Separator, IFS) на двоеточие «:». Это необходимо для правильного разбора переменной PATH, где пути разделены двоеточием.
Запускает цикл for, который перебирает каждый элемент переменной PATH. Выражение
Внутри цикла проверяется каждый элемент «i» из PATH.
Проверяет, существует ли каталог
Если каталог не существует или недоступен для чтения, то выводится значение «i» (путь).
Думаю более менее понятно. Если видишь огромную кишку, разбивай её на части и тогда с ней проще будет разобраться.
В общем суть такая — если переменная PATH не установлена или пустая, команда завершится и будет выдано сообщение «хуй с маслом».
Поля переменной PATH отображаются на экран, если не соответствуют минимальным требованиям, или являются нулевыми. Bash будет искать в текущей директории.
✔ Минимальные требования.
Каждый элемент пути должен иметь бит исполнения. Последний элемент должен быть каталогом и обладать разрешением на чтение, исполнение.
Для запуска программы достаточно, чтоб исполняемый файл программы имел бит исполнения и все каталоги в пути имели бит исполнения, чтения (не требуется если указываете полный путь до исполняемого файла).
У меня например после запуска кишки, выдало:
Пошел смотреть и точно, в переменной PATH этот каталог указан, а физически его нет на диске.
Для исследования путей удобно использовать команду namei.
Ну а так вроде всё, изучай!
tags: #bash #linux
—
🔔
Сегодня будем проводить ректальное тестировать переменной PATH с помощью кишки.
( set -f; IFS=':'; for i in ${PATH:?'хуй с маслом'};do [[ -r "$i" && -d "$i/." ]] || echo "$i";done )
Эта кишка проверяет элементы в переменной PATH. И выводит на экран которые не существуют, или к которым нет доступа на чтение.
Давай разберем каждый элемент отдельно:
set -f
Отключает функцию pathname expansion (или globbing). Это предотвращает интерпретацию символов
*, ? и []
как шаблонов имен файлов.IFS=':'
Устанавливает разделитель полей (Internal Field Separator, IFS) на двоеточие «:». Это необходимо для правильного разбора переменной PATH, где пути разделены двоеточием.
for i in ${PATH:?'хуй с маслом'}
Запускает цикл for, который перебирает каждый элемент переменной PATH. Выражение
${PATH:?'empty path'}
проверяет, что переменная PATH не пустая; если она пустая, выводится сообщение «хуй с маслом» и выполнение прерывается.do [[ -r "$i" && -d "$i/." ]] || echo "$i"; done
Внутри цикла проверяется каждый элемент «i» из PATH.
[[ -r "$i" && -d "$i/." ]]
Проверяет, существует ли каталог
(-d "$i/.")
и доступен ли он для чтения (-r "$i")
.|| echo "$i"
Если каталог не существует или недоступен для чтения, то выводится значение «i» (путь).
Думаю более менее понятно. Если видишь огромную кишку, разбивай её на части и тогда с ней проще будет разобраться.
Это как в тайм-менеджмент, что-то там блядь про делёжку слона на маленькие кусочки.
В общем суть такая — если переменная PATH не установлена или пустая, команда завершится и будет выдано сообщение «хуй с маслом».
Поля переменной PATH отображаются на экран, если не соответствуют минимальным требованиям, или являются нулевыми. Bash будет искать в текущей директории.
man bash → PARAMETERS → Shell Variables → PATH
PATH The search path for commands. It is a colon-separated list of directories in which the shell looks for commands (see COMMAND EXECUTION below). A zero-length (null) directory name in the value of PATH indicates the current directory. A null directory name may appear as two adjacent colons, or as an initial or trailing colon. The default path is system-dependent, and is set by the administrator who installs bash. A common value is `/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin'
✔ Минимальные требования.
Каждый элемент пути должен иметь бит исполнения. Последний элемент должен быть каталогом и обладать разрешением на чтение, исполнение.
Для запуска программы достаточно, чтоб исполняемый файл программы имел бит исполнения и все каталоги в пути имели бит исполнения, чтения (не требуется если указываете полный путь до исполняемого файла).
У меня например после запуска кишки, выдало:
/snap/bin
Пошел смотреть и точно, в переменной PATH этот каталог указан, а физически его нет на диске.
Для исследования путей удобно использовать команду namei.
namei -m /etc
f: /etc
drwxr-xr-x /
drwxr-xr-x etc
Тему про PATH поднимал раннее в этом посте.
Ну а так вроде всё, изучай!
tags: #bash #linux
—
🔔
╯╭┳┳┳╮╰┈╮╰┈╯╭┈╮
╮┣╭━╮┃▕╲╰┈┈┈╯╱▏
┊┣┃┈╰╯▕╱▔▔▔▔▔╲▏
╯┣╰┳┳┳┳▏▊┈▂┈▊▕╭
╮╰━▏┊┊┊╲┈╰┻╯┈╱┊
╰╮┊▏▂▂▂▂▔▂▕▔▔╭╯
╮┊▕▂▏▂▏▕▂▏▂▏╭╯
Тыкни и подпишись на GITHUB котика
╮┣╭━╮┃▕╲╰┈┈┈╯╱▏
┊┣┃┈╰╯▕╱▔▔▔▔▔╲▏
╯┣╰┳┳┳┳▏▊┈▂┈▊▕╭
╮╰━▏┊┊┊╲┈╰┻╯┈╱┊
╰╮┊▏▂▂▂▂▔▂▕▔▔╭╯
╮┊▕▂▏▂▏▕▂▏▂▏╭╯
Тыкни и подпишись на GITHUB котика
Здравствуйте товарищи. Ну чо, как оно?
Поехали еBash’ить. Сегодня разберем интересную задачку, которую я подкидываю на собесы. Задача со звездочкой.
Суть задачи: нужно вывести строки в окно терминала и пронумеровать их используя только один вызов sed. Аналогично выводу команды nl.
То есть должно получиться такое:
Только это нужно сделать с помощью одного вызова sed.
Обычно кто берется ее решать, спустя какое-то время говорят — Роман, иди нахуй, это сделать невозможно!
Так говорят бедолаги, которым либо лень что-то делать, либо писька еще не отросла. Всё возможно, было бы желание.
Короче поехали решать. Давай попробуем сразу с sed несколько вариантов.
Ну чет да… ожидаемый результат совсем не ожидаемый.
Дело в том, что когда sed встречает команду «=», он тут же пишет текущий номер строки с завершающим символом «\n» или «\0». То есть номер и строка разделены «\n» или «\0».
Поэтому в примерах по sed для решения этой задачи, используют два вызова.
Вот так всё корректно отработает, но задачу мы не решили, условия другие. Нам можно использовать лишь один sed.
✔ Чо будем делать? Думать ёпта!
Для начала надо посмотреть, а что мы имеем и на что можем повлиять.
Утилита sed пишет строки. Куда она их пишет? Вот и решение…
Вставляем в начало каждой строки, управляющую последовательность. Которая переместит курсор на предыдущую строку и установит его например в 3 колонку.
Получаем ожидаемый результат:
Поздравляю! Задача решена с помощью всего лишь одного вызова sed.
Изучай. Всех с пятницей и хороших предстоящих выходных. Береги себя!
tags: #bash #linux
—
🔔
Поехали еBash’ить. Сегодня разберем интересную задачку, которую я подкидываю на собесы. Задача со звездочкой.
Суть задачи: нужно вывести строки в окно терминала и пронумеровать их используя только один вызов sed. Аналогично выводу команды nl.
То есть должно получиться такое:
printf '%s\n' {a..d} | nl
1 a
2 b
3 c
4 d
Только это нужно сделать с помощью одного вызова sed.
Обычно кто берется ее решать, спустя какое-то время говорят — Роман, иди нахуй, это сделать невозможно!
Так говорят бедолаги, которым либо лень что-то делать, либо писька еще не отросла. Всё возможно, было бы желание.
Короче поехали решать. Давай попробуем сразу с sed несколько вариантов.
printf '%s\n' {a..d} | sed '='
printf '%s\n' {a..d} | sed -n 'p;='
printf '%s\n' {a..d} | sed -n '=;p'
Ну чет да… ожидаемый результат совсем не ожидаемый.
Дело в том, что когда sed встречает команду «=», он тут же пишет текущий номер строки с завершающим символом «\n» или «\0». То есть номер и строка разделены «\n» или «\0».
Поэтому в примерах по sed для решения этой задачи, используют два вызова.
printf '%s\n' {a..d} | sed '=' | sed 'N;s/\n/ /'
Вот так всё корректно отработает, но задачу мы не решили, условия другие. Нам можно использовать лишь один sed.
✔ Чо будем делать? Думать ёпта!
Для начала надо посмотреть, а что мы имеем и на что можем повлиять.
Утилита sed пишет строки. Куда она их пишет? Вот и решение…
Вставляем в начало каждой строки, управляющую последовательность. Которая переместит курсор на предыдущую строку и установит его например в 3 колонку.
printf '%s\n' {a..d} | sed '=;s/^/\x1b[1A\x1b[3G/'
Получаем ожидаемый результат:
1 a
2 b
3 c
4 d
Поздравляю! Задача решена с помощью всего лишь одного вызова sed.
Если очевидные решения не приносят результата, всегда можно воспользоваться неочевидными. Благо таких неочевидных решений бесконечное множество.
Изучай. Всех с пятницей и хороших предстоящих выходных. Береги себя!
tags: #bash #linux
—
🔔
Зрасти. Сегодня замутим простую проверку корректности формата файла. Для этого воспользуемся утилитой sed.
Вводные
Есть файл с последовательностью символов
Пример такого файла:
Теперь нужно, чтобы при проверке такого файла, программа прерывалась и выводила номер строки, которая нарушает формат. Если файл содержит допустимую последовательность или пустой, то — молчим.
✔ Создаем скрипт check
Необычно? Необычно! Это скрипт на языке Sed. Давай Разберем, что тут происходит.
… аналогично для 2 и 3
Погнали чекать кейсы. Не забудь на check впиздярить
1. Выводится 3 номер строки
2. Пусто. Файл валиден.
3. Выводится 9 номер строки
4. Пусто. Файл валиден.
5. Пусто. Файл валиден.
6. Выводится 7 номер строки
Чтиво: адресация, команды, шаблоны
tags: #bash #linux
—
🔔
Вводные
Есть файл с последовательностью символов
1, 2, 3, 4, 5
. Каждая цифра с новой строки. Эти символы могут располагаться в любой позиции строки. Строка может содержать другие символы отличные от символов заданной последовательности. Пример такого файла:
1
2
3
4
a1
b2
3c
4d
Теперь нужно, чтобы при проверке такого файла, программа прерывалась и выводила номер строки, которая нарушает формат. Если файл содержит допустимую последовательность или пустой, то — молчим.
✔ Создаем скрипт check
#!/usr/bin/sed -nf
$bE ; /1/!bE ; n
$bE ; /2/!bE ; n
$bE ; /3/!bE ; n
/4/b
:E = ; q
Необычно? Необычно! Это скрипт на языке Sed. Давай Разберем, что тут происходит.
$bE
= Если находимся на последней строке переход к метке «E»./1/!bE ; n
= Если текущая строка не содержит 1, переход к метке «E». В противном случае переходим к следующей строке.… аналогично для 2 и 3
/4/b
= Если текущая строка содержит 4, перейти в конец скрипта.:E = ; q
= метка «E» печатает текущую строку и завершает выполнение.Погнали чекать кейсы. Не забудь на check впиздярить
+x
.printf '%s\n' {1..3} | ./check
printf '%s\n' {1..4} | ./check
printf '%s\n' {1..4} {1..5} | ./check
printf '%s\n' {1..4} {1..4} | ./check
printf '%s\n' a{1..4} b{1..4} | ./check
printf '%s\n' a{1..4} b{1..3} | ./check
1. Выводится 3 номер строки
2. Пусто. Файл валиден.
3. Выводится 9 номер строки
4. Пусто. Файл валиден.
5. Пусто. Файл валиден.
6. Выводится 7 номер строки
Вместо перехода на метку можно просто выходить и возвращать нужное значение с помощью команды «q» которая в GNU версии принимает аргумент.
Чтиво: адресация, команды, шаблоны
tags: #bash #linux
—
🔔
Забавная хуита. Виндовз что с тобой?
Короче если создать текстовый файл с содержимым «This content is no longer available.» и сохранить его, винда начинает жестко угорать.
Мол, вы пиздец хакер и только что создали вирус под названием Trojan:Win32/Casdet!rfn. Касдет-пиздет.
Прикольно. Что-то из оперы EICAR
По-видимому, это коллизия хэшей. Потому что только Windows Defender его детектит, вот репорт с вирус-тотал.
tags: #мозготрах
—
🔔
Короче если создать текстовый файл с содержимым «This content is no longer available.» и сохранить его, винда начинает жестко угорать.
Мол, вы пиздец хакер и только что создали вирус под названием Trojan:Win32/Casdet!rfn. Касдет-пиздет.
Trojan:Win32/Casdet!rfn – это вредоносная программа, относящаяся к категории удаленного доступа (RAT). Она позволяет злоумышленникам получить контроль над вашим компьютером, красть ваши данные и устанавливать другие вредоносные программы.
Прикольно. Что-то из оперы EICAR
X5O!P%[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
По-видимому, это коллизия хэшей. Потому что только Windows Defender его детектит, вот репорт с вирус-тотал.
tags: #мозготрах
—
🔔
🗓 27 июня, 16:00
📌 Как быстро мигрировать инфраструктуру в Selectel
На бесплатном вебинаре от коллеги расскажут, как перенести инфраструктуру с минимальным даунтаймом и при этом предусмотреть все нюансы миграции. Сколько времени занимает переезд проекта, с какими проблемами можно столкнуться и как убедиться, что после миграции ничего не сломалось.
Основные темы:
◽️ План переноса.
◽️ Потенциальные проблемы.
◽️ Инструменты для миграции.
◽️ Тестирование сервисов.
Все участники смогут принять участие в акции «100% скидка на облачные ресурсы на 1 месяц» и получат типовой план переноса инфраструктуры.
Регистрируйтесь на мероприятие и участвуйте в розыгрыше приза за лучший вопрос: https://slc.tl/rkovh
Реклама ООО «Селектел» erid: 2VtzquiyU5m
📌 Как быстро мигрировать инфраструктуру в Selectel
На бесплатном вебинаре от коллеги расскажут, как перенести инфраструктуру с минимальным даунтаймом и при этом предусмотреть все нюансы миграции. Сколько времени занимает переезд проекта, с какими проблемами можно столкнуться и как убедиться, что после миграции ничего не сломалось.
Основные темы:
◽️ План переноса.
◽️ Потенциальные проблемы.
◽️ Инструменты для миграции.
◽️ Тестирование сервисов.
Все участники смогут принять участие в акции «100% скидка на облачные ресурсы на 1 месяц» и получат типовой план переноса инфраструктуры.
Регистрируйтесь на мероприятие и участвуйте в розыгрыше приза за лучший вопрос: https://slc.tl/rkovh
Реклама ООО «Селектел» erid: 2VtzquiyU5m
Ну и пекло, по ощущениям +60 и комары. Сегодня на изи, KPI нулевой.
Узнаем имя и путь последнего файла/каталога. Иногда нужно отработать подобный кейс, чтобы произвести какие-то манипуляции над последним файлом в каталоге.
Выдаст полный путь до файла/каталога. В примере папка с бекапами. Чтобы не ебстись и городить кишку с find, у ls есть для этого ключик для сортировки.
Ну и с помощью head, забираем имя последнего файла/каталога.
Всё, пойду дальше плавиться…
tags: #bash #linux
—
🔔
Узнаем имя и путь последнего файла/каталога. Иногда нужно отработать подобный кейс, чтобы произвести какие-то манипуляции над последним файлом в каталоге.
ls -t ~/backups/* | head -1
Выдаст полный путь до файла/каталога. В примере папка с бекапами. Чтобы не ебстись и городить кишку с find, у ls есть для этого ключик для сортировки.
Ну и с помощью head, забираем имя последнего файла/каталога.
Всё, пойду дальше плавиться…
tags: #bash #linux
—
🔔
Со шрамами приходит сила
И снова здрасти. Хуй знает очевидная эта штука для тебя или нет, но я все равно ее подсвечу.
Предположим у тебя есть какой-то проект описанный в
Из того что я постоянно вижу — После сборки проекта, все собранные файлы копируются на продакшен с помощью rsync, scp или подобных утилит, ну и ранится все это дело через ssh.
Например:
1. Что-то там собралось
2. Файлы синканулись с продом
3. Запустилось если смогло
✔ Хуита! Всё делается изящнее. Ща покажу.
Используем мощности docker-compose, не привлекаем никакие rsync, scp и т.п. А сразу нативно запускаем на проде наш
Никаких лишних файлов не копируется, никаких утилит, минималистичное. Я примеры сократил, но суть ты поймешь. Не обязательно тащить на прод какие-то ямеэльки.
В штыки не воспринимай, способ с rsync и т.п. вполне годный. Но делюсь, тем, чем пользуюсь сам. У меня телеграм боты так деплоятся.
Изучай. Не отвлекаю! Если хоть одному из вас пригодится, это уже хорошо!
tags: #devops
—
🔔
И снова здрасти. Хуй знает очевидная эта штука для тебя или нет, но я все равно ее подсвечу.
Предположим у тебя есть какой-то проект описанный в
docker-compose.yml
. Вся эта чача раскатывается через пайплайны gitlab на продакшен.Из того что я постоянно вижу — После сборки проекта, все собранные файлы копируются на продакшен с помощью rsync, scp или подобных утилит, ну и ранится все это дело через ssh.
Например:
script
- билд хуилд
- rsync -avz --delete ./ user@$prod:/var/www`
- ssh user@$prod "docker compose up -d"
1. Что-то там собралось
2. Файлы синканулись с продом
3. Запустилось если смогло
✔ Хуита! Всё делается изящнее. Ща покажу.
stage: deploy
image:
name: docker/compose
script:
- docker-compose -H "ssh://root@$prod" down --remove-orphans
- docker-compose -H "ssh://root@$prod" pull
- docker-compose -H "ssh://root@$prod" up -d
Используем мощности docker-compose, не привлекаем никакие rsync, scp и т.п. А сразу нативно запускаем на проде наш
docker-compose.yml
файл.Никаких лишних файлов не копируется, никаких утилит, минималистичное. Я примеры сократил, но суть ты поймешь. Не обязательно тащить на прод какие-то ямеэльки.
В штыки не воспринимай, способ с rsync и т.п. вполне годный. Но делюсь, тем, чем пользуюсь сам. У меня телеграм боты так деплоятся.
Изучай. Не отвлекаю! Если хоть одному из вас пригодится, это уже хорошо!
tags: #devops
—
🔔
а у кого какие бест практики подобных деплоев? 👆 давайте в комментах найдем эти практики, будет всем полезно, чтоб гавно не делать впредь
скидывайте, не бойтесь, любые даже самые топорные решения
скидывайте, не бойтесь, любые даже самые топорные решения
Разыгрывать будем 👆 только среди подписчиков могзотрах, чатика и полезняшек, королевство кривых ебал — мимо. Так что не облажайся, подпишись на все три.
Сегодня подъехал экземпляр «Релиз», Лемитед блядь эдищен.
Если моя ленивая жопа завтра соизволит сходить на почту, то завтра и разыграем эту колоду среди подписчиков нашего Пантеона.
Если моя ленивая жопа завтра соизволит сходить на почту, то завтра и разыграем эту колоду среди подписчиков нашего Пантеона.
Сегодня будем искать самое длинное слово в текстовом файле. На pure bash. Зачем? Джаст фор фан, чтоб мозги подразмять. А вообще эта задачка из методички для собесов.
Создаем текстовый файл
Пишем скрипт:
В результате получаем: Самое длинное слово «хуйпиздаджигурда» и его длина 16.
Алгоритм таков: цикл проходит по каждому слову в файле, вычисляет длину текущего слова
Если знаешь способ короче, без использования внешних утилит, кидай в комменты, полайкаем.
Вечером еще чтиво подъедет. На связи!
tags: #bash
—
🔔
Создаем текстовый файл
bashdays.txt
с таким содержимым:hello world хуйпиздаджигурда bashdays комутохеровато бидон
Пишем скрипт:
#!/bin/bash
longest=0
for word in $(<bashdays.txt)
do
len=${#word}
if (( len > longest ))
then
longest=$len
longword=$word
fi
done
printf 'Самое длинное слово %s и его длина %d.\n' "$longword" "$longest"
В результате получаем: Самое длинное слово «хуйпиздаджигурда» и его длина 16.
Алгоритм таков: цикл проходит по каждому слову в файле, вычисляет длину текущего слова
len=${#word}
и сохраняет результат в переменную len
. Ну и логика больше-меньше.Если знаешь способ короче, без использования внешних утилит, кидай в комменты, полайкаем.
Вечером еще чтиво подъедет. На связи!
tags: #bash
—
🔔
🔥 Открытые консультации по Kubernetes от архитекторов Southbridge
Лекций по кубу в интернете много, а желающих потратить время и разобрать ваши вопросы — мало. Мы решили это исправить!
Southbridge — DevOps-аутсорсер, специализирующийся на k8s. Cреди экспертов — Сергей Бондарев, один из создателей флагманских курсов по Kubernetes учебного центра Слёрм.
Первая консультация пройдёт 4 июля в 17:00. Сергей и его коллеги в прямом эфире будут отвечать на все ваши вопросы и делиться best practices по эксплуатации кубов.
Для участия в консультациях мы собрали бота-помощника. В нём есть кнопка «Задать вопрос» — спросите у нас что-нибудь нужное! Без ваших вопросов ничего не случится.
Так что спрашивайте и занимайте место на нашей встрече. Это бесплатно. 🙃
Ждём вас 4 июля!
🔗 ЗАДАТЬ ВОПРОС И ПРИЙТИ НА КОНСУЛЬТАЦИЮ
Реклама ООО «Слёрм» ИНН 3652901451 erid: 2VtzqwQCwAg
Лекций по кубу в интернете много, а желающих потратить время и разобрать ваши вопросы — мало. Мы решили это исправить!
Southbridge — DevOps-аутсорсер, специализирующийся на k8s. Cреди экспертов — Сергей Бондарев, один из создателей флагманских курсов по Kubernetes учебного центра Слёрм.
Первая консультация пройдёт 4 июля в 17:00. Сергей и его коллеги в прямом эфире будут отвечать на все ваши вопросы и делиться best practices по эксплуатации кубов.
Для участия в консультациях мы собрали бота-помощника. В нём есть кнопка «Задать вопрос» — спросите у нас что-нибудь нужное! Без ваших вопросов ничего не случится.
Так что спрашивайте и занимайте место на нашей встрече. Это бесплатно. 🙃
Ждём вас 4 июля!
🔗 ЗАДАТЬ ВОПРОС И ПРИЙТИ НА КОНСУЛЬТАЦИЮ
Реклама ООО «Слёрм» ИНН 3652901451 erid: 2VtzqwQCwAg
🔥 Кишочки. Короче познавательное.
В документации для команды
Прежде чем выполнить какой-то код, интерпретатору требуется обработать его.
Нужно найти команду, аргументы, различные перенаправления. Расширить параметры, фигурные скобки, тильда, переменные подстановка результатов выполнения команд, математика, арифметика, география, литература, подстановка имен файлов и т.п.
Короче дохера всего. Полный список можешь найти в разделах SIMPLE COMMAND EXPANSION и EXPANSION выполнив:
Ну дак вот, команда
На вход
Очевидно? Совсем нет. Но вот оно так работает, чо с него взять.
Эта возможность используется по-разному, например для генерации и последующего исполнения кода.
Также если знать некоторые последовательности обработки кода, можно сгладить некоторые особенности самой обработки.
Ниже примеры. При присваивании значения переменной, приведенная конструкция с фигурными скобками не расширяется.
Расширение переменной в строке с командой
Поэтому используем
В результате получим:
Другой пример. Здесь из-за использования одинарных кавычек, переменной присваивается указанная строка, а не значение переменной.
И обработка строки делает расширение переменной один раз. Получаем значение переменной
На экране ты увидишь:
А теперь более сложный пример. Если слева от оператора перенаправления указана не корректная строка, в этом случае для перенаправления будет использована только часть строки, всё что находится слева не будет учитываться.
Это значит, что если ты откроешь файл на чтение и слева укажешь переменную содержащую нужный дескриптор, эта переменная не будет участвовать в перенаправлении.
И раз не указан дескриптор, файл будет ассоциирован со стандартным потоком ввода.
Решение. Делаем так, чтобы при первой обработке перенаправление было распознано как обычная строка и была расширена переменная. Тогда на второй обработке слева от оператора перенаправления будет стоять номер дескриптора из переменной.
В первой строке:
Круглые скобки использовались, чтобы не засорять текущую оболочку. И чтобы она не завершилась на первом примере. Из-за того что на её стандартный ввод повесили
Этот «хак» с перенаправлением можно использовать для исследований. Когда требуется определённый диапазон дескрипторов.
Почитать:
А завтра запускаем конкурс с картами. Моя ленивая жопа соизволила добраться до почты.
Хороших выходных!
tags: #bash
—
🔔
В документации для команды
eval
довольно пространное описание. Давай сегодня с ней поковыряемся.Прежде чем выполнить какой-то код, интерпретатору требуется обработать его.
Нужно найти команду, аргументы, различные перенаправления. Расширить параметры, фигурные скобки, тильда, переменные подстановка результатов выполнения команд, математика, арифметика, география, литература, подстановка имен файлов и т.п.
Короче дохера всего. Полный список можешь найти в разделах SIMPLE COMMAND EXPANSION и EXPANSION выполнив:
man 1 bash
Ну дак вот, команда
eval
запускает эту обработку кода. Но прежде чем команда eval
будет запущена, код должен быть обработан. На вход
eval
попадает код, который уже обработан и прошел проверку. Поэтому получается, что код обрабатывается два раза и только после этого выполняется.Очевидно? Совсем нет. Но вот оно так работает, чо с него взять.
Эта возможность используется по-разному, например для генерации и последующего исполнения кода.
Также если знать некоторые последовательности обработки кода, можно сгладить некоторые особенности самой обработки.
Ниже примеры. При присваивании значения переменной, приведенная конструкция с фигурными скобками не расширяется.
Расширение переменной в строке с командой
echo
происходит гораздо позже, чем расширение фигурных скобок.Поэтому используем
eval
. Первая обработка развернет переменную. Вторая, которая запустит eval
, развернет конструкцию с фигурными скобками.str={1..10}
echo $str
eval echo $str
В результате получим:
{1..10}
1 2 3 4 5 6 7 8 9 10
Другой пример. Здесь из-за использования одинарных кавычек, переменной присваивается указанная строка, а не значение переменной.
И обработка строки делает расширение переменной один раз. Получаем значение переменной
s0
. Количество обработок строки равно количеству eval
плюс один.(s0=100 ; s1='$s0' ; s2='$s1' ; echo "$s2")
(s0=100 ; s1='$s0' ; s2='$s1' ; eval echo "$s2")
(s0=100 ; s1='$s0' ; s2='$s1' ; eval eval echo "$s2")
На экране ты увидишь:
$s1
$s0
100
А теперь более сложный пример. Если слева от оператора перенаправления указана не корректная строка, в этом случае для перенаправления будет использована только часть строки, всё что находится слева не будет учитываться.
Это значит, что если ты откроешь файл на чтение и слева укажешь переменную содержащую нужный дескриптор, эта переменная не будет участвовать в перенаправлении.
И раз не указан дескриптор, файл будет ассоциирован со стандартным потоком ввода.
Решение. Делаем так, чтобы при первой обработке перенаправление было распознано как обычная строка и была расширена переменная. Тогда на второй обработке слева от оператора перенаправления будет стоять номер дескриптора из переменной.
(fd=6 ; exec "$fd"</dev/null)
(fd=6 ; eval exec "$fd</dev/null")
(fd=6 ; eval exec "$fd"\</dev/null)
(fd=6 ; eval exec "$fd"'</dev/null')
В первой строке:
/dev/null
на stdin
и пытается запустить 6.Круглые скобки использовались, чтобы не засорять текущую оболочку. И чтобы она не завершилась на первом примере. Из-за того что на её стандартный ввод повесили
/dev/null
. Проверяем какой дескриптор ассоциирован с устройством /dev/null
.bash -c 'shopt -s execfail ; fd=6 ; exec $fd</dev/null ; ls -l /proc/$$/fd'
bash -c 'shopt -s execfail ; fd=6 ; eval exec $fd\</dev/null ; ls -l /proc/$$/fd'
bash -c 'shopt -s execfail ; fd=6 ; eval exec "$fd</dev/null" ; ls -l /proc/$$/fd'
Этот «хак» с перенаправлением можно использовать для исследований. Когда требуется определённый диапазон дескрипторов.
Почитать:
man 1 bash
, разделы:# REDIRECTION
# SHELL BUILTIN COMMANDS -> eval
# SHELL BUILTIN COMMANDS -> exec
# SHELL BUILTIN COMMANDS -> shopt
А завтра запускаем конкурс с картами. Моя ленивая жопа соизволила добраться до почты.
Хороших выходных!
tags: #bash
—
🔔
Выходные заебись!
Сумма значений со стандартного ввода, или из файла.
➡️ Datamash
➡️ Awk
➡️ Dc
Последнее решение самое занимательное. И самое небезопасное, потому что данные управляют программой.
Вообще во всех трёх случаях очень желательно очищать входные данные.
Почитать:
Да будет так!
tags: #bash
—
🔔
Сумма значений со стандартного ввода, или из файла.
➡️ Datamash
seq 1000 | datamash sum 1
datamash sum 1 < <(seq 1000)
➡️ Awk
seq 1000 | awk '{sum += $1}END{print sum}'
awk '{sum += $1}END{print sum}' <(seq 1000)
➡️ Dc
seq 1000 | dc -e '0d[?+2z>a]salaxp'
dc -e '0d[?+2z>a]salaxp' < <(seq 1000)
Последнее решение самое занимательное. И самое небезопасное, потому что данные управляют программой.
Вообще во всех трёх случаях очень желательно очищать входные данные.
Почитать:
man datamash
man seq
man awk
man dc
Да будет так!
tags: #bash
—
🔔
ЕНОТ ищет таланты
Одна из самых масштабных серверных инфраструктур в России ЕНОТ от VK ищет талантливых разработчиков и SRE, готовых работать с облачными хранилищами и базами данных, облачным решением one-cloud, а также системами метрик и мониторинга.
Присоединяйтесь!
Одна из самых масштабных серверных инфраструктур в России ЕНОТ от VK ищет талантливых разработчиков и SRE, готовых работать с облачными хранилищами и базами данных, облачным решением one-cloud, а также системами метрик и мониторинга.
Присоединяйтесь!
🚜 Синий трактор едет к нам
Этот пост изобилует грубыми выражениями и, в силу своего содержания, вообще не предназначен для просмотра лицам с хрупким душевным миром.
✔ Про Gitlab!
Заебали блядь, мне чо каждый день это гавно обновлять? Ладно бы там нажал кнопку как в wordpress и забыл. А нет, надо хуеву гору телодвижений сделать.
И в 100% эта залупа с первого раза никогда не заводится, то миграции ручками надо запускать, то еще 10 версий предыдущих накатить и молиться.
В прошлый раз вообще пришлось пайплайны переписывать, поломали совместимость.
А еще соль, что при обновлении мне приходится параллельно поднимать клон сервера, на случай если обновка сделает мозги, можно будет на старую версию переключиться. Удобство через край…
И на закуску фаталити — обновку накатывать нужно поздно ночью, либо в выходные, когда разработчики в режиме AFK. Хуита какая-то!
Можно и в будни, но заебут вопросами — а когда заработает?
Этот пост изобилует грубыми выражениями и, в силу своего содержания, вообще не предназначен для просмотра лицам с хрупким душевным миром.
Заебали блядь, мне чо каждый день это гавно обновлять? Ладно бы там нажал кнопку как в wordpress и забыл. А нет, надо хуеву гору телодвижений сделать.
И в 100% эта залупа с первого раза никогда не заводится, то миграции ручками надо запускать, то еще 10 версий предыдущих накатить и молиться.
В прошлый раз вообще пришлось пайплайны переписывать, поломали совместимость.
Либо хуй пополам, либо пизда в дребезги, другого не дано.
А еще соль, что при обновлении мне приходится параллельно поднимать клон сервера, на случай если обновка сделает мозги, можно будет на старую версию переключиться. Удобство через край…
И на закуску фаталити — обновку накатывать нужно поздно ночью, либо в выходные, когда разработчики в режиме AFK. Хуита какая-то!
Можно и в будни, но заебут вопросами — а когда заработает?
...Короче я такие апд
Так, пора закончить с этими картами.
Короче, представляем ситуацию, что тебя нахуй уволили или не заплатили, а ты еще тот злой гений.
Задача — нужно применить все свои навыки заподлостроения в инфраструктуре и знатно усложнить жизнь этим гадам. У тебя есть root доступ ко всему и ты отрабатываешь две недели.
Условия — на тебя не должны подумать и взять за жопу.
Пиши в комментарии свой гениальный план. Чей коммент наберет больше реакций, тому и карты в руки.
Писать нужно не в чатик! А нажав кнопку под постом, это важно. Ну и условия розыгрыша я кидал ранее.
Итоги подведем в следующую пятницу. Доставка по РФ и Беларусь.
Пару колод отдадим вторым и третьим местам, но нужно будет подождать, на руках у меня их щас нет. Там ченить придумаем.
Но если прям чешется, можешь заказать у Кати через Авито.
Погнали сочинять! Может в будущем кто-то и воспользуется твоим гениальным планом 🥳
Короче, представляем ситуацию, что тебя нахуй уволили или не заплатили, а ты еще тот злой гений.
Задача — нужно применить все свои навыки заподлостроения в инфраструктуре и знатно усложнить жизнь этим гадам. У тебя есть root доступ ко всему и ты отрабатываешь две недели.
Условия — на тебя не должны подумать и взять за жопу.
Пиши в комментарии свой гениальный план. Чей коммент наберет больше реакций, тому и карты в руки.
Писать нужно не в чатик! А нажав кнопку под постом, это важно. Ну и условия розыгрыша я кидал ранее.
Итоги подведем в следующую пятницу. Доставка по РФ и Беларусь.
Пару колод отдадим вторым и третьим местам, но нужно будет подождать, на руках у меня их щас нет. Там ченить придумаем.
Но если прям чешется, можешь заказать у Кати через Авито.
Погнали сочинять! Может в будущем кто-то и воспользуется твоим гениальным планом 🥳
Здрасти. Существуют самописные скрипты, которые при запуске устанавливают необходимый набор программ. Этакая автоматизация на коленке, быстро, удобно, никаких ансиблов и паппетов.
Но встает вопрос, а как автоматизировать перезагрузку машины например при обновлении ядра, патчей или какого-то хитровыебанного софта?
Добавить в скрипт reboot на каждую команду? Да не, хуйня какая-то. Тут на помощь приходит reboot-required.
Ща покажу. Есть однострочник:
Первая часть понятна, обновили, апгрейднули, а дальше идет магия.
ㅤ
В квадратных скобках конструкция, которая проверяет наличие файла
Файл reboot-required создается, если система считает, что после обновления требуется перезагрузка. Если файл существует, возвращается true. А если true, то запускается -r = reboot.
Вот и вся наука. Изучай…
tags: #bash #linux
—
🔔
Но встает вопрос, а как автоматизировать перезагрузку машины например при обновлении ядра, патчей или какого-то хитровыебанного софта?
Добавить в скрипт reboot на каждую команду? Да не, хуйня какая-то. Тут на помощь приходит reboot-required.
Ща покажу. Есть однострочник:
apt update && apt -fy upgrade && [ -f /var/run/reboot-required ] && shutdown -r now
Первая часть понятна, обновили, апгрейднули, а дальше идет магия.
ㅤ
В квадратных скобках конструкция, которая проверяет наличие файла
/var/run/reboot-required
и если он есть, то выполняется перезагрузка.Файл reboot-required создается, если система считает, что после обновления требуется перезагрузка. Если файл существует, возвращается true. А если true, то запускается -r = reboot.
Вот и вся наука. Изучай…
tags: #bash #linux
—
🔔