Линукс и DevOps Дни
2.04K subscribers
108 photos
8 videos
194 links
Самобытно про разработку, devops, linux, скрипты, тестирование, сисадминство, техдирство, пиэмство и за айтишную жизу.
Download Telegram
╯╭┳┳┳╮╰┈╮╰┈╯╭┈╮ 
╮┣╭━╮┃▕╲╰┈┈┈╯╱▏ 
┊┣┃┈╰╯▕╱▔▔▔▔▔╲▏
╯┣╰┳┳┳┳▏▊┈▂┈▊▕╭
 ╮╰━▏┊┊┊╲┈╰┻╯┈╱┊
 ╰╮┊▏▂▂▂▂▔▂▕▔▔╭╯
 ╮┊▕▂▏▂▏▕▂▏▂▏╭╯

Тыкни и подпишись на GITHUB котика
Здравствуйте товарищи. Ну чо, как оно?

Поехали е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.

Вводные

Есть файл с последовательностью символов 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. Касдет-пиздет.

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
Ну и пекло, по ощущениям +60 и комары. Сегодня на изи, KPI нулевой.

Узнаем имя и путь последнего файла/каталога. Иногда нужно отработать подобный кейс, чтобы произвести какие-то манипуляции над последним файлом в каталоге.

ls -t ~/backups/* | head -1


Выдаст полный путь до файла/каталога. В примере папка с бекапами. Чтобы не ебстись и городить кишку с find, у ls есть для этого ключик для сортировки.

Ну и с помощью head, забираем имя последнего файла/каталога.

Всё, пойду дальше плавиться…

tags: #bash #linux

🔔
Со шрамами приходит сила

И снова здрасти. Хуй знает очевидная эта штука для тебя или нет, но я все равно ее подсвечу.

Предположим у тебя есть какой-то проект описанный в 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. Зачем? Джаст фор фан, чтоб мозги подразмять. А вообще эта задачка из методички для собесов.

Создаем текстовый файл 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
🔥 Кишочки. Короче познавательное.

В документации для команды 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

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, а также системами метрик и мониторинга.

Присоединяйтесь!
🚜 Синий трактор едет к нам

Этот пост изобилует грубыми выражениями и, в силу своего содержания, вообще не предназначен для просмотра лицам с хрупким душевным миром.


Про Gitlab!

Заебали блядь, мне чо каждый день это гавно обновлять? Ладно бы там нажал кнопку как в wordpress и забыл. А нет, надо хуеву гору телодвижений сделать.

И в 100% эта залупа с первого раза никогда не заводится, то миграции ручками надо запускать, то еще 10 версий предыдущих накатить и молиться.

В прошлый раз вообще пришлось пайплайны переписывать, поломали совместимость.

Либо хуй пополам, либо пизда в дребезги, другого не дано.


А еще соль, что при обновлении мне приходится параллельно поднимать клон сервера, на случай если обновка сделает мозги, можно будет на старую версию переключиться. Удобство через край…

И на закуску фаталити — обновку накатывать нужно поздно ночью, либо в выходные, когда разработчики в режиме AFK. Хуита какая-то!

Можно и в будни, но заебут вопросами — а когда заработает?

Короче я такие апд
...
Так, пора закончить с этими картами.

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

Задача — нужно применить все свои навыки заподлостроения в инфраструктуре и знатно усложнить жизнь этим гадам. У тебя есть root доступ ко всему и ты отрабатываешь две недели.

Условия — на тебя не должны подумать и взять за жопу.

Пиши в комментарии свой гениальный план. Чей коммент наберет больше реакций, тому и карты в руки.

Писать нужно не в чатик! А нажав кнопку под постом, это важно. Ну и условия розыгрыша я кидал ранее.

Итоги подведем в следующую пятницу. Доставка по РФ и Беларусь.

Пару колод отдадим вторым и третьим местам, но нужно будет подождать, на руках у меня их щас нет. Там ченить придумаем.

Но если прям чешется, можешь заказать у Кати через Авито.

Погнали сочинять! Может в будущем кто-то и воспользуется твоим гениальным планом 🥳
Здрасти. Существуют самописные скрипты, которые при запуске устанавливают необходимый набор программ. Этакая автоматизация на коленке, быстро, удобно, никаких ансиблов и паппетов.

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

Добавить в скрипт 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

🔔
Игнорирование больших данных и нейросетей сегодня — почти гарантия провала. Именно поэтому стоит начать погружение в востребованную сферу Data Science и понять, чем занимаются специалисты по машинному обучению и анализу данных. За 5 дней вы узнаете, как работают нейросети, и создадите свою для поиска новостей.

📌 Зарегистрируйтесь прямо сейчас и получите эксклюзивный бонус — гайд «Как пользоваться ChatGPT и Midjourney + 25 полезных нейросетей»: https://epic.st/R-UIR?erid=2VtzqvbBZiQ

Что будем делать на мини-курсе:
— Узнаем, где востребована наука о данных, и разберёмся в различиях 3 основных направлений
— Освоим азы языка Python и визуализируем данные с его помощью
— Изучим базовые конструкции языка SQL

🎁 Вас ждут подарки:
— Год бесплатного изучения английского языка
— Персональная карьерная консультация
— 5 полезных чек-листов для старта карьеры

🎉 Все участники мини-курса получат сертификат на скидку 10 000 рублей на любой курс Skillbox.

Реклама. ЧОУ ДПО «Образовательные технологии «Скилбокс (Коробка...