Привет. Давно не виделись, конец года, все как с ума посходили, всем нужно вчера и срочно. Надеюсь у тебя тоже все хорошо. Сегодня поделюсь задачей которую решал на днях для клиента, связанную со swap.
Задача от заказчика: У меня есть приложение, которое уходит в swap, мне нужно чтобы оно туда не уходило. Сам swap отключать нельзя.
Задаю очевидный вопрос — а зачем? Чтобы что? Ну свапится оно, ну и пусть свапится, никогда с этим проблем ни у кого не встречал.
Как оказалось, они там провели у себя какие-то хитрые тесты и доказали, что если их приложение начинает свапится, то это влияет на скорость его работы. Ну да, есть в этом доля правды. Если на сервере достаточно RAM, можно и реализовать это безобразие.
А решается эта задача через cgroups.
cgroups (Control Groups) представляют собой механизм в ядре Linux для ограничения, изоляции и управления ресурсами, предоставляемыми группам процессов. Они предоставляют интерфейс для создания и управления группами процессов, а затем накладывают ограничения на ресурсы, потребляемые этими группами.
Сначала ставим необходимые пакеты, если они не стоят:
Создаем отдельную группу asshole, в нее будем добавлять приложения, которые нужно оградить от swap:
Запрещаем вытеснять процессы в swap:
Добавляем процесс в группу asshole:
Для примера я добавил nginx, который не будет уходить в swap. Но ты можешь добавить все что угодно.
Дополнительно для группы asshole отключим OOM:
Вот и всё, теперь приложение не будет уходить в swap и OOM (Linux Out-Of-Memory Killer) обломается. Ну и как вариант: всё нахуй встанет раком, продакшен издаст последний вздох и упадет в новогодние праздники. Но тут, как говорится — хозяин барин! Хотели отключить, отключили.
Все настройки производились на ubuntu 22.04, в других версиях есть различия на названия
После создания группы, зайди, посмотри что у тебя там создалось. И от туда уже пляши. У меня этот способ не сработал на виртуальных серверах в Селектеле (permissions denied), но прекрасно сработал в Digital Ocean и на локальной виртуалке.
Экспериментируйте! Кстати после перезагрузки, cgroups слетят и по возможности создавай юнит в systemd, типа такого:
/etc/systemd/system/asshole.service
Хорошего понедельника! И всегда помни, если что-то ограничиваешь, рано или поздно оно взбунтуется и сделает уйму головняков.
tags: #linux
—
💩 @bashdays
Задача от заказчика: У меня есть приложение, которое уходит в swap, мне нужно чтобы оно туда не уходило. Сам swap отключать нельзя.
Задаю очевидный вопрос — а зачем? Чтобы что? Ну свапится оно, ну и пусть свапится, никогда с этим проблем ни у кого не встречал.
Как оказалось, они там провели у себя какие-то хитрые тесты и доказали, что если их приложение начинает свапится, то это влияет на скорость его работы. Ну да, есть в этом доля правды. Если на сервере достаточно RAM, можно и реализовать это безобразие.
А решается эта задача через cgroups.
cgroups (Control Groups) представляют собой механизм в ядре Linux для ограничения, изоляции и управления ресурсами, предоставляемыми группам процессов. Они предоставляют интерфейс для создания и управления группами процессов, а затем накладывают ограничения на ресурсы, потребляемые этими группами.
Сначала ставим необходимые пакеты, если они не стоят:
apt-get install cgroup-tools
Создаем отдельную группу asshole, в нее будем добавлять приложения, которые нужно оградить от swap:
cgcreate -g memory,cpu:/asshole
Запрещаем вытеснять процессы в swap:
echo 0 | tee /sys/fs/cgroup/asshole/memory.swap.max
Добавляем процесс в группу asshole:
cgclassify -g memory,cpu:/asshole/ $(pidof nginx)
Для примера я добавил nginx, который не будет уходить в swap. Но ты можешь добавить все что угодно.
Дополнительно для группы asshole отключим OOM:
echo 1 | tee /sys/fs/cgroup/asshole/memory.oom.group
Вот и всё, теперь приложение не будет уходить в swap и OOM (Linux Out-Of-Memory Killer) обломается. Ну и как вариант: всё нахуй встанет раком, продакшен издаст последний вздох и упадет в новогодние праздники. Но тут, как говорится — хозяин барин! Хотели отключить, отключили.
Все настройки производились на ubuntu 22.04, в других версиях есть различия на названия
memory.swap.max, memory.oom.group
и прочее.После создания группы, зайди, посмотри что у тебя там создалось. И от туда уже пляши. У меня этот способ не сработал на виртуальных серверах в Селектеле (permissions denied), но прекрасно сработал в Digital Ocean и на локальной виртуалке.
Экспериментируйте! Кстати после перезагрузки, cgroups слетят и по возможности создавай юнит в systemd, типа такого:
/etc/systemd/system/asshole.service
[Unit]
Description=My cgroup configuration
[Service]
ExecStartPre=/bin/mkdir -p /sys/fs/cgroup/asshole
ExecStartPre=/bin/mount -t cgroup -o memory asshole /sys/fs/cgroup/asshole
ExecStart=/bin/echo 1 > /sys/fs/cgroup/asshole/memory.oom.group
[Install]
WantedBy=default.target
systemctl daemon-reload
systemctl start asshole
systemctl enable asshole
Хорошего понедельника! И всегда помни, если что-то ограничиваешь, рано или поздно оно взбунтуется и сделает уйму головняков.
tags: #linux
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Ребята, что я вам принёс! Кринжатину! Офигительная консольная, мульти-плеерная игруля под названием «piu-piu».
Под капотом нативный Bash + ANSI. Подозреваю изобрел её наш русскоговорящий соотечественник, судя по локализации терминала на видео.
Суть игрушки: Летим на вертолёте, управляем wasd, стреляем на «p» и уничтожаем вражеские юниты. Жизни и патроны расходуются. Но это еще не всё, в игре присутствует режим penis mode.
Как пишет автор — если тебе не достаточно весело, запускай игру так:
Бери друга и вперед! В два ствола летать гораздо веселее. Так же присутствует режим дуэли, который позволит выяснить у кого прибор длиннее. Выясни это здесь и сейчас!
А в последнем обновлении, добавлен эффект трясущегося хозяйства. Вообще у разработчика большие планы на этот проект, обещают добавить кастомизацию размеров с плавающей точкой.
Если у тебя еще остались друзья, можешь нехило зарубиться!
Ставится элементарно через apt (но версия не последняя), либо сливаешь себе репозиторий, чмодишь на «икс» и запускаешь.
На выбор либо вертолет, либо penis mode. Сам уже отталкивайся от своих предпочтений.
Здесь страница проекта и мануалы как ставить. Погнали!
tags: #linux #bash #games
—
💩 @bashdays
Под капотом нативный Bash + ANSI. Подозреваю изобрел её наш русскоговорящий соотечественник, судя по локализации терминала на видео.
Суть игрушки: Летим на вертолёте, управляем wasd, стреляем на «p» и уничтожаем вражеские юниты. Жизни и патроны расходуются. Но это еще не всё, в игре присутствует режим penis mode.
Как пишет автор — если тебе не достаточно весело, запускай игру так:
penis=big ./piu-piu
Бери друга и вперед! В два ствола летать гораздо веселее. Так же присутствует режим дуэли, который позволит выяснить у кого прибор длиннее. Выясни это здесь и сейчас!
А в последнем обновлении, добавлен эффект трясущегося хозяйства. Вообще у разработчика большие планы на этот проект, обещают добавить кастомизацию размеров с плавающей точкой.
Если у тебя еще остались друзья, можешь нехило зарубиться!
Ставится элементарно через apt (но версия не последняя), либо сливаешь себе репозиторий, чмодишь на «икс» и запускаешь.
На выбор либо вертолет, либо penis mode. Сам уже отталкивайся от своих предпочтений.
Здесь страница проекта и мануалы как ставить. Погнали!
tags: #linux #bash #games
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Вчера в комментариях к посту про «set -k», задали вопрос про решение задачи. Чтобы понять какие опции включены в оболочке bash через «set», достаточно выполнять команду:
В этой команде «$-» представляет текущие опции командной строки.
На экран выведется, что типа такого:
Это все опции, которые на данный момент включены в оболочке Bash через команду «set». Ну и дальше уже можно искать проблемы с нелогичным поведением при выполнении команд. Каждая буква это опция, вызываешь хелп и смотришь что она означает.
Ну или через скрипт, как мы любим:
Про «$-» мало кто знает, в книжках я про неё никогда не встречал. В оболочке zsh эта штука тоже фурычит. Такие дела.
tags: #bash
—
💩 @bashdays
echo $-
В этой команде «$-» представляет текущие опции командной строки.
На экран выведется, что типа такого:
hikmBHs
Это все опции, которые на данный момент включены в оболочке Bash через команду «set». Ну и дальше уже можно искать проблемы с нелогичным поведением при выполнении команд. Каждая буква это опция, вызываешь хелп и смотришь что она означает.
Ну или через скрипт, как мы любим:
if [[ $- == *k* ]]; then
echo "Опция -k установлена."
else
echo "Опция -k не установлена."
fi
Про «$-» мало кто знает, в книжках я про неё никогда не встречал. В оболочке zsh эта штука тоже фурычит. Такие дела.
tags: #bash
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Привет, всех с Новым Годом! Праздники праздниками, но пора уже входить в рабочий поток и разгрести локальный техдолг. На этот раз решаем задачку с тремя известными: Windows + WSL + VirtualBox.
Суть такая. Понадобилось мне вхреначить на локальную машину VirtualBox с убунтой, для тестирования фичи, которую писал в этом посте. Фича не хотела заводиться на виртуальных серверах Селектела, хотя и должна была. Потребовалось убедиться, что дело не в моих кривых руках. Ладно, лирика…
Короче цепануться к убунте из wsl по ssh к VirtualBox из коробки не получилось. Да и понятно, подсети разные. Пришлось временно воспользоваться powershell и через ssh проверить гипотезу с cgroup. Винда видит подсеть виртуалки и с этим проблем нет. Проверил, забыл.
Но вопрос остался открытым: как блять/дь малой кровью из WSL (с ubuntu 22.04) подключиться напрямую к виртуалке c ubuntu 22.04 по ssh? И не задрачиваться с таблицами роутинга? Рассказываю!
Чтобы не лезть в маршрутизацию, пришлось воспользоваться стандартным функционалом проброса портов в самом VirtualBox. Жопа конечно знатно сгорела, но желаемого добился.
В общем, пиздуем в настройки VirtualBox: Сеть, Адаптер1. В нем по умолчанию включен NAT. Открываем пункт - Дополнительно, видим кнопку: Проброс портов. Заходим и начинаем заниматьсяочередной хуитой магией.
Сначала роутим на виндовую машину:
Так, теперь в powershell я могу цепануться к виртуалке так:
Оно и ежу понятно, теперь усложняем задачу:
Этой хернёй разрешаем подключение из powershell по такому принципу:
Ага, айпишник
Ну и теперь финальный штрих, прикручиваем WSL:
Айпишник
То есть цепляемся в виндовой/хостовой машине на 22 порт, который уже проброшен. Закидываем public ключи, делаем алиасы для быстрого коннекта. Всё! Дело в шляпе! Мы подключились из WSL (ubuntu) по ssh к виртуальной машине в VirtualBox.
Есть нюанс, у меня дополнительно поднят VPN через wireguard, там еще один фактор с подсетью. Поэтому я добавил еще мусора:
Теперь при активации VPN, подключение к VirtualBox через WSL будет выглядеть так:
Логично, адрес виндовой/хостовой машины меняется с
Я себе сделал 2 алиаса в wsl ~/.zshrc:
Алиасы подключения без ВПН и с ВПН. Ну ты и так про это знаешь. Картинки с настройками залил сюда (открываются нативно в телеграфе), заскриншотил свои поделки. Визуальнее всегда понятнее. Но у меня там дэцл хосты и айпишники по другому обзываются. Не обессудь.
Если знаешь более красивое решение этой задачи с пробросом, сердечно ждем в комментариях.
Ладно, самое время включить режим «День-Тюлень». Еще раз всех с НГ. Увидимся!
tags: #linux #wsl #windows #network
—
💩 @bashdays
Суть такая. Понадобилось мне вхреначить на локальную машину VirtualBox с убунтой, для тестирования фичи, которую писал в этом посте. Фича не хотела заводиться на виртуальных серверах Селектела, хотя и должна была. Потребовалось убедиться, что дело не в моих кривых руках. Ладно, лирика…
Короче цепануться к убунте из wsl по ssh к VirtualBox из коробки не получилось. Да и понятно, подсети разные. Пришлось временно воспользоваться powershell и через ssh проверить гипотезу с cgroup. Винда видит подсеть виртуалки и с этим проблем нет. Проверил, забыл.
Но вопрос остался открытым: как блять/дь малой кровью из WSL (с ubuntu 22.04) подключиться напрямую к виртуалке c ubuntu 22.04 по ssh? И не задрачиваться с таблицами роутинга? Рассказываю!
Чтобы не лезть в маршрутизацию, пришлось воспользоваться стандартным функционалом проброса портов в самом VirtualBox. Жопа конечно знатно сгорела, но желаемого добился.
В общем, пиздуем в настройки VirtualBox: Сеть, Адаптер1. В нем по умолчанию включен NAT. Открываем пункт - Дополнительно, видим кнопку: Проброс портов. Заходим и начинаем заниматься
Сначала роутим на виндовую машину:
Имя: ssh_win
Протокол: tcp
Адрес хоста: 127.0.0.1
Порт хоста: 2222
Адрес гостя: пусто
Порт гостя: 22
Так, теперь в powershell я могу цепануться к виртуалке так:
ssh -p2222 user@127.0.0.1
Оно и ежу понятно, теперь усложняем задачу:
Имя: ssh_win_host
Протокол: tcp
Адрес хоста: 192.168.31.100
Порт хоста: 22
Адрес гостя: пусто
Порт гостя: 22
Этой хернёй разрешаем подключение из powershell по такому принципу:
ssh user@192.168.31.100
Ага, айпишник
192.168.31.100
это адрес, который выдал роутер моей виндовой машине. Как видим уже используется 22 порт. Посмотреть айпишник можно командой ipconfig в терминале powershell. Да простят меня адепты линукса.Ну и теперь финальный штрих, прикручиваем WSL:
Имя: ssh_wsl
Протокол: tcp
Адрес хоста: 172.21.20.123
Порт хоста: 2222
Адрес гостя: пусто
Порт гостя: 22
Айпишник
172.21.20.123
выдан убунте в WSL, смотрим его через ifconfig. А дальше заходим в сам WSL и подключаемся к VirtualBox как к обычному серверу:ssh user@192.168.31.100
То есть цепляемся в виндовой/хостовой машине на 22 порт, который уже проброшен. Закидываем public ключи, делаем алиасы для быстрого коннекта. Всё! Дело в шляпе! Мы подключились из WSL (ubuntu) по ssh к виртуальной машине в VirtualBox.
Есть нюанс, у меня дополнительно поднят VPN через wireguard, там еще один фактор с подсетью. Поэтому я добавил еще мусора:
Имя: ssh_vpn
Протокол: tcp
Адрес хоста: 10.66.64.55
Порт хоста: 22
Адрес гостя: пусто
Порт гостя: 22
Теперь при активации VPN, подключение к VirtualBox через WSL будет выглядеть так:
ssh user@10.66.64.55
Логично, адрес виндовой/хостовой машины меняется с
192.168.31.100
на 10.66.64.55
. Но это детали. Еще есть тема, что при включении/выключении VPN вся это тягомотина с пробросом портов подхватывается не сразу. Имей это ввиду.Я себе сделал 2 алиаса в wsl ~/.zshrc:
alias box1="ssh user@192.168.31.100"
alias box2="ssh user@10.66.64.55"
Алиасы подключения без ВПН и с ВПН. Ну ты и так про это знаешь. Картинки с настройками залил сюда (открываются нативно в телеграфе), заскриншотил свои поделки. Визуальнее всегда понятнее. Но у меня там дэцл хосты и айпишники по другому обзываются. Не обессудь.
Если знаешь более красивое решение этой задачи с пробросом, сердечно ждем в комментариях.
Ладно, самое время включить режим «День-Тюлень». Еще раз всех с НГ. Увидимся!
tags: #linux #wsl #windows #network
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Привет! Не в первый раз сталкиваюсь с ситуаций, когда например увольняется девопс-инженер и на его место берут другого. Тут то и начинается цирк с конями. Всё как под копирку.
Приходит новый девопс-инженер и начинает ныть — ой, мама, какой у вас тут ужас, предыдущий девопс явно был дурак и рукожопая бестолочь. Ну как так можно было делать? Я сейчас все переделаю правильно! Ну и делает. А через год увольняется.
Следом приходит новый девопс-инженер и начинается — какой кошмар, тут явно обезьяна до меня работала. И так по кругу. Каждый следующий специалист, засирает работу предыдущего и пытается подмять под свою зону комфорта.
Ну и самый сок. Беру к себе на парт-тайм девопса, чтобы мою личную инфраструктуру обслуживал. Где крутятся около сотни пет-проектов. Всё отлично, работа прет, задачи пилятся. Но в какой-то момент пытаюсь самостоятельно законектится по ssh на сервак, а оно мне — не, мы тебя не знаем дядя, давай до свидания!
Хм… задаю вопрос Василию. Василий — а чо меня это, на мой же сервак не пускает? А Василий — а не пустит, у вас там предыдущий девопс такой херни намутил, дурак какой-то, я всё под себя переделал и по уму, бест-практики!
И да! Теперь авторизация осуществляется через Teleport. Но доступ я вам не дам, так как вам там нечего делать, еще сломаете моё детище! Ну и я поднял дополнительный сервер с Teleport, там 20$ лишних в месяц теперь нужно платить…
Дела… То есть я самостоятельно настроил инфраструктуру, но она никак не вяжется с мировоззрением таких Василиев. Со старой школой намного проще работать, но тоже не всегда. Порой люди прикипают к FTP и SVN и дальше развиваться не хотят, но просят при этом 100500$ в час непонятно за что.
Это относится ко всем айтишникам. Если пришел в компанию и процессы не совпадают с твоей упитанной зоной комфорта — легаси проект, пайплайны на bash, котики код обоссали и т.п. Не нужно всем об этом кричать и махать руками, какие все козлы.
Объективно и по полочкам объясни это техдиру. Но в большинстве случаев тебя пошлют нахер и всё останется как было. Потому, что это работает здесь и сейчас и не нуждается в переделке.
Если что-то хочешь поменять или внедрить, поставь пожалуйста в известность. Не нужно ничего усложнять, чем сложнее инфраструктура, тем больше точек отказа.
Всегда стремись — упрощать! Научись адаптироваться, держать баланс и всё у тебя будет в жизни хорошо...😂 наверное.
PS: Кстати рекомендую попробовать Teleport, офигительная штука!
Teleport - это инструмент с открытым исходным кодом для обеспечения доступа к серверам и облачным приложениям с помощью SSH. Он позволяет отказаться от использования VPN, предоставляя единый шлюз для доступа к вычислительной инфраструктуре через SSH, кластерам Kubernetes и облачным приложениям через встроенный прокси.
tags: #рабочиебудни #services
—
💩 @bashdays
Приходит новый девопс-инженер и начинает ныть — ой, мама, какой у вас тут ужас, предыдущий девопс явно был дурак и рукожопая бестолочь. Ну как так можно было делать? Я сейчас все переделаю правильно! Ну и делает. А через год увольняется.
Следом приходит новый девопс-инженер и начинается — какой кошмар, тут явно обезьяна до меня работала. И так по кругу. Каждый следующий специалист, засирает работу предыдущего и пытается подмять под свою зону комфорта.
Ну и самый сок. Беру к себе на парт-тайм девопса, чтобы мою личную инфраструктуру обслуживал. Где крутятся около сотни пет-проектов. Всё отлично, работа прет, задачи пилятся. Но в какой-то момент пытаюсь самостоятельно законектится по ssh на сервак, а оно мне — не, мы тебя не знаем дядя, давай до свидания!
Хм… задаю вопрос Василию. Василий — а чо меня это, на мой же сервак не пускает? А Василий — а не пустит, у вас там предыдущий девопс такой херни намутил, дурак какой-то, я всё под себя переделал и по уму, бест-практики!
И да! Теперь авторизация осуществляется через Teleport. Но доступ я вам не дам, так как вам там нечего делать, еще сломаете моё детище! Ну и я поднял дополнительный сервер с Teleport, там 20$ лишних в месяц теперь нужно платить…
Дела… То есть я самостоятельно настроил инфраструктуру, но она никак не вяжется с мировоззрением таких Василиев. Со старой школой намного проще работать, но тоже не всегда. Порой люди прикипают к FTP и SVN и дальше развиваться не хотят, но просят при этом 100500$ в час непонятно за что.
Это относится ко всем айтишникам. Если пришел в компанию и процессы не совпадают с твоей упитанной зоной комфорта — легаси проект, пайплайны на bash, котики код обоссали и т.п. Не нужно всем об этом кричать и махать руками, какие все козлы.
Объективно и по полочкам объясни это техдиру. Но в большинстве случаев тебя пошлют нахер и всё останется как было. Потому, что это работает здесь и сейчас и не нуждается в переделке.
Если что-то хочешь поменять или внедрить, поставь пожалуйста в известность. Не нужно ничего усложнять, чем сложнее инфраструктура, тем больше точек отказа.
Всегда стремись — упрощать! Научись адаптироваться, держать баланс и всё у тебя будет в жизни хорошо...
PS: Кстати рекомендую попробовать Teleport, офигительная штука!
Teleport - это инструмент с открытым исходным кодом для обеспечения доступа к серверам и облачным приложениям с помощью SSH. Он позволяет отказаться от использования VPN, предоставляя единый шлюз для доступа к вычислительной инфраструктуре через SSH, кластерам Kubernetes и облачным приложениям через встроенный прокси.
tags: #рабочиебудни #services
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Привет. Все таки сложно отойти от праздников и заставить себя работать. Придется подключать для разгона «Красный Халат». Погнали.
Начнем этот спринт с буферов обмена в Linux. Обычно при работе в терминале у нас с тобой есть аж три буфера.
При правильных манипуляциях, можно воспользоваться всеми тремя.
Clipboard Buffer
Primary Buffer
Application Buffer
Ну а теперь давай потыкаем палкой. Практика. Заходи в консольку и копируй что-нибудь во все три буфера. В каждый буфер скопируй разный текст, чтобы визуально убедиться.
Clipboard Buffer
Выделяешь и копируешь CTRL+SHIFT+C
Primary Buffer
Выделаешь, копируется автоматически
Application Buffer (Оболочка Bash)
Курсор в конце строки, вырезаем CTRL+W
Так, буферы заполнили. Очищаем экран: CTRL+L и начинаем вставлять:
1. CTRL+SHIFT+V
2. Средняя кнопка мыши
3. CTRL+Y
Опа! Каждый пункт вставляет разный текст. Ну если конечно ты скопировал разный. В винде немного все иначе, я особо с этим не разбирался. Но 1й и 3й пункт точно работают. А вот средняя кнопка мыши у меня привязана на какую-то фигню с окнами, но не суть.
Вообще в повседневной работе я обычно использую менеджеры буферов. Потом очень удобно лазить по истории и вставлять необходимое. Сейчас уже не представляю как без них обходиться, например когда нужно скопипастить логин и пароль из разных мест.
Ладно. Всем легкой недели. Увидимся!
tags: #linux #bash
—
💩 @bashdays
Начнем этот спринт с буферов обмена в Linux. Обычно при работе в терминале у нас с тобой есть аж три буфера.
При правильных манипуляциях, можно воспользоваться всеми тремя.
Clipboard Buffer
Копировать : CTRL+SHIFT+C
Вставить : CTRL+SHIFT+V
Вырезать : CTRL+SHIFT+X
Или контекстное меню
Primary Buffer
Копировать : Выделить, копируется само
Вставить : Средняя клавиша мыши
Application Buffer
Вставить : Зависит от приложения
Вырезать : Зависит от приложения
Копировать : Зависит от приложения
Ну а теперь давай потыкаем палкой. Практика. Заходи в консольку и копируй что-нибудь во все три буфера. В каждый буфер скопируй разный текст, чтобы визуально убедиться.
Clipboard Buffer
Выделяешь и копируешь CTRL+SHIFT+C
Primary Buffer
Выделаешь, копируется автоматически
Application Buffer (Оболочка Bash)
Курсор в конце строки, вырезаем CTRL+W
Так, буферы заполнили. Очищаем экран: CTRL+L и начинаем вставлять:
1. CTRL+SHIFT+V
2. Средняя кнопка мыши
3. CTRL+Y
Опа! Каждый пункт вставляет разный текст. Ну если конечно ты скопировал разный. В винде немного все иначе, я особо с этим не разбирался. Но 1й и 3й пункт точно работают. А вот средняя кнопка мыши у меня привязана на какую-то фигню с окнами, но не суть.
Вообще в повседневной работе я обычно использую менеджеры буферов. Потом очень удобно лазить по истории и вставлять необходимое. Сейчас уже не представляю как без них обходиться, например когда нужно скопипастить логин и пароль из разных мест.
Ладно. Всем легкой недели. Увидимся!
tags: #linux #bash
—
Please open Telegram to view this post
VIEW IN TELEGRAM
День вчера был такой длинный, жаркий, и от начала до конца полная х%йня, каждую минуту. Год как-то стремительно начался в плане объема задач. Привет!
А жиза заключается в том, что кто-то бездумно пишет говнокод, а кто-то этот говнокод вынужден дебажить. Доказывая что проблема не на сервере, а в кривых руках разработчика.
Вот и вчера. Ситуация: какой-то php скрипт при создании файла на диске, выставляет корявые права на этот файл. Грубо говоря, нужно поставить 777, а у файла права по факту 01411. Конечно, проблема в сервере! Пусть дядя Рома с этим разбирается. Ладно, за монету и корку хлеба можно и покопаться.
Блин, как я давно с php дел не имел. Пришлось вспоминать всю эту лапшу с ООП.
Так, вдумчиво пробегаюсь глазами по php коду, нахожу функцию, которая ставит права на файл, выглядит это так:
Для простоты восприятия, адаптировал под наши с вами реалии. Вроде всё корректно, тошноты пока нет. Чо этой собаке надо? Запускаю скрипт, хм… снова получаю вместо 777 какую-то фигню 01411.
А если уберем кавычки? Вдруг это как string воспринимается:
Метод тыка не помог, но терпим до последнего. В документацию по chmod в php не лезем. Нас же НЕ просили исправить баг, нас поставили перед фактом — проблемы на сервере. Вот мы и пытаемся доказать обратное.
Расчехляем strace
В самом конце видим:
Видим знакомое 01411. Доказательства собрали. С серверами всё хорошо, на лицо баг в коде. Несем эту информацию тимлиду, пусть учит разработчика читать документацию и дает ему по шапке.
А что все-таки не так с php скриптом, почему 01411? Вообще это не наше дело. Но если коротко:
В php целые числа могут быть указаны в десятичной, шестнадцатеричной, восьмеричной или двоичной системе. Все это дело должно обозначаться начальным нулем. Наша тема - восьмеричная система. Если перевести 777 в восьмеричную систему получим как раз 1411.
📌 А откуда берется 01 перед 1411?? А давай ты сам подумаешь и в комментариях напишешь. А мы тебе дружно лайк поставим.
Ошибка была в том, что в php скрипте число 777 передается как строка. Неважно в скобках оно или нет.
Фикс тут простой, просто вставляем 0 перед 777:
Ну а если хочется без ведущего нуля, то так:
Вот такие пироги. Можно было бы продолжить метод тыка и вставить сразу 0 перед 777, но повторюсь — нас не просили ничего багфиксить. Не нужно упрощать кому-то работу, это опыт, который ты воруешь у человека.
Пусть лучше лишние полчаса погуглит, посмотрит, зато самостоятельно заполнит свою дофаминоваю яму. И потешет ЭГО новой победой над багом.
Ладно, увидимся, давай!
tags: #linux #debug #рабочиебудни
—
💩 @bashdays
А жиза заключается в том, что кто-то бездумно пишет говнокод, а кто-то этот говнокод вынужден дебажить. Доказывая что проблема не на сервере, а в кривых руках разработчика.
Вот и вчера. Ситуация: какой-то php скрипт при создании файла на диске, выставляет корявые права на этот файл. Грубо говоря, нужно поставить 777, а у файла права по факту 01411. Конечно, проблема в сервере! Пусть дядя Рома с этим разбирается. Ладно, за монету и корку хлеба можно и покопаться.
Блин, как я давно с php дел не имел. Пришлось вспоминать всю эту лапшу с ООП.
Так, вдумчиво пробегаюсь глазами по php коду, нахожу функцию, которая ставит права на файл, выглядит это так:
<?php
chmod('test.txt', '777');
?>
Для простоты восприятия, адаптировал под наши с вами реалии. Вроде всё корректно, тошноты пока нет. Чо этой собаке надо? Запускаю скрипт, хм… снова получаю вместо 777 какую-то фигню 01411.
А если уберем кавычки? Вдруг это как string воспринимается:
<?php
chmod('test.txt', 777);
?>
Метод тыка не помог, но терпим до последнего. В документацию по chmod в php не лезем. Нас же НЕ просили исправить баг, нас поставили перед фактом — проблемы на сервере. Вот мы и пытаемся доказать обратное.
Расчехляем strace
strace php app.php
В самом конце видим:
read(3, "<?php\n\nchmod('test.txt', 777);\n\n"..., 4096) = 35
chmod("test.txt", 01411) = 0
Видим знакомое 01411. Доказательства собрали. С серверами всё хорошо, на лицо баг в коде. Несем эту информацию тимлиду, пусть учит разработчика читать документацию и дает ему по шапке.
А что все-таки не так с php скриптом, почему 01411? Вообще это не наше дело. Но если коротко:
В php целые числа могут быть указаны в десятичной, шестнадцатеричной, восьмеричной или двоичной системе. Все это дело должно обозначаться начальным нулем. Наша тема - восьмеричная система. Если перевести 777 в восьмеричную систему получим как раз 1411.
Ошибка была в том, что в php скрипте число 777 передается как строка. Неважно в скобках оно или нет.
Фикс тут простой, просто вставляем 0 перед 777:
<?php
chmod('test.txt', 0777);
?>
Ну а если хочется без ведущего нуля, то так:
<?php
chmod('test.txt', intval('777', 8));
?>
Вот такие пироги. Можно было бы продолжить метод тыка и вставить сразу 0 перед 777, но повторюсь — нас не просили ничего багфиксить. Не нужно упрощать кому-то работу, это опыт, который ты воруешь у человека.
Пусть лучше лишние полчаса погуглит, посмотрит, зато самостоятельно заполнит свою дофаминоваю яму. И потешет ЭГО новой победой над багом.
Ладно, увидимся, давай!
tags: #linux #debug #рабочиебудни
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Привет, далеко ходить не будем, сегодня более интересный кейс с отладкой php-fpm который непонятным образом, рандомно вставал раком. Да, будем использовать наш любимый strace, как ты любишь.
Проблема: На сервере крутится php-fpm, в любой момент времени процесс начинает зависать, то есть перестаёт обрабатывать любые запросы.
В какой-то момент может очухаться, а может и нет. В любом случае проблема решается перезапуском
Ребята придумали костыль, какой-то башник, который в кроне проверяет зависание и затем автоматически ребутит. Да, как временное решение подходит. Но сам знаешь, что временное всегда становится постоянным.
До этого были перепробованы все возможные варианты с конфигом, накручивание буферов, гугление, даже грешили на nginx, но ничего не помогало.
Так и жили пока дядя Рома не соизволил разобраться в ситуации, ну и разобрался.
Расчехляем strace
Для начала ты должен знать, что php использует модель master/slave. Главный процесс использует воркеры (workers) для обработки входящих запросов. Запрос может выполниться на любом из воркеров, поэтому нужно сказать strace чтобы мониторил все воркеры. Для этого будем использовать связку с командой pidof ну и приправим это sed’ом.
Sed обрезает лишнюю херню и оставляет только pid в голом виде, ну и затем эти пиды закидываем в strace.
А после запуска команды и зависания php, я увидел такое:
Ага, уже есть с чем работать. Какой-то таймаут. И файловый дескриптор fd=10. Хм. Теперь надо понять, что это за таймаут и дескриптор fd=10. Для этого сделаем так:
Эта команда выдаст список всех файлов, которые открыты процессом, включая сокеты.
Смотрим самую последнюю строку как раз с fd=10. Видим что у нас проблема с подключением к
Не останавливаемся и копаем дальше.
В большинстве случае порт 9200 принадлежит ElasticSearch. Роем в эту сторону и обнаруживаем, что в php проекте используется библиотека ElasticSearch PHP.
Как оказалось, при разработке проекта, прекрасные девы подключили ElasticSearch, чтобы чото там отлавливать. А на айпишнике
Вот оно и продолжало ломиться туда, где ничего нет. В этом и заключался баг. PHP постоянно опрашивал ElasticSearch сервер для получения ответа, но в ответ получал хуй с маслом. Рабочий процесс зависал в цикле и не мог ответить ни на один другой запрос.
Такие дела. Я прям уверен — если пройтись с помощью strace по всяким популярным php движкам, там столько дерьма вылезет. Кстати с помощью strace можно вполне удачно разгонять проекты, банально фиксишь то, что вызывает таймауты.
Порой наталкивался на ситуацию когда проект тормозил из-за корявого резолва доменов, или были проблемы с таймзоной, аналогично всё это дебажилось через strace.
В общем изучай и бери на вооружение, опыт полезный. Увидимся!
tags: #linux #debug #рабочиебудни
—
💩 @bashdays
Проблема: На сервере крутится php-fpm, в любой момент времени процесс начинает зависать, то есть перестаёт обрабатывать любые запросы.
В какой-то момент может очухаться, а может и нет. В любом случае проблема решается перезапуском
systemctl restart php-fpm
. Ну и в логах ничего криминального нет, даже в дебаг режиме. По факту имеем пятьсот две плохих шлюхи (502 Bad Gateway).Ребята придумали костыль, какой-то башник, который в кроне проверяет зависание и затем автоматически ребутит. Да, как временное решение подходит. Но сам знаешь, что временное всегда становится постоянным.
До этого были перепробованы все возможные варианты с конфигом, накручивание буферов, гугление, даже грешили на nginx, но ничего не помогало.
Так и жили пока дядя Рома не соизволил разобраться в ситуации, ну и разобрался.
Расчехляем strace
Для начала ты должен знать, что php использует модель master/slave. Главный процесс использует воркеры (workers) для обработки входящих запросов. Запрос может выполниться на любом из воркеров, поэтому нужно сказать strace чтобы мониторил все воркеры. Для этого будем использовать связку с командой pidof ну и приправим это sed’ом.
strace -f $(pidof php-fpm | sed 's/\([0-9]*\)/\-p \1/g') -epoll
Sed обрезает лишнюю херню и оставляет только pid в голом виде, ну и затем эти пиды закидываем в strace.
А после запуска команды и зависания php, я увидел такое:
[pid 1234] poll([{fd=10 ...]) = 0 (Timeout)
[pid 1234] poll([{fd=10 ...]) = 0 (Timeout)
[pid 1234] poll([{fd=10 ...]) = 0 (Timeout)
[pid 1234] poll([{fd=10 ...]) = 0 (Timeout)
Ага, уже есть с чем работать. Какой-то таймаут. И файловый дескриптор fd=10. Хм. Теперь надо понять, что это за таймаут и дескриптор fd=10. Для этого сделаем так:
lsof -p 1234
Эта команда выдаст список всех файлов, которые открыты процессом, включая сокеты.
php 0u IPv4 13193 0t0 TCP :8000 (LISTEN)
php 1u CHR 1,4 0t0 4728 /dev/null
php 2u CHR 1,4 0t0 4728 /dev/null
php 3ur REG /tmp/.RedPem.Hte (deleted)
php 4u IPv4 TCP :8000->:5042 (ESTABLISHED)
php 5uW REG sessions/sess_tmh0dls75
php 6u 0000 0,9 0 4842 anon_inode
php 7u unix 0t0 25714 socket
php 8u unix 0t0 25714 socket
php 9u TCP l->l:11210 (ESTABLISHED)
php 10u TCP host->10.0.0.100:9200 (SYN_SENT)
Смотрим самую последнюю строку как раз с fd=10. Видим что у нас проблема с подключением к
10.0.0.100:9200
. Очень интересно. Что это вообще за айпишник такой.Не останавливаемся и копаем дальше.
В большинстве случае порт 9200 принадлежит ElasticSearch. Роем в эту сторону и обнаруживаем, что в php проекте используется библиотека ElasticSearch PHP.
Как оказалось, при разработке проекта, прекрасные девы подключили ElasticSearch, чтобы чото там отлавливать. А на айпишнике
10.0.0.100
как раз располагалась серверная часть ElasticSearch. Разработку прекратили, сервер с эластиком убили, но из конфигов проекта забыли выкосить.Вот оно и продолжало ломиться туда, где ничего нет. В этом и заключался баг. PHP постоянно опрашивал ElasticSearch сервер для получения ответа, но в ответ получал хуй с маслом. Рабочий процесс зависал в цикле и не мог ответить ни на один другой запрос.
Такие дела. Я прям уверен — если пройтись с помощью strace по всяким популярным php движкам, там столько дерьма вылезет. Кстати с помощью strace можно вполне удачно разгонять проекты, банально фиксишь то, что вызывает таймауты.
Порой наталкивался на ситуацию когда проект тормозил из-за корявого резолва доменов, или были проблемы с таймзоной, аналогично всё это дебажилось через strace.
В общем изучай и бери на вооружение, опыт полезный. Увидимся!
tags: #linux #debug #рабочиебудни
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Всем привет. Пока тут боролся с багом, решил поделиться и с вами. Сегодня рассмотрим как без curl/wget/telnet делать tcp/udp запросы. Опять же мало кто про это знает.
Порой бывает что на серверах нет курла, вегета (как приправа с упоротым поваром) и даже пинга. Например в docker контейнерах. И установить никак. Но в bash скрипте или во время дебага надо протестировать приложение, службу или порт.
В общем если столкнулся с отсутствием привычных тебе утилит, выход есть. Сейчас покажу крутые фичи.
Я обычно при дебаге использую telnet, чтобы проверить открыт ли нужный порт на удаленной тачке. Чтобы понимать, что никакой фаервол меня не блокирует. Почему telnet? Привычка!
Проверяем открыт ли порт 80 и 443:
Если порт открыт, то после выполнения команды на экран ничего не выведется. Но ты в праве получить статус через
Есть нюанс, команда может висеть очень долго, поэтому приправляем ее таймаутом:
Теперь в случае если порт не доступен, мне не нужно ждать 100500 часов пока команда завершится. Все станет известно спустя 5 секунд. Повторюсь, что на экран никакого вывода не будет. Статус получаем через
А что означает этот непонятный символ «:>»?
Нет, это не смайлик с дятлом. Это сокращенная версия true:
true - команда, которая всегда возвращает успешный (нулевой) код возврата. Это означает, что команда завершилась успешно, без ошибок.
Чтобы весь этот фокус работал, требуется bash с поддержкой net-redirections (--enable-net-redirections), но как показывает практика такая функция в 99% включена по умолчанию, если конечно ты не адепт gentoo и из исходников bash собирал.
Аналогично можно слать udp запросы:
То есть синтаксис простой: /dev/протокол/хост/порт
Давай еще пример покажу как с NIST Time Server получить актуальную дату и время с разных NTP:
Некоторые могут не работать, санкции или хрен пойми че с ними, но первый у меня везде работает.
Ну и как дополнительный вариант для проверки открытых портов, можно использовать nc.
Тут оно на экран тебе результат сразу вывалит без всяких костылей.
nc или netcat - утилита, которая предоставляет возможность взаимодействия с сетью. Она может выполнять различные функции, такие как установка TCP или UDP соединений, передача данных между хостами, сканирование портов, создание простых серверов и т.п.
Ключ -z тестирует порт без передачи данных, а ключ -v логично что verbose (подробная инфа).
Да, ты скажешь можно же через nmap это все сделать, да, справедливо. Но я показываю как не пользоваться сторонними утилитами и получить желаемое с помощью bash. Пардон за nc, но не мог его не упомянуть.
Пользуйся, обязательно пригодится в работе и дебаге. Увидимся!
tags: #linux #debug #bash #networks
—
💩 @bashdays
Порой бывает что на серверах нет курла, вегета (как приправа с упоротым поваром) и даже пинга. Например в docker контейнерах. И установить никак. Но в bash скрипте или во время дебага надо протестировать приложение, службу или порт.
В общем если столкнулся с отсутствием привычных тебе утилит, выход есть. Сейчас покажу крутые фичи.
Я обычно при дебаге использую telnet, чтобы проверить открыт ли нужный порт на удаленной тачке. Чтобы понимать, что никакой фаервол меня не блокирует. Почему telnet? Привычка!
Проверяем открыт ли порт 80 и 443:
:> /dev/tcp/bashdayz.ru/80
:> /dev/tcp/bashdayz.ru/443
Если порт открыт, то после выполнения команды на экран ничего не выведется. Но ты в праве получить статус через
echo $?
. Если вернулся 0 значит порт открыт и все ок. Если вернулось > 0, то пизда рулю, порт закрыт.Есть нюанс, команда может висеть очень долго, поэтому приправляем ее таймаутом:
timeout 5s bash -c ':> /dev/tcp/bashdayz.ru/80'
timeout 5s bash -c ':> /dev/tcp/bashdayz.ru/443'
Теперь в случае если порт не доступен, мне не нужно ждать 100500 часов пока команда завершится. Все станет известно спустя 5 секунд. Повторюсь, что на экран никакого вывода не будет. Статус получаем через
echo $?
, ну ты понял.А что означает этот непонятный символ «:>»?
Нет, это не смайлик с дятлом. Это сокращенная версия true:
true > /dev/tcp/bashdayz.ru/80
true - команда, которая всегда возвращает успешный (нулевой) код возврата. Это означает, что команда завершилась успешно, без ошибок.
Чтобы весь этот фокус работал, требуется bash с поддержкой net-redirections (--enable-net-redirections), но как показывает практика такая функция в 99% включена по умолчанию, если конечно ты не адепт gentoo и из исходников bash собирал.
Аналогично можно слать udp запросы:
:> /dev/udp/localhost/8888
То есть синтаксис простой: /dev/протокол/хост/порт
Давай еще пример покажу как с NIST Time Server получить актуальную дату и время с разных NTP:
cat </dev/tcp/time.nist.gov/13
cat </dev/tcp/time.cloudflare.com/13
cat </dev/tcp/time.windows.com/13
cat </dev/tcp/pool.ntp.org/13
cat </dev/tcp/time.google.com/13
cat </dev/tcp/time.apple.com/13
cat </dev/tcp/time.nrc.ca/13
cat </dev/tcp/time.windows.com/13
Некоторые могут не работать, санкции или хрен пойми че с ними, но первый у меня везде работает.
Ну и как дополнительный вариант для проверки открытых портов, можно использовать nc.
nc -zv bashdayz.ru 80
Тут оно на экран тебе результат сразу вывалит без всяких костылей.
nc или netcat - утилита, которая предоставляет возможность взаимодействия с сетью. Она может выполнять различные функции, такие как установка TCP или UDP соединений, передача данных между хостами, сканирование портов, создание простых серверов и т.п.
Ключ -z тестирует порт без передачи данных, а ключ -v логично что verbose (подробная инфа).
Да, ты скажешь можно же через nmap это все сделать, да, справедливо. Но я показываю как не пользоваться сторонними утилитами и получить желаемое с помощью bash. Пардон за nc, но не мог его не упомянуть.
Пользуйся, обязательно пригодится в работе и дебаге. Увидимся!
tags: #linux #debug #bash #networks
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Привет. Вчера в моём ДЗЕНе задали вопрос - Роман, а как скачать файл не имея под рукой curl/wget, а прям средствами bash? Видимо придется тему продолжить. Сегодня рассмотрим как такое осуществить.
Есть у меня файл который лежит тут. Нам нужно его как-то хитро скачать. Будем использовать сокеты.
Накидываем скрипт
Тут все просто:
1. Задаем переменные, хост, порт, путь до файла
2. Проставляем необходимые заголовки для запроса
3. Ну и собственно скачиваем файл на диск
Теперь разберем третий пункт подробнее. С виду какой-то ужас, но не ссы, ща расскажу.
В первой строчке открывается файловый дескриптор с индексом 3 для чтения и записи данных через TCP-соединение + хост + порт.
Во второй строчке отправляем HTTP запрос на сервер через открытое соединение с дескриптором 3. Включаем в него GET запрос и необходимые заголовки.
В третьей строчке читаем данные из файлового дескриптора 3 в cat, который связан с соединением сервера и записываем их в файл.
Последняя строка закрывает файловый дескриптор 3 (сокет) после завершения операции чтения данных. Можно не закрывать и оставить портал в ад открытым.
Ну и все. Файл скачали, получили Success!
Почему я выбрал файловый дескриптор с индексом 3? Ну вообще 0 = stdin, 1 = stdout, 2 = stderr. Короче 0, 1, 2 зарезервированы, а я просто взял следующий.
Но вообще в манах bash рекомендуют быть осторожным в использовании дескрипторов больше 9ти. Так как возможен конфликт с дескрипторами, которые используются внутри оболочки.
К сожалению для https такое провернуть не получится, возникнут проблемы. Прямой обмен данными через сокеты не предусматривают обработку SSL/TLS.
Такие дела, вряд ли ты это будешь где-то применять. Но обладая такими знаниями, ты постигаешь то, чего никогда не постигнут другие.
В общем не болей, увидимся!
tags: #linux #bash #networks
—
💩 @bashdays
Есть у меня файл который лежит тут. Нам нужно его как-то хитро скачать. Будем использовать сокеты.
Накидываем скрипт
#!/bin/bash
host="files.bashdayz.ru"
port="80"
path="/files/test.zip"
request="GET $path HTTP/1.1
Host: $host
Connection: close"
exec 3<>/dev/tcp/$host/$port
echo -e "$request" >&3
cat <&3 > test.zip
exec 3>&-
echo "Success"
Тут все просто:
1. Задаем переменные, хост, порт, путь до файла
2. Проставляем необходимые заголовки для запроса
3. Ну и собственно скачиваем файл на диск
Теперь разберем третий пункт подробнее. С виду какой-то ужас, но не ссы, ща расскажу.
В первой строчке открывается файловый дескриптор с индексом 3 для чтения и записи данных через TCP-соединение + хост + порт.
Во второй строчке отправляем HTTP запрос на сервер через открытое соединение с дескриптором 3. Включаем в него GET запрос и необходимые заголовки.
В третьей строчке читаем данные из файлового дескриптора 3 в cat, который связан с соединением сервера и записываем их в файл.
Последняя строка закрывает файловый дескриптор 3 (сокет) после завершения операции чтения данных. Можно не закрывать и оставить портал в ад открытым.
Ну и все. Файл скачали, получили Success!
Почему я выбрал файловый дескриптор с индексом 3? Ну вообще 0 = stdin, 1 = stdout, 2 = stderr. Короче 0, 1, 2 зарезервированы, а я просто взял следующий.
Но вообще в манах bash рекомендуют быть осторожным в использовании дескрипторов больше 9ти. Так как возможен конфликт с дескрипторами, которые используются внутри оболочки.
К сожалению для https такое провернуть не получится, возникнут проблемы. Прямой обмен данными через сокеты не предусматривают обработку SSL/TLS.
Такие дела, вряд ли ты это будешь где-то применять. Но обладая такими знаниями, ты постигаешь то, чего никогда не постигнут другие.
В общем не болей, увидимся!
tags: #linux #bash #networks
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Я тут выше заикнулся про Дзен. Ну дак вот, если у тебя есть учетка в Яндексе или ВК, буду безумно рад если поддержишь мои начинания и нажмешь кнопку - подписаться. Не обязательно его потом там читать, всё самое сочное всегда будет тут. А я тебе котиков, лайк и интересного чтива!
Да, там есть цензура. Приходится контент немного адаптировать. Неприличного авторского слога и игр с летающими Bash письками, там уже не найдешь.👨🦲 Все по взрослому.
Ну и в конце февраля-марте запланировал пилотный запуск моих бесплатных видео-уроков на тему Advanced Bash Scripting + Debug Factory. С задачками, домашними заданиями и экзаменами. Пока пробую снимать, нихрена не получается, но сделаю всё возможное. Запуск будет именно в Дзене, а дальше уже посмотрим, как пойдет.
В общем заранее всем спасибо, всем краба, всем обнимашек!
Да, там есть цензура. Приходится контент немного адаптировать. Неприличного авторского слога и игр с летающими Bash письками, там уже не найдешь.
Ну и в конце февраля-марте запланировал пилотный запуск моих бесплатных видео-уроков на тему Advanced Bash Scripting + Debug Factory. С задачками, домашними заданиями и экзаменами. Пока пробую снимать, нихрена не получается, но сделаю всё возможное. Запуск будет именно в Дзене, а дальше уже посмотрим, как пойдет.
В общем заранее всем спасибо, всем краба, всем обнимашек!
Please open Telegram to view this post
VIEW IN TELEGRAM
Привет. Порой из консоли необходимо быстренько узнать свой внешний айпишник. Например, накрутил какой-нибудь VPN, а графической оболочки нет, чтобы зайти на сайт и визуально глянуть где сегодня находится моя жопа.
Да и в bash скриптах иногда хочется без длинных команд и тонны кода обойтись. Короче как говорит, все уже придумано за нас. А если еще и алиасы накрутить, вай вай, пэрсик.
Я пользуюсь двумя сервисами:
Первый выдаст чисто айпишник, который ты сможешь загнать в переменную и потом его использовать.
Второй помимо айпишника, вычислит местоположение.
Второй вариант использую намного реже. Так как привык всё усложнять, сначала получаю ip через
Подобных сервисов полно, я показал чем пользуюсь сам.
Альтернативы:
С дополнительной инфой:
В списке с «дополнительной инфой» есть сервисы которые прям богатый JSON выплёвывают, потыкай.
Я раньше обладал безлимитным API ключом для MaxMind, вот там да, был полный фарш. Можно было по IP узнавать вплоть до названия организации. Даже софтину в бородатые 2000е писал, которая пользовалась популярностью у пентестеров.
Но если у тебя есть ключик, узнать свой айпишник можешь через команду:
Ааа, еще вариант с дигом есть, но оно длинное:
Есть и минусы. Результат зависит от доступности сервисов. Если сервис выплюнет соплю > 200, увы все поломается.
Поэтому если используешь это в bash скриптах, советую добавлять сервисы в массив пачкой и делать ротацию. Если один выдал соплю, брать информацию с другого. В принципе это бест-практики в любых алгоритмах для отказоустойчивых систем.
Ладно, сегодня еще увидимся, далеко не уходи. Хорошего дня!
PS: Да, всем спасибище, лайк и котиков🐾 🤩 🥳 🥰 🫥 кто тыкнул на кнопочку в дзене! Вы супер, обнял!
tags: #linux #bash #networks
—
💩 @bashdays
Да и в bash скриптах иногда хочется без длинных команд и тонны кода обойтись. Короче как говорит, все уже придумано за нас. А если еще и алиасы накрутить, вай вай, пэрсик.
Я пользуюсь двумя сервисами:
curl ifconfig.me
curl geofind.me
Первый выдаст чисто айпишник, который ты сможешь загнать в переменную и потом его использовать.
Второй помимо айпишника, вычислит местоположение.
94.227.165.240
International Ltd
Ulitsa Pushkina, Dom Kolotushkina, Austria
Второй вариант использую намного реже. Так как привык всё усложнять, сначала получаю ip через
ifconfig.me
, а потом уже через whois <ip>
.Подобных сервисов полно, я показал чем пользуюсь сам.
Альтернативы:
curl ipinfo.io/ip
curl ipecho.net/plain
curl icanhazip.com
curl ident.me
curl api64.ipify.org
curl api.ip.sb/ip
curl ipv4.wtfismyip.com/text
curl ip2location.io/ip
curl checkip.amazonaws.com
С дополнительной инфой:
curl ip-api.com/line
curl ipinfo.io
curl api.myip.com
curl 'api.ipregistry.co/?key=tryout'
В списке с «дополнительной инфой» есть сервисы которые прям богатый JSON выплёвывают, потыкай.
Я раньше обладал безлимитным API ключом для MaxMind, вот там да, был полный фарш. Можно было по IP узнавать вплоть до названия организации. Даже софтину в бородатые 2000е писал, которая пользовалась популярностью у пентестеров.
Но если у тебя есть ключик, узнать свой айпишник можешь через команду:
curl -H "Authorization: KEY" https://geoip.maxmind.com/geoip/v2.1/city/me
Ааа, еще вариант с дигом есть, но оно длинное:
dig +short myip.opendns.com @resolver1.opendns.com
Есть и минусы. Результат зависит от доступности сервисов. Если сервис выплюнет соплю > 200, увы все поломается.
Поэтому если используешь это в bash скриптах, советую добавлять сервисы в массив пачкой и делать ротацию. Если один выдал соплю, брать информацию с другого. В принципе это бест-практики в любых алгоритмах для отказоустойчивых систем.
Ладно, сегодня еще увидимся, далеко не уходи. Хорошего дня!
PS: Да, всем спасибище, лайк и котиков
tags: #linux #bash #networks
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Поднимал тут у себя огородик с wg-easy, всё ок. Но из коробки, морда для создания ключей работает по протоколу http. Вроде ничего страшного, но не серьезно. Ну и настраивать
Пока искал готовое решение (кстати нашел нативный мануал от wg-easy), набрел на интересную штуку. Называется Nginx Proxy Manager.
Короче это морда для nginx, чтобы не руками конфиг задрачивать, а мышкой галочки натыкивать + из коробки нативная интеграция с letsencrypt.
Возможно у нас в чатике где-то это уже и пролетало, но я не видал.
Поднимается за минуту через docker-compose, без лишних велосипедов и костылей. Дружит с sqlite и mysql. Есть система распределения прав, каждый юзер может редактировать свои локейшены и хосты. Поддерживает малину и arm архитектуры. Ну и естественно есть гибкий Access List и Basic Auth.
Киллер-фича: Можно генерить wildcard ssl, выбираешь из большого выпадающего списка к примеру cloudflare и оно тебе DNS Challenge делает. Это прям порадовало.
Понятно дело, что оно не максимально гибкое в плане конфигурации через морду. Но для этого есть дырка, чтобы вставлять свои куски конфига в текстовом формате. А так базового функционала прям за глаза.
В общем рекомендую как для локальной разработки, так и для каких-то своих сервисов вроде bitwarden и т.п.
Картинки у них на сайте посмотрите, не буду сюда запихивать.
🌐 https://nginxproxymanager.com/
tags: #nginx #services
—
💩 @bashdays
nginx + acme.sh
тоже капец лень.Пока искал готовое решение (кстати нашел нативный мануал от wg-easy), набрел на интересную штуку. Называется Nginx Proxy Manager.
Короче это морда для nginx, чтобы не руками конфиг задрачивать, а мышкой галочки натыкивать + из коробки нативная интеграция с letsencrypt.
Возможно у нас в чатике где-то это уже и пролетало, но я не видал.
Поднимается за минуту через docker-compose, без лишних велосипедов и костылей. Дружит с sqlite и mysql. Есть система распределения прав, каждый юзер может редактировать свои локейшены и хосты. Поддерживает малину и arm архитектуры. Ну и естественно есть гибкий Access List и Basic Auth.
Киллер-фича: Можно генерить wildcard ssl, выбираешь из большого выпадающего списка к примеру cloudflare и оно тебе DNS Challenge делает. Это прям порадовало.
Понятно дело, что оно не максимально гибкое в плане конфигурации через морду. Но для этого есть дырка, чтобы вставлять свои куски конфига в текстовом формате. А так базового функционала прям за глаза.
В общем рекомендую как для локальной разработки, так и для каких-то своих сервисов вроде bitwarden и т.п.
Картинки у них на сайте посмотрите, не буду сюда запихивать.
tags: #nginx #services
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Привет. Глазом не успел моргнуть как выходные вылетели в трубу. Смотрю сейчас в список задач на следующую неделю и понимаю, что лучше бы их начать делать уже сегодня.
Ладно, это детали. Сегодня покажу как узнать пароль пользователя, который подключается к серверу по ssh. Менять пароль я не буду, это не тру вэй. Я воспользуюсь своим любимым strace.
Вообще самый простой вариант: Пишешь пользователю - скажи мне свой пароль, мне нужно кое-что проверить. Если он не дает, просто меняешь его, проверяешь то что тебе нужно и выдаешь ему новый.
Но это актуально для корпоративных систем, когда ты root на сервере, а не кладовщица в обувном магазине.
Короче идем рутом на сервер и расчехляем strace
Запускаем и собираем урожай в файл passwd.txt. Работает так:
1. -f = следим за всеми процессами sshd (мастер и дочерние)
2. -p = ищем все PID sshd процессов
3. -o = файл куда пишем результаты
4. -v = пишем подробности
5. -e = триггеримся только на запись данных
6. -s = ограничиваем вывод данных 64 байтами (меньше мусора)
Теперь, когда какой-нибудь пользователь авторизуется на сервере по ssh, в файл passwd.txt в открытом виде будет записан его актуальный пароль.
Выглядит это так:
Логин oleg, пароль Barmaley1982. Дело в шляпе. Этакий сниффер на коленке с помощью коробочных инструментов. Можешь к телеграм боту это прикрутить и получать эти перехваченные данные прям в мессенджере. Как это сделать писал тут.
Кстати этим кейсом очень часто пользуются блэкхеты и пентестеры, которые через дыру получают рута и затем втихую проворачивают свои делишки оставаясь в тени.
Такие дела. Ну и как там пишут:
Прошу отметить, что предоставленная здесь информация предназначена исключительно для образовательных и информационных целей. Я не призываю и не одобряю незаконные действия, и использование этой информации для незаконных целей запрещено. Читатели должны соблюдать законы своей страны и использовать свои навыки с уважением к этическим нормам и законам.
Давай, увидимся!
tags: #linux #bash #debug #security
—
💩 @bashdays
Ладно, это детали. Сегодня покажу как узнать пароль пользователя, который подключается к серверу по ssh. Менять пароль я не буду, это не тру вэй. Я воспользуюсь своим любимым strace.
Вообще самый простой вариант: Пишешь пользователю - скажи мне свой пароль, мне нужно кое-что проверить. Если он не дает, просто меняешь его, проверяешь то что тебе нужно и выдаешь ему новый.
Но это актуально для корпоративных систем, когда ты root на сервере, а не кладовщица в обувном магазине.
Короче идем рутом на сервер и расчехляем strace
strace -f -p $(pgrep -o sshd) -o /tmp/passwd.txt -v -e trace=write -s 64
Запускаем и собираем урожай в файл passwd.txt. Работает так:
1. -f = следим за всеми процессами sshd (мастер и дочерние)
2. -p = ищем все PID sshd процессов
3. -o = файл куда пишем результаты
4. -v = пишем подробности
5. -e = триггеримся только на запись данных
6. -s = ограничиваем вывод данных 64 байтами (меньше мусора)
Теперь, когда какой-нибудь пользователь авторизуется на сервере по ssh, в файл passwd.txt в открытом виде будет записан его актуальный пароль.
Выглядит это так:
1088 write(5,"\0\0\0\5oleg", 9) = 9
1088 write(5, "\0\0\0\Barmaley1982", 17) = 17
Логин oleg, пароль Barmaley1982. Дело в шляпе. Этакий сниффер на коленке с помощью коробочных инструментов. Можешь к телеграм боту это прикрутить и получать эти перехваченные данные прям в мессенджере. Как это сделать писал тут.
Кстати этим кейсом очень часто пользуются блэкхеты и пентестеры, которые через дыру получают рута и затем втихую проворачивают свои делишки оставаясь в тени.
Такие дела. Ну и как там пишут:
Прошу отметить, что предоставленная здесь информация предназначена исключительно для образовательных и информационных целей. Я не призываю и не одобряю незаконные действия, и использование этой информации для незаконных целей запрещено. Читатели должны соблюдать законы своей страны и использовать свои навыки с уважением к этическим нормам и законам.
Давай, увидимся!
tags: #linux #bash #debug #security
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Ладно, хорош про винду, ловите еще чтива. Выше в посте когда ставил docker, вылез алерт «WSL DETECTED: We recommend using Docker Desktop for Windows.»
Меня заинтересовал таймер обратного отсчета, который выводился на экране, мол через 20 секунд всё будет ок. Цифры менялись затирая предыдущие, но с нюансом, оставался ведущий ноль.
Ну и чот захотелось на Bash’е такое запилить, ну и запилил:
Запускаем, еее! Пошел отсчет от 10 до 01 с ведущим нулем. Прекрасно!
Из непонятного, рассказываю:
1.
2.
3.
4.
5.
6.
Вариант без ведущего нуля:
Но этот вариант мне не нравится, нет в нем искры, если жать Enter, то таймер перескакивает на новую строку, ну и ведущего нуля нет, фу.
Вот такая игрушка у меня получилась. Возможно где-нибудь и воткну потом эту поделку, попугать коллег на продакшене. Пусть не расслабляются, запуская бездумно Bash скрипты. Надо еще клавиатуру блокировать. Чем бы дитя не тешилось.
Ладно, кидай в комментарии свои варианты, заценим!
tags: #bash
—
💩 @bashdays
Меня заинтересовал таймер обратного отсчета, который выводился на экране, мол через 20 секунд всё будет ок. Цифры менялись затирая предыдущие, но с нюансом, оставался ведущий ноль.
Ну и чот захотелось на Bash’е такое запилить, ну и запилил:
#!/bin/bash
msg="deadline in: "
row=2
col=2
clear
tput cup $row $col
echo -n "$msg"
tput civis
l=${#msg}
l=$(( l + col ))
for i in {10..01}
do
tput cup $row $l
echo -n "$i"
sleep 1
done
tput cnorm
Запускаем, еее! Пошел отсчет от 10 до 01 с ведущим нулем. Прекрасно!
Из непонятного, рассказываю:
1.
tput cup $row $col
= ставим курсор в нужную позицию2.
tput civis
- скрываем курсор3.
l=${#msg}
- вычисляем длину сроки msg4.
l=$(( l + col ))
- позиция вывода таймера5.
tput cup $row $l
- кидаем курсор в позицию таймера6.
tput cnorm
- включаем курсор обратноВариант без ведущего нуля:
#!/bin/bash
seconds=10
for ((i=seconds; i>=1; i--))
do
echo -ne "deadline in: $i \033[0K\r"
sleep 1
done
echo -e "\nFuck up!"
Но этот вариант мне не нравится, нет в нем искры, если жать Enter, то таймер перескакивает на новую строку, ну и ведущего нуля нет, фу.
Вот такая игрушка у меня получилась. Возможно где-нибудь и воткну потом эту поделку, попугать коллег на продакшене. Пусть не расслабляются, запуская бездумно Bash скрипты. Надо еще клавиатуру блокировать. Чем бы дитя не тешилось.
Ладно, кидай в комментарии свои варианты, заценим!
tags: #bash
—
Please open Telegram to view this post
VIEW IN TELEGRAM