Порой бывает необходимо прям из bash-скрипта добавить/удалить какое-нибудь задание в cron.
ㅤ
Ниже пара функций, которые позволяют это сделать. И если с добавлением вообще проблем не возникает
ИЛИ:
Можно конечно и так, но вдруг одинаковых заданий может быть несколько и их нужно будет как-то различать.
Все очень просто. Просто добавьводы комментарий. Для каждой задачи задаешь разные комменты, и тогда без проблем можно удалять задачи.
Если запустить программу, увидите что-то типа:
Видно, что программа добавила задание, вывела последние три строки crontab'a, потом разделитель.
Затем задание было удалено. Это видно по последним трем строкам.
В комментариях задания пробелы заменяются на "_" для упрощения работы c sed.
Ну, и на всякий пожарный напомню, что для корректной работы с cron нужно задать переменную PATH либо в crontab, либо в скрипте.
tags: #bash #linux © by Tagd Tagd
—
🔔 @bashdays➡️ @gitgate
ㅤ
Ниже пара функций, которые позволяют это сделать. И если с добавлением вообще проблем не возникает
{ crontab -l; echo '#@reboot echo BashDays >/tmp/BashDays.txt' ; }| crontab -ИЛИ:
{ crontab -l; echo '#*/10 * * * 5 echo BashDays >>/tmp/BashDays.txt' ; }| crontab -Можно конечно и так, но вдруг одинаковых заданий может быть несколько и их нужно будет как-то различать.
Все очень просто. Просто добавь
#!/bin/bash
function ADD_CRON_TASK(){
local CRON_TASK=${1:-'#'}
local COMMENT=${2:-$(date +%s)}
COMMENT=${COMMENT// /_}
{ crontab -l 2>/dev/null; echo "$CRON_TASK #$COMMENT"; }| crontab -
}
function REMOVE_CRON_TASK(){
if [[ $# -eq 0 ]];then
echo No comment to remove cron task >&2
return
fi
COMMENT=${1// /_}
crontab -l 2>/dev/null|sed '/#'$COMMENT'$/d'|crontab -
}
CRON_TASK='#@reboot reboot'
COMMENT="My litle joke"
ADD_CRON_TASK "$CRON_TASK" "$COMMENT"
crontab -l|tail -3
echo '###################################################'
REMOVE_CRON_TASK "$COMMENT"
crontab -l |tail -3
Если запустить программу, увидите что-то типа:
#
# m h dom mon dow command
# @reboot reboot #My_litle_joke
#############################
# For more information see the
#
# m h dom mon dow command
Видно, что программа добавила задание, вывела последние три строки crontab'a, потом разделитель.
Затем задание было удалено. Это видно по последним трем строкам.
В комментариях задания пробелы заменяются на "_" для упрощения работы c sed.
Ну, и на всякий пожарный напомню, что для корректной работы с cron нужно задать переменную PATH либо в crontab, либо в скрипте.
tags: #bash #linux © by Tagd Tagd
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Привет. Почему-то я думал что сегодня пятница, мда…
ㅤ
Ладно, поехали. Ты всяко встречался с такой ебаной ошибкой при подключении к серверу по ssh:
А дело то в том, что я склонировал сервак и перекинул на него старый айпишник. Соответственно всякие фингерпринты изменились.
Чо за ошибка и что нужно делать?
Файл
Когда ты впервые подключаешься к новому удалённому серверу по ssh, клиент ssh сохраняет его ключ в этот файл.
В дальнейшем, при каждом подключении к этому серверу, ssh-клиент сверяет ключ сервера с тем, что хранится в файле
Это помогает удостовериться, что ты подключаешься к правильному серверу, а не к какому-то левому.
Но нам то бояться нечего, поэтому забиваем хуй и избавляемся от этого раз и навсегда.
Открываем свой локальный
Всё! Теперь даже если случится «мужик посередине», ты успешно подключишься к серверу без всяких ошибок.
Если нужно отключить защиту для конкретного хоста, знак звездочки заменяем на нужный тебе ip или домен.
Ну а если лень править конфиги, можешь прям из командной строки передавать эти ключи:
Либо сделать алиас:
А если всё делать по уму и остерегаться «мужика посередине»:
1. Наводим справки, что случилось с сервером у админов
2. Если все ок, делаем так:
После этой команды, файл
Чо тебе еще рассказать? Особо больше нечего по этой теме.
А если тебе есть что добавить — велком в комментарии.
Давай краба! Завтра надеюсь точно пятница…
tags: #linux
—
🔔 @bashdays➡️ @gitgate
ㅤ
Ладно, поехали. Ты всяко встречался с такой ебаной ошибкой при подключении к серверу по ssh:
WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
Please contact your system administrator. Add correct host key in /home/your_user/.ssh/known_hosts to get rid of this message. Offending RSA key in /home/your_user/.ssh/known_hosts:xx
У меня коллеги обычно сразу прибегают и начинают подозревать неладное — ааа спасите, сервер взломали, не могу подключиться! Паникёры блядь…
А дело то в том, что я склонировал сервак и перекинул на него старый айпишник. Соответственно всякие фингерпринты изменились.
Чо за ошибка и что нужно делать?
Файл
~/.ssh/known_hosts используется для хранения списка хостов, с которыми ты ранее взаимодействовал по ssh.Когда ты впервые подключаешься к новому удалённому серверу по ssh, клиент ssh сохраняет его ключ в этот файл.
В дальнейшем, при каждом подключении к этому серверу, ssh-клиент сверяет ключ сервера с тем, что хранится в файле
known_hosts.Это помогает удостовериться, что ты подключаешься к правильному серверу, а не к какому-то левому.
Короче вся эта чача сделана для безопасности, чтобы избежать анальной атаки — «мужик посередине».
Но нам то бояться нечего, поэтому забиваем хуй и избавляемся от этого раз и навсегда.
Открываем свой локальный
/etc/ssh/ssh_config или ~/.ssh/config и херачим в него такое:Host *
StrictHostKeyChecking no
UserKnownHostsFile=/dev/null
Всё! Теперь даже если случится «мужик посередине», ты успешно подключишься к серверу без всяких ошибок.
Если нужно отключить защиту для конкретного хоста, знак звездочки заменяем на нужный тебе ip или домен.
Ну а если лень править конфиги, можешь прям из командной строки передавать эти ключи:
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null user@hostname
Либо сделать алиас:
alias ssh = "ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null"
А если всё делать по уму и остерегаться «мужика посередине»:
1. Наводим справки, что случилось с сервером у админов
2. Если все ок, делаем так:
ssh-keygen -R <hostname_or_ip>После этой команды, файл
known_hosts подчиститься и ошибка отправится в пешее эротическое.Чо тебе еще рассказать? Особо больше нечего по этой теме.
А если тебе есть что добавить — велком в комментарии.
Давай краба! Завтра надеюсь точно пятница…
tags: #linux
—
Please open Telegram to view this post
VIEW IN TELEGRAM
13 71 21
У меня возникла проблема. Мне нужно переконфигурировать сеть на железном сервере, который находится в другом городе. И командировка туда займет пару дней.
ㅤ
Проблема усугубляется тем, что на сервере нет
Надеюсь никому здесь не нужно объяснять, чем это грозит. В общем, прикинул яхрен к заднице, что можно сделать и написал скрипт.
Скрипт поможет в случае чего восстановить конфигурацию, в случае моего косяка.
Алгоритм работы следующий:
Пользоваться этой цацой просто:
По ssh мы войдем в любом случае. Или быстро (если сервак сконфигурировали правильно) или по окончании времени ожидания и перезагрузки.
Обращаю внимание - если пользователь смог войти в систему - Сервер считается работоспособным, задание из cron убирается.
И если вы решите что-то снова поконфигурировать - нужно снова запускать скрипт и один-два раза перезагружать сервак. Лучше составьте план действий.
Скрипт тестировался на debian путем удаления каталога
Используйте скрипт под свою ответственность. Гарантировать, что он заработает на вашей системе я не могу. Для начала попробуйте защить какой-нибудь каталог в домашней директории.
Скрипт не сможет восстановить конфигурацию, если машина не грузится совсем (ну, например грохнули fstab)
На Alpine точно не работает по двум причинам:
1. crontab не понимает опцию @reboot (проблема решаемая через
2. по умолчанию не работают команды last, who, w. Поэтому несколько проблематично определить наличие пользователя в системе.
➡️ Скрипт в комментариях к этому посту, сюда не влез сука!
tags: #bash #linux © by Tagd Tagd
—
🔔 @bashdays➡️ @gitgate
ㅤ
Проблема усугубляется тем, что на сервере нет
ipmi или аналогов, кроме того, в окружении нет админа. Поэтому конфигурировать сеть нужно по ssh.Надеюсь никому здесь не нужно объяснять, чем это грозит. В общем, прикинул я
Скрипт поможет в случае чего восстановить конфигурацию, в случае моего косяка.
Алгоритм работы следующий:
0. Есть работающий сервер.
1. При запуске создается резервная копия защищаемого каталога конфигурации /etc
2. В crontab добавляется задание, которое через определенное время ПОСЛЕ ПЕРЕЗАГРУЗКИ восстановит каталог из копии.
3. Если вышеуказанное задание определит, что в систему по ssh вошел указанный пользователь, восстановление отменяется и задание из crontab убирается.
4.Если пользователь не смог войти в систему - сначала создается вторая резервная копия защищаемого каталога (на тот случай, если сконфигурировали все правильно, но забыли/не смогли войти из-за проблем на вашей стороне, ну и для анализа), после этого производится восстановление резервной копии из пункта 1, убирается задание из crontab и производится перезагрузка сервера. Сервер приведен к пункту 0.
Пользоваться этой цацой просто:
1. ПЕРЕД НАЧАЛОМ КОНФИГУРИРОВАНИЯ запускаем скрипт, Он запрашивает имя пользователя и время ожидания до восстановления ПОСЛЕ ПЕРЕЗАГРУЗКИ.
2. Конфигурируем сервак.
3. Отправляем сервак в перезагрузку. (Да, не лучший вариант, но по сравнению с командировкой фигня).
4. Пытаемся войти по ssh.
По ssh мы войдем в любом случае. Или быстро (если сервак сконфигурировали правильно) или по окончании времени ожидания и перезагрузки.
Обращаю внимание - если пользователь смог войти в систему - Сервер считается работоспособным, задание из cron убирается.
И если вы решите что-то снова поконфигурировать - нужно снова запускать скрипт и один-два раза перезагружать сервак. Лучше составьте план действий.
Скрипт тестировался на debian путем удаления каталога
/etc/networkИспользуйте скрипт под свою ответственность. Гарантировать, что он заработает на вашей системе я не могу. Для начала попробуйте защить какой-нибудь каталог в домашней директории.
Скрипт не сможет восстановить конфигурацию, если машина не грузится совсем (ну, например грохнули fstab)
На Alpine точно не работает по двум причинам:
1. crontab не понимает опцию @reboot (проблема решаемая через
/etc/inid.d)2. по умолчанию не работают команды last, who, w. Поэтому несколько проблематично определить наличие пользователя в системе.
tags: #bash #linux © by Tagd Tagd
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Здрасти. Давай сегодня соберем свой «мета-пакет».
Что такое «мета-пакет»? Нууу…
ㅤ
Например, я хочу разом поставить
Я могу поставить один «мета-пакет», который будет содержать в себе все эти утилиты. Что-то из оперы Zver DVD, где нужный софт ставился сразу пачкой.
Поехали тыкать палкой!
Ставим зависимости и готовим окружение:
Создаем структуру для «мета-пакета»:
Создайте контрольные файлы пакета:
Ключи:
В ответ получаем выхлоп:
Открываем файл на редактирование:
И хуячим описание для «мета-пакета»:
В секции Depends перечислены все пакеты, которые должны быть установлены вместе с мета-пакетом. У меня это
Параметр Architecture: all указывает, что пакет не зависит от архитектуры.
Собираем «мета-пакет»:
Ключи
Смотрим что получилось:
И видим:
Наш «мета-пакет готов». Давай теперь его установим и посмотрим что получилось:
Проверяем и видим что произошла установка всех пакетов которые я описал в секции Depends в файле debian/control. ЗБС!
Проверить можно так:
В ответ получишь красивую табличку и информацию о пакетах.
Теперь можешь приготовить свой собственный «мета-пакет» со всем необходимым и быстренько раскатывать его на новые сервера.
Темка достаточно интересная, поэтому рекомендую потыкать.
Пользуйтесь!
tags: #linux
—
🔔 @bashdays➡️ @gitgate
Что такое «мета-пакет»? Нууу…
ㅤ
Например, я хочу разом поставить
htop, git, rclone, mc и прочее. И чтобы не вводить команду на установку:apt install htop git rclone mc
Я могу поставить один «мета-пакет», который будет содержать в себе все эти утилиты. Что-то из оперы Zver DVD, где нужный софт ставился сразу пачкой.
Поехали тыкать палкой!
Ставим зависимости и готовим окружение:
sudo apt-get install -y build-essential devscripts dh-make
Создаем структуру для «мета-пакета»:
cd /tmp
mkdir bashdays-soft
cd bashdays-soft
Создайте контрольные файлы пакета:
dh_make --native --single --yes -p bashdays-soft_1.0
Ключи:
native — создаёт пакет без указания версии дистрибутиваsingle — создаёт минимальную структуру-p my-metapackage_1.0 — имя пакета и версия (1.0)В ответ получаем выхлоп:
Maintainer Name : root
Email-Address : root@unknown
Date : Sun, 29 Sep 2024 03:58:22 +0000
Package Name : bashdays-soft
Version : 1.0
License : gpl3
Package Type : single
Открываем файл на редактирование:
vim debian/control
И хуячим описание для «мета-пакета»:
Source: bashdays-soft
Section: misc
Priority: optional
Maintainer: Roman Shubin <hello@devopsina.ru>
Standards-Version: 4.5.0
Build-Depends: debhelper-compat (= 11)
Package: bashdays-soft
Architecture: all
Depends: mc, htop, curl, git
Description: My own Installer
В секции Depends перечислены все пакеты, которые должны быть установлены вместе с мета-пакетом. У меня это
mc, htop, curl, git.Параметр Architecture: all указывает, что пакет не зависит от архитектуры.
Собираем «мета-пакет»:
debuild -us -uc
Ключи
-us и -uc отключают подпись пакета.Смотрим что получилось:
ls -la ..
И видим:
bashdays-soft_1.0.tar.xz
bashdays-soft_1.0_all.deb
Наш «мета-пакет готов». Давай теперь его установим и посмотрим что получилось:
sudo apt install -yf ../bashdays-soft_1.0_all.deb
Проверяем и видим что произошла установка всех пакетов которые я описал в секции Depends в файле debian/control. ЗБС!
Проверить можно так:
dpkg -l mc htop curl git
В ответ получишь красивую табличку и информацию о пакетах.
Теперь можешь приготовить свой собственный «мета-пакет» со всем необходимым и быстренько раскатывать его на новые сервера.
Темка достаточно интересная, поэтому рекомендую потыкать.
Пользуйтесь!
tags: #linux
—
Please open Telegram to view this post
VIEW IN TELEGRAM
13 88 21
Решился я тут по быстрому взгромоздить proxmox на пятую малину, благо есть решение — Pimox7.
Мне обещали приключений на пару минут, но по итогу я был выебан в розовые очки. Прям мем, делаешь все по официальной документации, а получается хуй с маслом.
Кто не в курсе:
Всё чего я добился с Pimox7:
Какой-то сука перл... Ну раз такое дело, надо решать! Фиксить скрипт Pimox7 я ебал, поэтому устроил анал-карнавал и зашел с черного хода.
В телеге с разметкой беда, поэтому запилил свою «официальную документацию» в другом месте. Мож кому пригодится 👇
➡️ Proxmox на Raspberry Pi 5
Хорошего тебе дня-вечера, увидимся!
tags: #linux #рабочиебудни
—
🔔 @bashdays➡️ @gitgate
Мне обещали приключений на пару минут, но по итогу я был выебан в розовые очки. Прям мем, делаешь все по официальной документации, а получается хуй с маслом.
Кто не в курсе:
Proxmox — это бесплатная платформа виртуализации, которая позволяет запускать на одном физическом сервере множество виртуальных машин и контейнеров. Она используется для создания и управления виртуальными средами.
Всё чего я добился с Pimox7:
The following packages have unmet dependencies:
ceph-fuse : Depends: libfmt7 (>= 7.1.3+ds1) but it is not installable
libpve-rs-perl : Depends: perlapi-5.32.1 but it is not installable
libpve-u2f-server-perl : Depends: perlapi-5.32.1 but it is not installable
librados2-perl : Depends: perlapi-5.32.1 but it is not installable
lxc-pve : Depends: libgnutlsxx28 but it is not installable
pve-cluster : Depends: perlapi-5.32.1 but it is not installable
pve-qemu-kvm : Depends: liburing1 (>= 0.7) but it is not installable
Какой-то сука перл... Ну раз такое дело, надо решать! Фиксить скрипт Pimox7 я ебал, поэтому устроил анал-карнавал и зашел с черного хода.
В телеге с разметкой беда, поэтому запилил свою «официальную документацию» в другом месте. Мож кому пригодится 👇
Хорошего тебе дня-вечера, увидимся!
tags: #linux #рабочиебудни
—
Please open Telegram to view this post
VIEW IN TELEGRAM
17 44 13
Принцесса для снятия стресса
Привет. Когда ты создаешь новый docker контейнер, то по умолчанию этому контейнеру назначается имя. Откуда оно берется?
Например:
Окей. После некоторого ресёрча оказалось, что 90% докера написано на Golang. Вот это поворот!
Порывшись еще немного, нашел функцию по генерации этих имен для контейнеров.
➡️ Посмотреть можешь тут.
ㅤ
Мотаем этот код в самый низ и видим забавную хуйню:
Этакая пасхалочка. Но зачем все эти имена?
Да чтобы удобнее было манипулировать контейнерами, вот и вся идея этой возни.
Ну и на закуску адаптируем полученные знания на bash, генератор может выглядеть так:
После запуска скрипта, на экран выведутся 10 случайных имен в стиле docker. Количество можешь гибко менять.
Теперь ты в праве заполнить массивы своими данными и генерировать уникальные имена, например:
А потом использовать сразу в командах:
Есть еще такая штука:
Это выплюнет тебе подобное имя прям в консоли без скриптов и приседаний.
А еще есть библиотека на питоне — codenamize, которая проворачивает тоже самое.
Короче есть из чего выбрать. В общем пользуйся, прикручивай, изучай!
tags: #linux #bash #docker
—
🔔 @bashdays➡️ @gitgate
Привет. Когда ты создаешь новый docker контейнер, то по умолчанию этому контейнеру назначается имя. Откуда оно берется?
Docker генерирует случайные имена для контейнеров, используя сочетание прилагательных и фамилий известных учёных или инженеров.
<прилагательное><фамилия> и всегда написаны в нижнем регистре.Например:
quirky_pare
agitated_turing
furious_heisenberg
romantic_curie
Окей. После некоторого ресёрча оказалось, что 90% докера написано на Golang. Вот это поворот!
Порывшись еще немного, нашел функцию по генерации этих имен для контейнеров.
ㅤ
Мотаем этот код в самый низ и видим забавную хуйню:
if name == "boring_wozniak" /* Steve Wozniak is not boring */ {
goto begin
}Этакая пасхалочка. Но зачем все эти имена?
Да чтобы удобнее было манипулировать контейнерами, вот и вся идея этой возни.
Ну и на закуску адаптируем полученные знания на bash, генератор может выглядеть так:
#!/bin/bash
adjectives=(
"adoring" "agitated" "amazing" "angry" "awesome" "blissful" "bold"
"boring" "brave" "clever" "cool" "compassionate" "competent" "crazy"
"dazzling" "determined" "ecstatic" "elegant" "eloquent" "epic"
"exciting" "fervent" "focused" "furious" "gallant" "gifted" "goofy"
"gracious" "happy" "hardcore" "hopeful" "hungry" "infallible" "inspiring"
"jolly" "jovial" "keen" "kind" "laughing" "loving" "magical"
"mystifying" "naughty" "nervous" "nostalgic" "optimistic" "peaceful"
"practical" "priceless" "quirky" "recursing" "relaxed" "reverent"
"sad" "serene" "sharp" "silly" "sleepy" "stoic" "strange" "stupefied"
"suspicious" "tender" "thirsty" "trusting" "unruffled" "vibrant"
"vigilant" "wizardly" "wonderful" "youthful" "zealous" "zen"
)
scientists=(
"albattani" "allen" "archimedes" "ardinghelli" "babbage" "bashdays" "banach"
"banzai" "bardeen" "bartik" "bassi" "bell" "benz" "bhabha" "bhaskara"
"blackwell" "bohr" "booth" "borg" "bose" "boyd" "brahmagupta" "brattain"
"brown" "carson" "chandrasekhar" "colden" "cori" "cray" "curie"
"darwin" "davinci" "dijkstra" "dubinsky" "easley" "einstein"
"elion" "engelbart" "euclid" "euler" "fermat" "fermi" "feynman"
"franklin" "galileo" "galois" "goldberg" "goodall" "hawking"
"heisenberg" "hermann" "herschel" "hertz" "hodgkin" "hoover" "hopper"
"hypatia" "joliot" "kalam" "keller" "kowalevski" "lalande" "leavitt"
"lichterman" "liskov" "lovelace" "mayer" "mccarthy" "mcclintock"
"mclean" "mcnulty" "meitner" "mendel" "mendeleev" "minsky" "mirzakhani"
"moore" "napier" "newton" "nobel" "noether" "panini" "pare"
"pasteur" "payne" "perlman" "pike" "poincare" "ptolemy" "raman"
"ramanujan" "ride" "ritchie" "roentgen" "rosalind" "saha"
"sammet" "shockley" "sinoussi" "stallman" "stonebraker" "swanson"
"tesla" "thompson" "torvalds" "turing" "varahamihira" "visvesvaraya"
"wilbur" "wiles" "williams" "wilson" "wing" "wozniak" "wright"
"yonath"
)
generate_container_name() {
local adjective="${adjectives[RANDOM % ${#adjectives[@]}]}"
local scientist="${scientists[RANDOM % ${#scientists[@]}]}"
echo "${adjective}_${scientist}"
}
count=${1:-10}
for ((i=1; i<=count; i++)); do
generate_container_name
done
После запуска скрипта, на экран выведутся 10 случайных имен в стиле docker. Количество можешь гибко менять.
Теперь ты в праве заполнить массивы своими данными и генерировать уникальные имена, например:
pizdatiy_huy или ohuennaya_pizda.А потом использовать сразу в командах:
docker run --name $(bash script.sh) -d nginx
Есть еще такая штука:
alias dn='curl -s https://frightanic.com/goodies_content/docker-names.php'
Это выплюнет тебе подобное имя прям в консоли без скриптов и приседаний.
А еще есть библиотека на питоне — codenamize, которая проворачивает тоже самое.
Короче есть из чего выбрать. В общем пользуйся, прикручивай, изучай!
tags: #linux #bash #docker
—
Please open Telegram to view this post
VIEW IN TELEGRAM
26 57 19
Тема вроде не айтишная, а вроде и айтишная, сделал я короче МРТ, по итогу приобрел грыжу и протрузию поясничного отдела.
ㅤ
Вас много и полюбому кто-то с этим уже столкнулся и живет в клубе по интересам. Вопрос — как эту хуйню захотфиксить? Мидокалм, пластыри и т.п. гавно это понятно.
В ремиссии чо делаете? ЛФК из чего состоит? Я ебать попробовал по официальному мануалу от невролога как котик спину выгибать и вгибать на корачках, через полчаса с температурой слег ))
Слышал что нужно укреплять ноги и жопу, но тут баш скрипт не накинешь, каким хером это укреплять? Приседать? Или что-то есть более эффективное? В спорт-зал не пойду, в лесу его нет.
Короче у меня одни вопросы, посоветоваться кроме как с вами мне не с кем. Гуглёж выдает тонны воды, а нужна проверенная база )
Если располагаешь сокровенными знаниями, поделись пожалуйста в комментах. Я этот вопрос конечно сам заресерчу, но у меня уйдёт на это дохера времени и неправильных вариантов, ну ты и сам понимаешь.
Короче коллеги-калеки поделитесь инвайтом в ваш клуб и методичкой чо делать, спасибо ) Всем отвечу уже завтра, пойду плакать.
UPD: Всем кто дал дельные советы — Спасибо! А кто хочет еще что-то добавить то велком сюда.
tags: #рабочиебудни
—
🔔 @bashdays➡️ @gitgate
ㅤ
Вас много и полюбому кто-то с этим уже столкнулся и живет в клубе по интересам. Вопрос — как эту хуйню захотфиксить? Мидокалм, пластыри и т.п. гавно это понятно.
В ремиссии чо делаете? ЛФК из чего состоит? Я ебать попробовал по официальному мануалу от невролога как котик спину выгибать и вгибать на корачках, через полчаса с температурой слег ))
Слышал что нужно укреплять ноги и жопу, но тут баш скрипт не накинешь, каким хером это укреплять? Приседать? Или что-то есть более эффективное? В спорт-зал не пойду, в лесу его нет.
Короче у меня одни вопросы, посоветоваться кроме как с вами мне не с кем. Гуглёж выдает тонны воды, а нужна проверенная база )
Если располагаешь сокровенными знаниями, поделись пожалуйста в комментах. Я этот вопрос конечно сам заресерчу, но у меня уйдёт на это дохера времени и неправильных вариантов, ну ты и сам понимаешь.
Короче коллеги-калеки поделитесь инвайтом в ваш клуб и методичкой чо делать, спасибо ) Всем отвечу уже завтра, пойду плакать.
UPD: Всем кто дал дельные советы — Спасибо! А кто хочет еще что-то добавить то велком сюда.
tags: #рабочиебудни
—
Please open Telegram to view this post
VIEW IN TELEGRAM
34 38 7
Недавно пришло письмо от мейл.ру мол у вас SPF запись пиздец хуёвая.
SPF-запись домена https://bashdays.ru задана таким образом, что для ее проверки необходимо 36 DNS-запросов из 10 допустимых.
Я человек простой — вижу хуйню, прохожу мимо. Но тут пройти не смог, какой-то животный интерес возник. Что это еще за 10 допустимых запросов?
Проресерчив тему, нашел сервис SPF Surveyor который как раз анализирует текущую SPF запись и выводит результат.
От результата я знатно прихуел, вот моя SPF:
v=spf1 mx a include:spf.gca.to include:_spf.google.com include:spf.smtp.bz include:mindbox.ru ~all
И результат: 36/10
И чо мне с этим делать? Для начала убрал mx и a, по итогу получил результат: 18/10. Уже лучше, поехали дальше оптимизировать!
А дальше оптимизировать нечего! По крайней мере я нихуя с этим больше не смог ничего сделать. Выкидывать инклуды нельзя, тупо нет лишнего.
Перегуглил… нииихуууя!
И как это дерьмище сокращать? Если каждый инклуд содержит в себе еще сабинклуды. Сука!
Короче пост не про решение проблемы, а про сервис SPF Surveyor.
Ну а если ты знаешь как этого босса проходить (мож ты гуру почтовых серверов, а мы и не знали), напиши пару строчек в комменты, обещаю админ чатика за технические коменты не забанит.
Такие дела…
tags: #рабочиебудни
—
Please open Telegram to view this post
VIEW IN TELEGRAM
17 36 16
Начало месяца - время делать бэкапы. О бэкапах уже столько сказано, что еще одна статья ничего нового не добавит, но тем не менее позволю себе поделиться своим опытом.
ㅤ
Сразу скажу, что не бывает правильных и неправильных схем архивирования. Бывают те, которые подходят для вашей задачи и не подходят.
Пока мой архив был меньше 10 Тб, я не понимал, нахрена нужны инкрементные копии? А у кого-то петабайты...
Архивы настолько важны, что я даже слов подобрать не могу. Архивы - единственное, что может остаться после критического сбоя/атаки.
Инфраструктуру можно поднять - это вопрос времени, но есть данные, которые нарабатывались несколько лет, и именно их потеря может быть очень критичной.
И из этого следует, что СХД для архивов должна быть самым защищенным элементом инфраструктуры. Очень хорошо, если на эту машину нельзя попасть никаким способом, кроме физического доступа.
Кроме этого. СХД - тоже компьютер, поэтому тоже может выйти из строя. Поэтому необходимо хранить данные еще и отдельно на внешних дисках.
Причем дисков должно быть минимум два с чередованием (месячным, недельным, ежедневным не важно, но чередование должно быть). Кроме того, есть холивар, по поводу того, кто должен быть инициатором соединения при архивировании - СХД или рабочий сервер.
Просто подумайте, кто больше подвержен атаке клиент или сервер. Конечно сервер. Поэтому для обеспечения минимальной безопасности архивов инициировать соединение должна СХД.
Я для себе решил вопрос с помощью "перевалочной базы" - Машины, на которую сервера сваливают одну дневную копию, и с которой СХД забирает все архивы.
Т.е. и рабочие сервера и СХД в этой схеме являются клиентами. Дело в том, что хорошо защитить один перевалочный сервер проще, чем каждый рабочий сервер.
Не буду напоминать, что каждый клиент загружает копию под своей учеткой, чтобы в случае взлома сервера нельзя было поломать архивы соседних серверов.
Но в этой схеме тоже есть недостатки дополнительное место, двойной расход сетевого трафика, да и машина нужна. В общем, за надежность всегда приходится платить.
Но кроме этого, я сохраняю несколько дневных копий (до 7 штук) прям на сервере, на тот случай, если с данными накосячат пользователи. Причем последнюю копию даже не сжимаю и не шифрую.
Ну, и остался вопрос именования архивов. Кто-то использует даты в имени и удаляет по устареванию. Я использую цифры и провожу ротацию по одному файлу за раз. Потому что в случае атаки на сервер времени дата-именованные архивы можно потерять за раз.
Для нумерованных архивов для атаки - дату нужно менять несколько раз.
Причем число раз будет зависеть от схемы.
В общем резюмирую:
1. Хороших и плохих схем архивирования не существует - есть такие, которые подходят вам и не подходят.
2. СХД - самая защищенная машина инфраструктуры. Без возможности управления по сети.
3. Есть внешние копии с чередованием, на случай выхода из строя СХД.
4. Архивные копии между СХД и сервером передаются через промежуточную машину.
5. Несколько дневных копий можно ДОПОЛНИТЕЛЬНО хранить на самом рабочем сервере.
6. Используем нумерованные архивы с ротацией.
Холивар в коммментах приветствуется.
tags: #рабочиебудни © by Tagd Tagd
—
🔔 @bashdays➡️ @gitgate
ㅤ
Сразу скажу, что не бывает правильных и неправильных схем архивирования. Бывают те, которые подходят для вашей задачи и не подходят.
Пока мой архив был меньше 10 Тб, я не понимал, нахрена нужны инкрементные копии? А у кого-то петабайты...
Архивы настолько важны, что я даже слов подобрать не могу. Архивы - единственное, что может остаться после критического сбоя/атаки.
Инфраструктуру можно поднять - это вопрос времени, но есть данные, которые нарабатывались несколько лет, и именно их потеря может быть очень критичной.
И из этого следует, что СХД для архивов должна быть самым защищенным элементом инфраструктуры. Очень хорошо, если на эту машину нельзя попасть никаким способом, кроме физического доступа.
Кроме этого. СХД - тоже компьютер, поэтому тоже может выйти из строя. Поэтому необходимо хранить данные еще и отдельно на внешних дисках.
Причем дисков должно быть минимум два с чередованием (месячным, недельным, ежедневным не важно, но чередование должно быть). Кроме того, есть холивар, по поводу того, кто должен быть инициатором соединения при архивировании - СХД или рабочий сервер.
Просто подумайте, кто больше подвержен атаке клиент или сервер. Конечно сервер. Поэтому для обеспечения минимальной безопасности архивов инициировать соединение должна СХД.
Я для себе решил вопрос с помощью "перевалочной базы" - Машины, на которую сервера сваливают одну дневную копию, и с которой СХД забирает все архивы.
Т.е. и рабочие сервера и СХД в этой схеме являются клиентами. Дело в том, что хорошо защитить один перевалочный сервер проще, чем каждый рабочий сервер.
Не буду напоминать, что каждый клиент загружает копию под своей учеткой, чтобы в случае взлома сервера нельзя было поломать архивы соседних серверов.
Но в этой схеме тоже есть недостатки дополнительное место, двойной расход сетевого трафика, да и машина нужна. В общем, за надежность всегда приходится платить.
Но кроме этого, я сохраняю несколько дневных копий (до 7 штук) прям на сервере, на тот случай, если с данными накосячат пользователи. Причем последнюю копию даже не сжимаю и не шифрую.
Ну, и остался вопрос именования архивов. Кто-то использует даты в имени и удаляет по устареванию. Я использую цифры и провожу ротацию по одному файлу за раз. Потому что в случае атаки на сервер времени дата-именованные архивы можно потерять за раз.
Для нумерованных архивов для атаки - дату нужно менять несколько раз.
Причем число раз будет зависеть от схемы.
В общем резюмирую:
1. Хороших и плохих схем архивирования не существует - есть такие, которые подходят вам и не подходят.
2. СХД - самая защищенная машина инфраструктуры. Без возможности управления по сети.
3. Есть внешние копии с чередованием, на случай выхода из строя СХД.
4. Архивные копии между СХД и сервером передаются через промежуточную машину.
5. Несколько дневных копий можно ДОПОЛНИТЕЛЬНО хранить на самом рабочем сервере.
6. Используем нумерованные архивы с ротацией.
Холивар в коммментах приветствуется.
tags: #рабочиебудни © by Tagd Tagd
—
Please open Telegram to view this post
VIEW IN TELEGRAM
7 43 15
Не ssh, но близко — sftp.
Классная вещь, со своими достоинствами и недостатками. Гораздо круче, чем
ㅤ
По сравнению с
Из минусов - может создавать нагрузку на проц. В openssh включен из коробки. Поэтому если есть доступ по
А вот обратное - не всегда верно. Иногда бывает нужно разрешить пользователям доступ по
Вот, для этого есть решение — mysecureshell.
Для debian можно поставить:
После этого у вас появляется свой собственный
Возможностью ограничить пользователя только своим каталогом. И еще работа с виртуальными серверами. Рекомендую.
Достаточно пользователю прописать в качестве оболочки mysecureshell - и он человек, ограниченный файловой подсистемой. Кстати, список доступных оболочек можно глянуть так:
А изменить, например так:
Конфигурируется данное чудо путем редактирования файла
Кстати, отлично сочетается с
А вот с
Репа Mysecureshell
Документация
tags: #linux #utilites © by Tagd Tagd
—
🔔 @bashdays➡️ @gitgate
Классная вещь, со своими достоинствами и недостатками. Гораздо круче, чем
scp, поскольку кроме копирования позволяет управлять правами доступа.ㅤ
По сравнению с
ftp - возможность работы через один порт (легко пробрасывается) Протокол защищенный.Из минусов - может создавать нагрузку на проц. В openssh включен из коробки. Поэтому если есть доступ по
ssh - как правило, есть доступ и по sftp.А вот обратное - не всегда верно. Иногда бывает нужно разрешить пользователям доступ по
sftp, например, чтобы заливать архивы, но совсем не хочется давать возможность шариться по серваку и смотреть, что там крутится.Вот, для этого есть решение — mysecureshell.
Для debian можно поставить:
sudo apt install mysecureshell
После этого у вас появляется свой собственный
sftp сервер с возможностью управления пользователями, группами, управление скоростью закачки и отдачи, можно просматривать текущие сессии и прибивать ненужные.Возможностью ограничить пользователя только своим каталогом. И еще работа с виртуальными серверами. Рекомендую.
Достаточно пользователю прописать в качестве оболочки mysecureshell - и он человек, ограниченный файловой подсистемой. Кстати, список доступных оболочек можно глянуть так:
cat /etc/shells
А изменить, например так:
sudo usermod -s /usr/bin/mysecureshell username
Конфигурируется данное чудо путем редактирования файла
/etc/ssh/sftp_configКстати, отлично сочетается с
sshfs (монтирование через ssh (по факту через sftp)).А вот с
rsync, говорят не дружит, но я лично не проверял. Приводить примеры конфигурирования не стал, потому что там все очень понятно и прозрачно. Документация приличная, сам конфиг очень классно комментирован. Репа Mysecureshell
Документация
tags: #linux #utilites © by Tagd Tagd
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Как правильно натянуть презерватив
Вот поставил ты
ㅤ
Хуйня! У меня например на хостовой машине стоит
И оно проксирует на
Но если сделать так:
Ты сразу попадешь в контейнер, минуя
Напрашивается
Есть решение гораздо изящнее. Рассмотрим пример с gitea.
Это урезанный
Смотрим секцию с портами и видим там биндинг на
То тебе покажут письку!😑
Вроде элементарно, но как оказалось дохуя специалистов этого не знают и продолжают трахаться с
И да, оказывается многие (в основном деды) не знают что
А вообще если у тебя всё в контейнерах крутится, выкинь
Пользуйтесь!
tags: #devops #docker #security
—
🔔 @bashdays➡️ @gitgate
Вот поставил ты
docker, запустил на нем контейнер, пробросил порты, збс! Только вот есть одно НО. Проброшенные порты торчат жопой наружу и любой желающий может получить к ним доступ.ㅤ
Хуйня! У меня например на хостовой машине стоит
nginx, который прокси-пасит по урлам на нужные приложения, например:curl https://bashdays.ru/vault/
И оно проксирует на
localhost:8002, на этом порту крутится контейнер с vault hashicorp.Но если сделать так:
curl XXX.XXX.XXX.XXX:8002
Ты сразу попадешь в контейнер, минуя
nginx и все его правила. Гавно!Напрашивается
iptables, но в связке с docker это то еще приключение. Про эти моменты писал в этом и этом посте.
Есть решение гораздо изящнее. Рассмотрим пример с gitea.
Это урезанный
docker-compose.ymlversion: "3"
networks:
gitea:
external: false
services:
server:
image: gitea/gitea:latest
networks:
- gitea
volumes:
- gitea:/data
ports:
- "127.0.0.1:3000:3000"
- "127.0.0.1:2221:22"
Смотрим секцию с портами и видим там биндинг на
127.0.0.1. Вот это оно и есть. То есть ты и порты пробрасываешь на хостовую машину и наружу ими не светишь.Nginx на хостовой машине отлично сходит на 127.0.0.1:3000, но вот если снова выполнить:curl XXX.XXX.XXX.XXX:3000
То тебе покажут письку!
Вроде элементарно, но как оказалось дохуя специалистов этого не знают и продолжают трахаться с
iptables.И да, оказывается многие (в основном деды) не знают что
docker-compose (тот что бинарник) это легаси и файлики docker-compose.yml теперь можно запускать так:docker compose up -d
А вообще если у тебя всё в контейнерах крутится, выкинь
nginx и замени на traefik и никакие порты по умолчанию жопой наружу торчать не будут + автоматическое получение SSL для доменов.Пользуйтесь!
tags: #devops #docker #security
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Bash генератор OTP для 2FA
Я давненько пользуюсь Authy. Это генератор OTP кодов для 2FA. Большим плюсом было — что этот генератор работал на десктопе.
ㅤ
Но в какой-то момент эта игрушка превратилась в тыкву. А использовать телефон для таких целей я не люблю, да и не всегда он есть под рукой.
Короче в мою зону комфорта беспощадно насрали.
Каждое случившиеся гавно это повод изобрестивелосипед что-то своё.
Пошло оно всё нахуй! Будем генерить коды Bash скриптом!
Для начала нам понадобится утилита
Не парься, иксы не нужны, всё работает нативно в терминале.
Далее пиздуем например в gitlab и включаем 2FA, в ответ оно тебе выплюнет QR код. Делаем скриншот QR и сохраняем.
Запускаем сканер:
В ответ получаем нечто подобное:
Замечательно. Из этой кишки нам нужен только
Устанавливаем вторую утилиту:
Накидываем bash скрипт:
Запускаем и получаем желаемый OTP код, вводим его в Gitlab и охуеваем. Мы успешно прошли 2FA. Всё работает!
Базу расковыряли. Теперь нужно какое-то человеческое решение. Накидываем еще один bash скрипт:
Не забываем заполнить массив секретами и названиями сервисов. Если хочется, можешь реализовать чтение secrets из текстового файла. Скрипт закинуть в гит, а данные по секретам хранить у себя или в варсах гитлаба.
Что-то вроде:
Сохраняем получившийся скрипт в
Вводим нужный номер сервиса и получаем актуальный OTP код.
Всю эту хуйню можно легко запилить в телеграм бота и генерить OTP коды прям в там не отходя от кассы. А также сделать автоматическую распознавалку QR с добавлением новых сервисов в список.
Например, кидаешь боту QR картинку, он ее распознает, добавляет в sqlite базу этот сервис и генерит по запросу коды.
В общем тут уже полет фантазии, можно и кнопочки прикрутить и другие украшения. Было бы время и желание.
Мне пока достаточно баш скрипта, а ты можешь из этого сделать пет проект и хвастаться им на собесах. Однозначно будет плюсиком.
Вот такой хуйнёй переодически приходится заниматься.
Ладно, чо. Хорошего тебе дня, увидимся!
tags: #linux #bash #рабочиебудни
—
🔔 @bashdays➡️ @gitgate
Я давненько пользуюсь Authy. Это генератор OTP кодов для 2FA. Большим плюсом было — что этот генератор работал на десктопе.
ㅤ
Но в какой-то момент эта игрушка превратилась в тыкву. А использовать телефон для таких целей я не люблю, да и не всегда он есть под рукой.
TOTP (Time-based One-Time Password) — это алгоритм, используемый для генерации одноразовых паролей (OTP), которые действуют в течение ограниченного времени.
Короче в мою зону комфорта беспощадно насрали.
Каждое случившиеся гавно это повод изобрести
Пошло оно всё нахуй! Будем генерить коды Bash скриптом!
Для начала нам понадобится утилита
zbar, она позволит из терминала распознать qr код, этот код выдают сервисы где включается 2FA. Не парься, иксы не нужны, всё работает нативно в терминале.
sudo apt install zbar-tools
Далее пиздуем например в gitlab и включаем 2FA, в ответ оно тебе выплюнет QR код. Делаем скриншот QR и сохраняем.
Запускаем сканер:
zbarimg gitlab_qr.png
В ответ получаем нечто подобное:
QR-Code:otpauth://totp/gitlab.com:gitlab.com_hello%40devopsina.ru?secret=1234567890ABCDEFG&issuer=gitlab.com
scanned 1 barcode symbols from 1 images in 0.02 seconds
Замечательно. Из этой кишки нам нужен только
secret=1234567890ABCDEFG.Устанавливаем вторую утилиту:
sudo apt install oathtool
Накидываем bash скрипт:
#!/bin/bash
SECRET="1234567890ABCDEFG"
echo "Gitlab 2FA code: $(oathtool --totp -b "$SECRET")"
Запускаем и получаем желаемый OTP код, вводим его в Gitlab и охуеваем. Мы успешно прошли 2FA. Всё работает!
Базу расковыряли. Теперь нужно какое-то человеческое решение. Накидываем еще один bash скрипт:
#!/bin/bash
secrets=(
"GitLab:1234567890ABCDEFG"
"Google:1234567890ABCDEFG"
"Bashdays:1234567890ABCDEFG"
)
for i in "${!secrets[@]}"; do
IFS=":" read -r service secret <<< "${secrets[i]}"
echo "$((i + 1)). $service"
done
read -p "Введите номер сервиса: " choice
if [[ "$choice" -gt 0 && "$choice" -le "${#secrets[@]}" ]]; then
IFS=":" read -r selected_service selected_secret <<< "${secrets[choice - 1]}"
TOTPCODE=$(oathtool --totp -b "$selected_secret")
echo "TOTP код для $selected_service: $TOTPCODE"
else
echo "Неверный выбор."
fi
read -p ""
Не забываем заполнить массив секретами и названиями сервисов. Если хочется, можешь реализовать чтение secrets из текстового файла. Скрипт закинуть в гит, а данные по секретам хранить у себя или в варсах гитлаба.
Что-то вроде:
secrets_file="secrets.txt"
while IFS= read -r line; do
secrets+=("$line")
done < "$secrets_file"
Сохраняем получившийся скрипт в
qr.sh, делаем алиас если нужно и запускаем. В ответ получаем нумерованный список сервисов:1. Gitlab
2. Google
3. Bashdays
Введите номер сервиса:
Вводим нужный номер сервиса и получаем актуальный OTP код.
Всю эту хуйню можно легко запилить в телеграм бота и генерить OTP коды прям в там не отходя от кассы. А также сделать автоматическую распознавалку QR с добавлением новых сервисов в список.
Например, кидаешь боту QR картинку, он ее распознает, добавляет в sqlite базу этот сервис и генерит по запросу коды.
В общем тут уже полет фантазии, можно и кнопочки прикрутить и другие украшения. Было бы время и желание.
Мне пока достаточно баш скрипта, а ты можешь из этого сделать пет проект и хвастаться им на собесах. Однозначно будет плюсиком.
Вот такой хуйнёй переодически приходится заниматься.
Ладно, чо. Хорошего тебе дня, увидимся!
tags: #linux #bash #рабочиебудни
—
Please open Telegram to view this post
VIEW IN TELEGRAM
30 99 15
Привет, сегодня халява. У меня есть 3 проходки-билета (скидка 100%) на онлайн-конференцию «Подлодка».
Если есть желание посетить сие онлайн-мероприятие, кликай кнопку ниже. В выходные опубликуются результаты. Ну а дальше с вами свяжется Макс и раздаст ништяки. Такие дела!
Условия розыгрыша: подписаться на канал @gitgate
Если есть желание посетить сие онлайн-мероприятие, кликай кнопку ниже. В выходные опубликуются результаты. Ну а дальше с вами свяжется Макс и раздаст ништяки. Такие дела!
Условия розыгрыша: подписаться на канал @gitgate
11 15 4
Покопавшись с вопросом по SPF из этого поста, решил воспользоваться советом Ivanchos, а именно — для начала выписать все ip которые инклудятся по домену.
ㅤ
Выписал, получилось достаточно много, строчка SPF стала длинной как хуй туземца, размером > 1024 символов.
Хотя по некоторым данным допускается 450 символов.
А у меня блядь превышает… 1039!
Попёрся я обратно в SPF Surveyor смотреть. И в самом низу увидел секциюPIDR CIDR IP, где перечислялись диапазоны.
Ёпта, а чо так можно было? Собираю все эти диапазоны в одну строку, благо их там адекватное количество.
Скармливаю сначала в валидатор, а потом уже добавляю в TXT.
Хуяк! И оно работает! Теперь по DNS lookups needed to validate the record получаем - 0/10.
То есть теперь мы вообще не делаем никакие DNS запросы, а чисто сидим на CIDR.
За сутки на почту
Хер знает на сколько это верное решение, но с виду работает. Я конечно еще понаблюдаю за этим безумием. Придумают какую-то херню, а ты потом ебись с ней.
Если всё накроется пиздой, я обязательно тебе про это сообщу ))
Всего тебе наилучшего!
tags: #рабочиебудни
—
🔔 @bashdays➡️ @gitgate
ㅤ
Выписал, получилось достаточно много, строчка SPF стала длинной как хуй туземца, размером > 1024 символов.
v=spf1 ip4:178.154.239.164/32 ip4:77.222.53.78/32 ......
Согласно RFC 7208, длина SPF-записи (Sender Policy Framework) не должна превышать 255 символов в одной строке. Однако, если SPF-запись превышает 255 символов, ее можно разбивать на несколько строк, но общая длина записи не должна превышать 512 символов при передаче в DNS.
Хотя по некоторым данным допускается 450 символов.
А у меня блядь превышает… 1039!
Попёрся я обратно в SPF Surveyor смотреть. И в самом низу увидел секцию
Ёпта, а чо так можно было? Собираю все эти диапазоны в одну строку, благо их там адекватное количество.
v=spf1
ip4:32.190.247.0/24
ip4:65.233.160.0/19
ip4:64.102.0.0/20
ip4:75.14.192.0/18
ip4:78.125.0.0/16
ip4:103.177.8.0/21
ip4:174.194.0.0/16
ip4:206.85.128.0/17
ip4:213.58.192.0/19
ip4:171.217.0.0/19
ip4:171.217.32.0/20
ip4:171.217.128.0/19
ip4:44.92.0.0/15
ip4:48.107.0.0/16
ip4:81.220.186.0/24
ip4:168.154.239.164/32
~all
Скармливаю сначала в валидатор, а потом уже добавляю в TXT.
Хуяк! И оно работает! Теперь по DNS lookups needed to validate the record получаем - 0/10.
То есть теперь мы вообще не делаем никакие DNS запросы, а чисто сидим на CIDR.
За сутки на почту
dmarc@ почти перестали приходить письма с варнингами, да и саппорт пока молчит, почта ходит.Хер знает на сколько это верное решение, но с виду работает. Я конечно еще понаблюдаю за этим безумием. Придумают какую-то херню, а ты потом ебись с ней.
Если всё накроется пиздой, я обязательно тебе про это сообщу ))
Всего тебе наилучшего!
tags: #рабочиебудни
—
Please open Telegram to view this post
VIEW IN TELEGRAM
19 71 18
Bash Days | Linux | DevOps
Привет, сегодня халява. У меня есть 3 проходки-билета (скидка 100%) на онлайн-конференцию «Подлодка». Если есть желание посетить сие онлайн-мероприятие, кликай кнопку ниже. В выходные опубликуются результаты. Ну а дальше с вами свяжется Макс и раздаст ништяки.…
🎉 Результаты розыгрыша:
Победители:
1. MiRacLe (@miracle_rpz)
2. Mikhail (@WEB3_SAMURAI)
3. Владимир (@Dedula_Star)
Проверить результаты
Победители:
1. MiRacLe (@miracle_rpz)
2. Mikhail (@WEB3_SAMURAI)
3. Владимир (@Dedula_Star)
Проверить результаты
Интересный вопрос сегодня залетел:
Давай посмотрим что происходит в кишках в это время. Давненько мы с тобой в
ㅤ
Предположим есть bash скрипт с функциями:
functions.sh
И основной скрипт, который сорсит файл с функциями:
test_script.sh
Не забываем сделать:
Запускаем
И видим:
То есть в контексте скрипта
При втором вызове функции всё считалось из памяти.
Если бы файл
Грубо говоря при каждом запуске
Вроде очевидно, но порой заставляет задуматься.
Изучай!
tags: #bash #debug #linux
—
🔔 @bashdays➡️ @gitgate
Если функции, вынесены в файл, подключенный через source, bash каждый раз его будет открывать/перечитывать при обращении к функции? Или как-то считает в память и все?
Давай посмотрим что происходит в кишках в это время. Давненько мы с тобой в
strace не смотрели.ㅤ
Предположим есть bash скрипт с функциями:
functions.sh
#!/bin/bash
bashdays_function() {
echo "Hello from BashDays"
}
И основной скрипт, который сорсит файл с функциями:
test_script.sh
#!/bin/bash
source ./functions.sh
bashdays_function
bashdays_function
Не забываем сделать:
chmod +x test_script.shЗапускаем
test_script.sh под контролем strace:strace -e trace=openat ./test_script.sh
И видим:
openat(AT_FDCWD, "./test_script.sh", O_RDONLY) = 3
openat(AT_FDCWD, "./functions.sh", O_RDONLY) = 3
Hello from BashDays
Hello from BashDays
То есть в контексте скрипта
test_script.sh, файл с функциями был прочитан один раз.При втором вызове функции всё считалось из памяти.
Если бы файл
functions.sh читался каждый раз, то мы увидели бы несколько строчек openat(AT_FDCWD).Грубо говоря при каждом запуске
test_script.sh, подключенный файл через source будет прочитан один раз.Вроде очевидно, но порой заставляет задуматься.
Изучай!
tags: #bash #debug #linux
—
Please open Telegram to view this post
VIEW IN TELEGRAM
16 66 25
На прошлой неделе обещал в чатике показать как без особых финансовых потерь потыкать полноценный Selectel. Ща.
Для начала регаешься тут.
Далее переходишь в левом сайдбаре в раздел — «Облачная платформа» и в верхнем правом углу жмешь на кнопку «Создать сервер».
Важно! Выбираешь регион:
Натыкиваешь параметры:
1. CPU: 1
2. RAM: 512 Mb
3. HDD Базовый: 10 Gb
4. Сеть NAT
И самое главное тыкни галку: Прерываемый сервер
Опция «Прерываемый сервер» есть только в регионе Москва - ru-7b
Эта конфигурация обойдется тебе в 266 рубля. С параметрами 2x2x20 будет соответственно в 2 раза дороже.
Но сразу берем во внимание, что это прерываемый сервер и обычно работает 24 часа, потом отключается со статусом Expired.
Что интересно такой сервер можно включать и дальше пользоваться если в регионе есть свободные ресурсы.
Если тебе понадобится белый айпишник, придется раскошелится еще на 178 рублей. Но ты в праве запихать туда wireguard или openvpn и ходить по внутренним айпишникам.
Если в конфигурации сервера ты не выбирал Локальный диск, а сделал сетевой — то после удаления сервера, с сетевого диска можно будет без труда его восстановить. Просто раскатываем новый «прерываемый сервер» и подключить этот сетевой диск как загрузочный.
За 3 недели тестирования у меня эти сервера ни разу не удалились, я просто их включаю заново и провожу эксперименты с Терраформом, Ансиблом, гоняю тесты пайплайнов гитлаба и т.п.
Короче такие сервера отлично подходят чтобы быстро что-то проверить. Продакшен естественно на них тащить не нужно, однажды проебешь всё разом.
Еще момент — выключенный сервер, либо в статусе Expired потребляет ресурсы, поэтому тарифицируется. Если сервер тебе не нужен, просто удали его (не забудь про ip и сетевые диски) и потом заново подними терраформом. Если у тебя нет ресурсов, твой баланс выжираться не будет.
Ну а кому вся эта хуйня чужда и ты привык к обычным VPS, у Селектела есть ЭТО. В нём гораздо меньше опций, нет обвесов, нет терраформа и т.п. но все же это тот же Селектел🦖 , ну и цены тут гораздо демократичнее:
В общем на потыкать тот же терраформ в боевых условиях рекомендую первый вариант с прерываемыми серверами.
Не реклама, чисто личные наблюдения. Пользуйся.
tags: #рабочиебудни
—
🔔 @bashdays➡️ @gitgate
Для начала регаешься тут.
Далее переходишь в левом сайдбаре в раздел — «Облачная платформа» и в верхнем правом углу жмешь на кнопку «Создать сервер».
Важно! Выбираешь регион:
Москва - ru-7bНатыкиваешь параметры:
1. CPU: 1
2. RAM: 512 Mb
3. HDD Базовый: 10 Gb
4. Сеть NAT
И самое главное тыкни галку: Прерываемый сервер
Опция «Прерываемый сервер» есть только в регионе Москва - ru-7b
Эта конфигурация обойдется тебе в 266 рубля. С параметрами 2x2x20 будет соответственно в 2 раза дороже.
Но сразу берем во внимание, что это прерываемый сервер и обычно работает 24 часа, потом отключается со статусом Expired.
Что интересно такой сервер можно включать и дальше пользоваться если в регионе есть свободные ресурсы.
Если тебе понадобится белый айпишник, придется раскошелится еще на 178 рублей. Но ты в праве запихать туда wireguard или openvpn и ходить по внутренним айпишникам.
Если в конфигурации сервера ты не выбирал Локальный диск, а сделал сетевой — то после удаления сервера, с сетевого диска можно будет без труда его восстановить. Просто раскатываем новый «прерываемый сервер» и подключить этот сетевой диск как загрузочный.
За 3 недели тестирования у меня эти сервера ни разу не удалились, я просто их включаю заново и провожу эксперименты с Терраформом, Ансиблом, гоняю тесты пайплайнов гитлаба и т.п.
Короче такие сервера отлично подходят чтобы быстро что-то проверить. Продакшен естественно на них тащить не нужно, однажды проебешь всё разом.
Еще момент — выключенный сервер, либо в статусе Expired потребляет ресурсы, поэтому тарифицируется. Если сервер тебе не нужен, просто удали его (не забудь про ip и сетевые диски) и потом заново подними терраформом. Если у тебя нет ресурсов, твой баланс выжираться не будет.
Ну а кому вся эта хуйня чужда и ты привык к обычным VPS, у Селектела есть ЭТО. В нём гораздо меньше опций, нет обвесов, нет терраформа и т.п. но все же это тот же Селектел
CPU: 1 / RAM: 512 / SDD: 20 = 200 рублей
В общем на потыкать тот же терраформ в боевых условиях рекомендую первый вариант с прерываемыми серверами.
Не реклама, чисто личные наблюдения. Пользуйся.
tags: #рабочиебудни
—
Please open Telegram to view this post
VIEW IN TELEGRAM
16 41 8
Сегодня мы рассмотрим одну очень интересную тему. Бывает, что у вас маленькая локалка (/24), или сеть класса D.
И нужно, чтобы у некоторых групп пользователей были разные внешние IP.
Ну, например wi-fi желательно выпускать через отдельный ip, чтобы меньше было проблем типа "из вашей сети исходят подозрительные запросы".
Или у бухгалтера аллергия на два последних октета ip адреса, потому что это день рождения ее второго мужа, а он был такой козел...
А через прокси не каждый софт работает. Ну, в общем, задача понятна.
Использовать будем машину на
—
Добавляем сетевые интерфейсы. Хорошо, если у вас есть несколько линий от разных провайдеров. Если нет - не беда.
Но я не буду останавливаться на вопросе, как создать интерфейсы, как настроить pptp. Информации об это море. И да, здесь не поднимаем тему безопасности - задача сменить IP.
—
Добавляем Новые интерфейсы (типа PPP, или что там у вас есть)
—
Создаем алиасы с группой хостов, которые должны выходить через ip, отличающийся от шлюза по умолчанию. Таких может быть несколько. Например, IP_GATE1 IP_GATE2 IP_GATE3, по одному на каждый шлюз.
—
Система\Маршрутизация\Шлюзы добавляем шлюзы и в свойствах снимаем галки Мониторинг Шлюзов и Действие Шлюза. Если так не сделать - в случае "отваливания шлюза" умная система перенаправит трафик через шлюз по умолчанию, и на другом конце "засветится" ip шлюза по-умолчанию.
—
Межсетевой экран\Правила\LAN Для каждой группы создаем два правила:
- Разрешить IPv4 протокол любой Источник IP_GATE1, и в расширенных опциях указываем нужный шлюз (GATE1) (слева на правиле в общем списке правил появится шестеренка)
- Ниже: Блокировать IPv4 протокол любой Источник IP_GATE1.
—
Для остальных - аналогично. Теперь Группа IP_GATE1 будет выходить через GATE1 или вообще не будет выходить в случае отсутствия инета на GATE1.
Применять исключительно для причинения добра!
tags: #networks © by Tagd Tagd
—
🔔 @bashdays➡️ @gitgate
И нужно, чтобы у некоторых групп пользователей были разные внешние IP.
Ну, например wi-fi желательно выпускать через отдельный ip, чтобы меньше было проблем типа "из вашей сети исходят подозрительные запросы".
Или у бухгалтера аллергия на два последних октета ip адреса, потому что это день рождения ее второго мужа, а он был такой козел...
А через прокси не каждый софт работает. Ну, в общем, задача понятна.
Использовать будем машину на
pfsense. Да, без картинок воспринимается не очень, но это лучше, чем ничего.—
Добавляем сетевые интерфейсы. Хорошо, если у вас есть несколько линий от разных провайдеров. Если нет - не беда.
pfsense позволяет работать с usb модемами, и подключениями типа pptp, pppoe и другими. Сейчас практически любой домашний роутер может работать как pptp сервер.Но я не буду останавливаться на вопросе, как создать интерфейсы, как настроить pptp. Информации об это море. И да, здесь не поднимаем тему безопасности - задача сменить IP.
—
Добавляем Новые интерфейсы (типа PPP, или что там у вас есть)
—
Создаем алиасы с группой хостов, которые должны выходить через ip, отличающийся от шлюза по умолчанию. Таких может быть несколько. Например, IP_GATE1 IP_GATE2 IP_GATE3, по одному на каждый шлюз.
—
Система\Маршрутизация\Шлюзы добавляем шлюзы и в свойствах снимаем галки Мониторинг Шлюзов и Действие Шлюза. Если так не сделать - в случае "отваливания шлюза" умная система перенаправит трафик через шлюз по умолчанию, и на другом конце "засветится" ip шлюза по-умолчанию.
—
Межсетевой экран\Правила\LAN Для каждой группы создаем два правила:
- Разрешить IPv4 протокол любой Источник IP_GATE1, и в расширенных опциях указываем нужный шлюз (GATE1) (слева на правиле в общем списке правил появится шестеренка)
- Ниже: Блокировать IPv4 протокол любой Источник IP_GATE1.
—
Для остальных - аналогично. Теперь Группа IP_GATE1 будет выходить через GATE1 или вообще не будет выходить в случае отсутствия инета на GATE1.
Применять исключительно для причинения добра!
tags: #networks © by Tagd Tagd
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Сегодня про айпишники.
Допустим покупаешь ты себе облачный vps. Этому серверу автоматически назначается IP адрес, по которому ты можешь подключиться по ssh.
Например у AEZA есть услуга: Добавить IP адрес. То есть к серверу можно привязать 2 айпишника.
Я люблю такие штуки, но абсолютный профан в сетях. Купил услугу, второй айпишник автоматически прикрутился. Теперь я могу заходить на сервер по ssh либо через первый IP либо через второй.
Смотрим сетевые настройки:
Всё логично и красиво. Айпишники прописаны статично, никакого
Если я сделаю так:
То в выхлопе получу первый IP адрес (62.60.238.33).
Но как мне выходить в интернет с конкретного IP адреса?
Можно курлыкнуть так:
Пошли дальше. Давай настроим маршрутизацию, чтобы 50% трафика выходило через первый айпишник, а 50% через второй.
Открываем
Далее хуячим в терминале:
Проверяем:
ЗАЕБИСЬ! Теперь наш сервер выходит в интернеты с разных IP адресов.
Что с этим делать дальше? Хуй знает, я показал тебе концепт работы с двумя айпишниками, а ты уже дальше прикидывай где и как это можешь использовать.
В идеале запустить какойнить wireguard и ходить по сайтикам светя то одним адресом, то другим. Короче не знаю, накидывай в комменты, где это можно применить.
Всем спасибо и увидимся!
tags: #networks
—
🔔 @bashdays➡️ @gitgate
Допустим покупаешь ты себе облачный vps. Этому серверу автоматически назначается IP адрес, по которому ты можешь подключиться по ssh.
Например у AEZA есть услуга: Добавить IP адрес. То есть к серверу можно привязать 2 айпишника.
Я люблю такие штуки, но абсолютный профан в сетях. Купил услугу, второй айпишник автоматически прикрутился. Теперь я могу заходить на сервер по ssh либо через первый IP либо через второй.
Смотрим сетевые настройки:
/etc/networksauto ens3
iface ens3 inet static
address 62.60.238.33
netmask 255.255.255.255
gateway 10.0.0.1
dns-nameservers 1.1.1.1 8.8.8.8
auto ens3:0
iface ens3:0 inet static
address 62.60.238.133
netmask 255.255.255.255
dns-nameservers 1.1.1.1 8.8.8.8
Всё логично и красиво. Айпишники прописаны статично, никакого
dhcp и плавающих адресов с выходом на роутере.Если я сделаю так:
curl ifconfig.me
То в выхлопе получу первый IP адрес (62.60.238.33).
Про сервисы вроде ifconfig писал в этом посте.
Но как мне выходить в интернет с конкретного IP адреса?
Можно курлыкнуть так:
curl --interface 62.60.238.133 ifconfig.me
curl --interface ens3:0 ifconfig.me
Пошли дальше. Давай настроим маршрутизацию, чтобы 50% трафика выходило через первый айпишник, а 50% через второй.
Открываем
/etc/networks и комментим блок со вторым IP адресом:auto lo
iface lo inet loopback
auto ens3
iface ens3 inet static
address 62.60.238.33
netmask 255.255.255.255
gateway 10.0.0.1
dns-nameservers 1.1.1.1 8.8.8.8
# auto ens3:0
# iface ens3:0 inet static
# address 62.60.238.133
# netmask 255.255.255.255
# dns-nameservers 1.1.1.1 8.8.8.8
Далее хуячим в терминале:
ip addr add 62.60.238.133/32 dev ens3
iptables -t nat -A POSTROUTING -o ens3 -m statistic --mode random --probability 0.5 -j SNAT --to-source 62.60.238.33
iptables -t nat -A POSTROUTING -o ens3 -m statistic --mode random --probability 0.5 -j SNAT --to-source 62.60.238.133
ip route flush cache
Добавляем второй айпишник на тот-же интерфейс где уже присвоен айпишник. А правила iptables изменяют исходный IP на с вероятностью 50%, когда пакеты проходят через интерфейс ens3.
Проверяем:
for i in {1..5}; do curl https://ifconfig.me; echo ""; sleep 5; done
62.60.238.33
62.60.238.133
62.60.238.133
62.60.238.33
62.60.238.33ЗАЕБИСЬ! Теперь наш сервер выходит в интернеты с разных IP адресов.
Что с этим делать дальше? Хуй знает, я показал тебе концепт работы с двумя айпишниками, а ты уже дальше прикидывай где и как это можешь использовать.
В идеале запустить какойнить wireguard и ходить по сайтикам светя то одним адресом, то другим. Короче не знаю, накидывай в комменты, где это можно применить.
Всем спасибо и увидимся!
tags: #networks
—
Please open Telegram to view this post
VIEW IN TELEGRAM
19 72 15
Тут недавно в чатике была поднята интересная тема про sftp И я решил проверить и немного систематизировать знания.
Итак: если пользователю прописать оболочкой
Это вовсе не означает, что пользователь не может получить доступ к системе.
Да, он не может залогиниться с клавиатуры и зайти по ssh. Но он вполне МОЖЕТ ПОЛУЧИТЬ ДОСТУП К ФАЙЛАМ по sftp при условии, что в файле
Логика разработчиков вполне понятна. Работал человек, работал, доступ ему закрыли, но результат работы забрать может. Это, похоже на то, как жена выставляет чемодан у двери гулящему мужу.
Заткнуть эту дырку очень просто. В файле
Теперь проверка правильности конфигурации и перезапуск службы в случае успеха.
В этом случае при попытке входа по sftp получим сообщение:
ㅤ
Received message too long 1416128883 Ensure the remote shell produces no output for non-interactive sessions.
Резюмирую: При оболочке nologin можно получить доступ к файлам если sftp internal-sftp.
Сможешь спать спокойно, не заглянув в
tags: #linux #security © by Tagd Tagd
—
🔔 @bashdays➡️ @gitgate
Напоминаю: БЕЗДУМНАЯ ПРАВКА СИСТЕМНЫХ ФАЙЛОВ МОЖЕТ ПРИВЕСТИ НЕРАБОТОСПОСОБНОСТИ СЕРВЕРА.
Итак: если пользователю прописать оболочкой
/usr/sbin/nologinsudo usermod -s /usr/sbin/nologin user
Это вовсе не означает, что пользователь не может получить доступ к системе.
Да, он не может залогиниться с клавиатуры и зайти по ssh. Но он вполне МОЖЕТ ПОЛУЧИТЬ ДОСТУП К ФАЙЛАМ по sftp при условии, что в файле
/etc/ssh/sshd_config есть строка Subsystem sftp internal-sftp, не знаю как сейчас, а раньше эта подсистема была установлена по-умолчанию.Логика разработчиков вполне понятна. Работал человек, работал, доступ ему закрыли, но результат работы забрать может. Это, похоже на то, как жена выставляет чемодан у двери гулящему мужу.
Заткнуть эту дырку очень просто. В файле
/etc/ssh/sshd_config заменим подсистему sftp:#Subsystem sftp internal-sftp
Subsystem sftp /usr/lib/openssh/sftp-server
Теперь проверка правильности конфигурации и перезапуск службы в случае успеха.
sudo sshd -t && sudo systemctl restart sshd
В этом случае при попытке входа по sftp получим сообщение:
ㅤ
Received message too long 1416128883 Ensure the remote shell produces no output for non-interactive sessions.
Резюмирую: При оболочке nologin можно получить доступ к файлам если sftp internal-sftp.
Сможешь спать спокойно, не заглянув в
/etc/ssh/sshd_config ? :-)tags: #linux #security © by Tagd Tagd
—
Please open Telegram to view this post
VIEW IN TELEGRAM
11 56 11
FALSE!
Ну, еще одна статейка для укрепления нервов.
Все знают, что для блокировки пользователя нужно использовать команду:
Эта команда добавляет знак «!» перед полем пароля, что делает его недопустимым, тем самым блокируя.
Все это дело происходит в файле
Читаем
Ахренеть. Я тут пользователя блокернул, а он войти может.
Проверяем. Точно, по ssh, через ключ, входит и выходит. Замечательно выходит!
Лирическое отступление: В мане
Понимаете для чего нужна опция PermitEmptyPasswords в файле
Напоминаю, что если установить пользователю оболочку
➡️ Что делать для полной блокировки пользователя?
Воспользоваться "оболочкой
Резюмирую:
При блокировке пароля возможен доступ по ключу.
tags: #linux #security © by Tagd Tagd
—
🔔 @bashdays➡️ @gitgate
Ну, еще одна статейка для укрепления нервов.
Напоминаю: БЕЗДУМНАЯ ПРАВКА СИСТЕМНЫХ ФАЙЛОВ МОЖЕТ ПРИВЕСТИ НЕРАБОТОСПОСОБНОСТИ СЕРВЕРА.
Все знают, что для блокировки пользователя нужно использовать команду:
sudo usermod -L username
Эта команда добавляет знак «!» перед полем пароля, что делает его недопустимым, тем самым блокируя.
Все это дело происходит в файле
/etc/shadow, где хранятся зашифрованные пароли пользователей.Читаем
man shadow:Если поле пароля содержит строку, которая не удовлетворяет требованиям crypt(3), например содержит «!» или, то пользователь не сможет использовать этот пароль unix для входа (но может войти в систему под другими паролями).
Ахренеть. Я тут пользователя блокернул, а он войти может.
Проверяем. Точно, по ssh, через ключ, входит и выходит. Замечательно выходит!
Лирическое отступление: В мане
shadow также написано, что пароль вообще может быть пустым, но некоторые программы могут запретить его использование.Понимаете для чего нужна опция PermitEmptyPasswords в файле
/etc/ssh/sshd_config?Напоминаю, что если установить пользователю оболочку
/usr/sbin/nologin, то иногда этот пользователь может получить доступ к файлам через sftp (при установленной подсистеме internal-sftp).Воспользоваться "оболочкой
/usr/bin/false" Она просто возвращает код ошибки.Резюмирую:
При блокировке пароля возможен доступ по ключу.
/usr/sbin/nologin иногда дает доступ к файлам/usr/bin/false не дает, стерва.man usermod shadow sshd_config
tags: #linux #security © by Tagd Tagd
—
Please open Telegram to view this post
VIEW IN TELEGRAM
13 82 11