Принцесса для снятия стресса
Привет. Когда ты создаешь новый docker контейнер, то по умолчанию этому контейнеру назначается имя. Откуда оно берется?
Например:
Окей. После некоторого ресёрча оказалось, что 90% докера написано на Golang. Вот это поворот!
Порывшись еще немного, нашел функцию по генерации этих имен для контейнеров.
➡️ Посмотреть можешь тут.
ㅤ
Мотаем этот код в самый низ и видим забавную хуйню:
Этакая пасхалочка. Но зачем все эти имена?
Да чтобы удобнее было манипулировать контейнерами, вот и вся идея этой возни.
Ну и на закуску адаптируем полученные знания на bash, генератор может выглядеть так:
После запуска скрипта, на экран выведутся 10 случайных имен в стиле docker. Количество можешь гибко менять.
Теперь ты в праве заполнить массивы своими данными и генерировать уникальные имена, например:
А потом использовать сразу в командах:
Есть еще такая штука:
Это выплюнет тебе подобное имя прям в консоли без скриптов и приседаний.
А еще есть библиотека на питоне — codenamize, которая проворачивает тоже самое.
Короче есть из чего выбрать. В общем пользуйся, прикручивай, изучай!
tags: #linux #bash #docker
—
🔔 ➡️
Привет. Когда ты создаешь новый 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
—
🔔 ➡️
✊ С пятницей ребят!
Недавно пришло письмо от мейл.ру мол у вас SPF запись пиздец хуёвая.
Я человек простой — вижу хуйню, прохожу мимо. Но тут пройти не смог, какой-то животный интерес возник. Что это еще за 10 допустимых запросов?
Проресерчив тему, нашел сервис SPF Surveyor который как раз анализирует текущую SPF запись и выводит результат.
➡️ Рекомендую добавить сервис в закладки, для дебага самое оно!
От результата я знатно прихуел, вот моя SPF:
И результат: 36/10
И чо мне с этим делать? Для начала убрал mx и a, по итогу получил результат: 18/10. Уже лучше, поехали дальше оптимизировать!
А дальше оптимизировать нечего! По крайней мере я нихуя с этим больше не смог ничего сделать. Выкидывать инклуды нельзя, тупо нет лишнего.
Перегуглил… нииихуууя!
И как это дерьмище сокращать? Если каждый инклуд содержит в себе еще сабинклуды. Сука!
Короче пост не про решение проблемы, а про сервис SPF Surveyor.
Ну а если ты знаешь как этого босса проходить (мож ты гуру почтовых серверов, а мы и не знали), напиши пару строчек в комменты, обещаю админ чатика за технические коменты не забанит.
Такие дела…
tags: #рабочиебудни
—
🔔 ➡️
Недавно пришло письмо от мейл.ру мол у вас 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: #рабочиебудни
—
🔔 ➡️
Начало месяца - время делать бэкапы. О бэкапах уже столько сказано, что еще одна статья ничего нового не добавит, но тем не менее позволю себе поделиться своим опытом.
ㅤ
Сразу скажу, что не бывает правильных и неправильных схем архивирования. Бывают те, которые подходят для вашей задачи и не подходят.
Пока мой архив был меньше 10 Тб, я не понимал, нахрена нужны инкрементные копии? А у кого-то петабайты...
Архивы настолько важны, что я даже слов подобрать не могу. Архивы - единственное, что может остаться после критического сбоя/атаки.
Инфраструктуру можно поднять - это вопрос времени, но есть данные, которые нарабатывались несколько лет, и именно их потеря может быть очень критичной.
И из этого следует, что СХД для архивов должна быть самым защищенным элементом инфраструктуры. Очень хорошо, если на эту машину нельзя попасть никаким способом, кроме физического доступа.
Кроме этого. СХД - тоже компьютер, поэтому тоже может выйти из строя. Поэтому необходимо хранить данные еще и отдельно на внешних дисках.
Причем дисков должно быть минимум два с чередованием (месячным, недельным, ежедневным не важно, но чередование должно быть). Кроме того, есть холивар, по поводу того, кто должен быть инициатором соединения при архивировании - СХД или рабочий сервер.
Просто подумайте, кто больше подвержен атаке клиент или сервер. Конечно сервер. Поэтому для обеспечения минимальной безопасности архивов инициировать соединение должна СХД.
Я для себе решил вопрос с помощью "перевалочной базы" - Машины, на которую сервера сваливают одну дневную копию, и с которой СХД забирает все архивы.
Т.е. и рабочие сервера и СХД в этой схеме являются клиентами. Дело в том, что хорошо защитить один перевалочный сервер проще, чем каждый рабочий сервер.
Не буду напоминать, что каждый клиент загружает копию под своей учеткой, чтобы в случае взлома сервера нельзя было поломать архивы соседних серверов.
Но в этой схеме тоже есть недостатки дополнительное место, двойной расход сетевого трафика, да и машина нужна. В общем, за надежность всегда приходится платить.
Но кроме этого, я сохраняю несколько дневных копий (до 7 штук) прям на сервере, на тот случай, если с данными накосячат пользователи. Причем последнюю копию даже не сжимаю и не шифрую.
Ну, и остался вопрос именования архивов. Кто-то использует даты в имени и удаляет по устареванию. Я использую цифры и провожу ротацию по одному файлу за раз. Потому что в случае атаки на сервер времени дата-именованные архивы можно потерять за раз.
Для нумерованных архивов для атаки - дату нужно менять несколько раз.
Причем число раз будет зависеть от схемы.
В общем резюмирую:
1. Хороших и плохих схем архивирования не существует - есть такие, которые подходят вам и не подходят.
2. СХД - самая защищенная машина инфраструктуры. Без возможности управления по сети.
3. Есть внешние копии с чередованием, на случай выхода из строя СХД.
4. Архивные копии между СХД и сервером передаются через промежуточную машину.
5. Несколько дневных копий можно ДОПОЛНИТЕЛЬНО хранить на самом рабочем сервере.
6. Используем нумерованные архивы с ротацией.
Холивар в коммментах приветствуется.
tags: #рабочиебудни © by Tagd Tagd
—
🔔 ➡️
ㅤ
Сразу скажу, что не бывает правильных и неправильных схем архивирования. Бывают те, которые подходят для вашей задачи и не подходят.
Пока мой архив был меньше 10 Тб, я не понимал, нахрена нужны инкрементные копии? А у кого-то петабайты...
Архивы настолько важны, что я даже слов подобрать не могу. Архивы - единственное, что может остаться после критического сбоя/атаки.
Инфраструктуру можно поднять - это вопрос времени, но есть данные, которые нарабатывались несколько лет, и именно их потеря может быть очень критичной.
И из этого следует, что СХД для архивов должна быть самым защищенным элементом инфраструктуры. Очень хорошо, если на эту машину нельзя попасть никаким способом, кроме физического доступа.
Кроме этого. СХД - тоже компьютер, поэтому тоже может выйти из строя. Поэтому необходимо хранить данные еще и отдельно на внешних дисках.
Причем дисков должно быть минимум два с чередованием (месячным, недельным, ежедневным не важно, но чередование должно быть). Кроме того, есть холивар, по поводу того, кто должен быть инициатором соединения при архивировании - СХД или рабочий сервер.
Просто подумайте, кто больше подвержен атаке клиент или сервер. Конечно сервер. Поэтому для обеспечения минимальной безопасности архивов инициировать соединение должна СХД.
Я для себе решил вопрос с помощью "перевалочной базы" - Машины, на которую сервера сваливают одну дневную копию, и с которой СХД забирает все архивы.
Т.е. и рабочие сервера и СХД в этой схеме являются клиентами. Дело в том, что хорошо защитить один перевалочный сервер проще, чем каждый рабочий сервер.
Не буду напоминать, что каждый клиент загружает копию под своей учеткой, чтобы в случае взлома сервера нельзя было поломать архивы соседних серверов.
Но в этой схеме тоже есть недостатки дополнительное место, двойной расход сетевого трафика, да и машина нужна. В общем, за надежность всегда приходится платить.
Но кроме этого, я сохраняю несколько дневных копий (до 7 штук) прям на сервере, на тот случай, если с данными накосячат пользователи. Причем последнюю копию даже не сжимаю и не шифрую.
Ну, и остался вопрос именования архивов. Кто-то использует даты в имени и удаляет по устареванию. Я использую цифры и провожу ротацию по одному файлу за раз. Потому что в случае атаки на сервер времени дата-именованные архивы можно потерять за раз.
Для нумерованных архивов для атаки - дату нужно менять несколько раз.
Причем число раз будет зависеть от схемы.
В общем резюмирую:
1. Хороших и плохих схем архивирования не существует - есть такие, которые подходят вам и не подходят.
2. СХД - самая защищенная машина инфраструктуры. Без возможности управления по сети.
3. Есть внешние копии с чередованием, на случай выхода из строя СХД.
4. Архивные копии между СХД и сервером передаются через промежуточную машину.
5. Несколько дневных копий можно ДОПОЛНИТЕЛЬНО хранить на самом рабочем сервере.
6. Используем нумерованные архивы с ротацией.
Холивар в коммментах приветствуется.
tags: #рабочиебудни © by Tagd Tagd
—
🔔 ➡️
Не ssh, но близко — sftp.
Классная вещь, со своими достоинствами и недостатками. Гораздо круче, чем
ㅤ
По сравнению с
Из минусов - может создавать нагрузку на проц. В openssh включен из коробки. Поэтому если есть доступ по
А вот обратное - не всегда верно. Иногда бывает нужно разрешить пользователям доступ по
Вот, для этого есть решение — mysecureshell.
Для debian можно поставить:
После этого у вас появляется свой собственный
Возможностью ограничить пользователя только своим каталогом. И еще работа с виртуальными серверами. Рекомендую.
Достаточно пользователю прописать в качестве оболочки mysecureshell - и он человек, ограниченный файловой подсистемой. Кстати, список доступных оболочек можно глянуть так:
А изменить, например так:
Конфигурируется данное чудо путем редактирования файла
Кстати, отлично сочетается с
А вот с
Репа Mysecureshell
Документация
tags: #linux #utilites © by Tagd Tagd
—
🔔 ➡️
Классная вещь, со своими достоинствами и недостатками. Гораздо круче, чем
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
—
🔔 ➡️
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 #рабочиебудни
—
🔔 ➡️
Я давненько пользуюсь 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 #рабочиебудни
—
🔔 ➡️
Покопавшись с вопросом по 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: #рабочиебудни
—
🔔 ➡️
ㅤ
Выписал, получилось достаточно много, строчка 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: #рабочиебудни
—
🔔 ➡️
Так, про aeza, коллизия вышла
aeza.ru - находится в юрисдикции РФ и рассчитан на юридических лиц.
aeza.net - находится в юрисдикции Великобритании.
аккаунты как оказалось не сквозные , все решилось, всем кто принял участие в решении вопроса — спасибо!
Теперь у меня есть прямые контакты, буду теперь заебывать их в личку )
aeza.ru - находится в юрисдикции РФ и рассчитан на юридических лиц.
aeza.net - находится в юрисдикции Великобритании.
аккаунты как оказалось не сквозные , все решилось, всем кто принял участие в решении вопроса — спасибо!
Теперь у меня есть прямые контакты, буду теперь заебывать их в личку )
Интересный вопрос сегодня залетел:
Давай посмотрим что происходит в кишках в это время. Давненько мы с тобой в
ㅤ
Предположим есть bash скрипт с функциями:
functions.sh
И основной скрипт, который сорсит файл с функциями:
test_script.sh
Не забываем сделать:
Запускаем
И видим:
То есть в контексте скрипта
При втором вызове функции всё считалось из памяти.
Если бы файл
Грубо говоря при каждом запуске
Вроде очевидно, но порой заставляет задуматься.
Изучай!
tags: #bash #debug #linux
—
🔔 ➡️
Если функции, вынесены в файл, подключенный через 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
—
🔔 ➡️
Все умрут, а я root!
Еще раз всем здрасти, раз в неделю в рандомный момент буду разыгрывать пиццу 🍕 (1000р). Кто первый в комменты напишет ответ на задачку, тот и забирает приз.
Чуть позже сделаю еще 2 призовых места с шавухой.
Коммент с ответом должен быть к посту, а не в чатике. А далее к тебе приходит Макс, спрашивает номер РФ карты и закидывает пиццу.
У кого не включены уведомления на канал, ну ты сам виноват!
Поехали:13−6+7 ?
Можешь написать бота, парсить и решать задачки автоматом, но лучше не трать своё время, задачки будут не шаблонные и порой пиздец упоротые.
Еще раз всем здрасти, раз в неделю в рандомный момент буду разыгрывать пиццу 🍕 (1000р). Кто первый в комменты напишет ответ на задачку, тот и забирает приз.
Чуть позже сделаю еще 2 призовых места с шавухой.
Коммент с ответом должен быть к посту, а не в чатике. А далее к тебе приходит Макс, спрашивает номер РФ карты и закидывает пиццу.
У кого не включены уведомления на канал, ну ты сам виноват!
Поехали:
Можешь написать бота, парсить и решать задачки автоматом, но лучше не трать своё время, задачки будут не шаблонные и порой пиздец упоротые.
Сегодня мы рассмотрим одну очень интересную тему. Бывает, что у вас маленькая локалка (/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
—
🔔 ➡️
И нужно, чтобы у некоторых групп пользователей были разные внешние 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
—
🔔 ➡️
Сегодня про айпишники.
Допустим покупаешь ты себе облачный vps. Этому серверу автоматически назначается IP адрес, по которому ты можешь подключиться по ssh.
Например у AEZA есть услуга: Добавить IP адрес. То есть к серверу можно привязать 2 айпишника.
Я люблю такие штуки, но абсолютный профан в сетях. Купил услугу, второй айпишник автоматически прикрутился. Теперь я могу заходить на сервер по ssh либо через первый IP либо через второй.
Смотрим сетевые настройки:
Всё логично и красиво. Айпишники прописаны статично, никакого
Если я сделаю так:
То в выхлопе получу первый IP адрес (62.60.238.33).
Но как мне выходить в интернет с конкретного IP адреса?
Можно курлыкнуть так:
Пошли дальше. Давай настроим маршрутизацию, чтобы 50% трафика выходило через первый айпишник, а 50% через второй.
Открываем
Далее хуячим в терминале:
Проверяем:
ЗАЕБИСЬ! Теперь наш сервер выходит в интернеты с разных IP адресов.
Что с этим делать дальше? Хуй знает, я показал тебе концепт работы с двумя айпишниками, а ты уже дальше прикидывай где и как это можешь использовать.
В идеале запустить какойнить wireguard и ходить по сайтикам светя то одним адресом, то другим. Короче не знаю, накидывай в комменты, где это можно применить.
Всем спасибо и увидимся!
tags: #networks
—
🔔 ➡️
Допустим покупаешь ты себе облачный vps. Этому серверу автоматически назначается IP адрес, по которому ты можешь подключиться по ssh.
Например у AEZA есть услуга: Добавить IP адрес. То есть к серверу можно привязать 2 айпишника.
Я люблю такие штуки, но абсолютный профан в сетях. Купил услугу, второй айпишник автоматически прикрутился. Теперь я могу заходить на сервер по ssh либо через первый IP либо через второй.
Смотрим сетевые настройки:
/etc/networks
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
Всё логично и красиво. Айпишники прописаны статично, никакого
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
—
🔔 ➡️
FALSE!
Ну, еще одна статейка для укрепления нервов.
Все знают, что для блокировки пользователя нужно использовать команду:
Эта команда добавляет знак «!» перед полем пароля, что делает его недопустимым, тем самым блокируя.
Все это дело происходит в файле
Читаем
Ахренеть. Я тут пользователя блокернул, а он войти может.
Проверяем. Точно, по ssh, через ключ, входит и выходит. Замечательно выходит!
Лирическое отступление: В мане
Понимаете для чего нужна опция PermitEmptyPasswords в файле
Напоминаю, что если установить пользователю оболочку
➡️ Что делать для полной блокировки пользователя?
Воспользоваться "оболочкой
Резюмирую:
При блокировке пароля возможен доступ по ключу.
tags: #linux #security © by Tagd Tagd
—
🔔 ➡️
Ну, еще одна статейка для укрепления нервов.
Напоминаю: БЕЗДУМНАЯ ПРАВКА СИСТЕМНЫХ ФАЙЛОВ МОЖЕТ ПРИВЕСТИ НЕРАБОТОСПОСОБНОСТИ СЕРВЕРА.
Все знают, что для блокировки пользователя нужно использовать команду:
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
—
🔔 ➡️
Включаем режим параноика.
Все, и не раз слышали про то, что ходить по ссылкам не хорошо. Особенно, если эти ссылки непонятно откуда.
ㅤ
Но почему-то многие думают, что это касается только ссылок
Тут на недавно проскакивала тема про Консольные онлайн Telnet/SSH игры.
Посмотрим на это глазами параноика: Что происходит, когда вы подключаетесь к ссылке вида
Просто в логах сервера отобразится ваш IP. Ситуация усугубляется, когда вы заходите на ссылку вида
В этом случае в логах отобразится не только адрес, но и логин текущего пользователя.
Прикиньте, есть ip и уже есть логин. Осталось подобрать пароль. Я бы на месте малышей-плохишей специально рыскал бы по github в поисках всякой прикольной фигни и собирал пары ip/login.
Да и логин, не какой-то там test, а реально используемый - сам по себе ценный ресурс.
Поэтому не ходите по ссылкам с рабочих машин, а если видите ссылку
Прошу прощениt за тему, которая и так всех задолбала.
tags: #linux #security © by Tagd Tagd
—
🔔 ➡️
Все, и не раз слышали про то, что ходить по ссылкам не хорошо. Особенно, если эти ссылки непонятно откуда.
ㅤ
Но почему-то многие думают, что это касается только ссылок
http:// https:// ftp://.
Тут на недавно проскакивала тема про Консольные онлайн Telnet/SSH игры.
Посмотрим на это глазами параноика: Что происходит, когда вы подключаетесь к ссылке вида
ssh user.dom.
Ну, ничего страшного.Просто в логах сервера отобразится ваш IP. Ситуация усугубляется, когда вы заходите на ссылку вида
ssh addr.dom.
В этом случае в логах отобразится не только адрес, но и логин текущего пользователя.
Прикиньте, есть ip и уже есть логин. Осталось подобрать пароль. Я бы на месте малышей-плохишей специально рыскал бы по github в поисках всякой прикольной фигни и собирал пары ip/login.
Да и логин, не какой-то там test, а реально используемый - сам по себе ценный ресурс.
Поэтому не ходите по ссылкам с рабочих машин, а если видите ссылку
ssh addr.dom
не поленитесь и добавьте пользователя test.dom
, чтобы не светить свой реальный логин.Прошу прощениt за тему, которая и так всех задолбала.
tags: #linux #security © by Tagd Tagd
—
🔔 ➡️
Хелоу! А какую команду ты запускаешь первой, когда поднял linux сервак/десктоп (vps/vds, виртулка, бареметал и т.п.)?
ㅤ
У меня руки на автомате вбивают:
Но несколько раз видел как люди первым делом отключали selinux и отправляли машину в ребут. А потом уже всё остальное.
А как делаешь ты? Камон в комменты обсудим, интересно на твои паттерны посмотреть.
tags: #linux #рабочиебудни
—
🔔 ➡️
ㅤ
У меня руки на автомате вбивают:
apt update && apt upgrade && apt install mc
.Но несколько раз видел как люди первым делом отключали selinux и отправляли машину в ребут. А потом уже всё остальное.
А как делаешь ты? Камон в комменты обсудим, интересно на твои паттерны посмотреть.
tags: #linux #рабочиебудни
—
🔔 ➡️
Здрасти. Как-то я писал про
Ниже скрипт который автоматически прономерует системные вызовы для последующих инъекций.
Сохраняем это безобразие в файл
Теперь получаем такой выхлоп:
Смотрим второй столбик, включаем логику и видим, что системные вызовы нумеруются.
Например, возьмем системный вызов
ㅤ
Теперь берем нужный номер системного вызова и применяем инъекцию. Как это сделать и для чего, опять же показывал на примерах (ссылки в начале этого поста).
Тема крутая, не нужно ебаться и считать руками.
Весь вывод
А чтобы получить только трассировку, можно сделать так:
Если бесит подсветка, выпили из перловского скрипта управляющий символ «
Такие дела, изучай!
tags: #linux #debug
—
🔔 ➡️
strace
и как применять инъекции. Если пропустил, то читай тут и тут.Ниже скрипт который автоматически прономерует системные вызовы для последующих инъекций.
#!/usr/bin/perl
use strict;
use warnings;
my %numbs;
select STDERR;
while(<STDIN>) {
if( /^[0-9]++\s++([a-z0-9_]++(?=\())/ ) {
my $t = ++$numbs{$1};
s/\s+/ \e[31m$t\e[m /;
die $! if( keys %numbs == 1000 );
}
print;
}
exit(0);
Сохраняем это безобразие в файл
num_syscalls
и делаем chmod +x
, ну а дальше запускаем в связке с strace
:strace -o'|./num_syscalls' -yf sh -c 'ls|cat'
Теперь получаем такой выхлоп:
456107 48 close(3</usr/) = 0
456107 52 rt_sigreturn({mask=[]})
456107 63 openat(AT_FDCWD</usr/local/sbin>)
456107 53 newfstatat(3)
456107 64 openat(AT_FDCWD</usr/local/sbin>)
Смотрим второй столбик, включаем логику и видим, что системные вызовы нумеруются.
Например, возьмем системный вызов
openat
, видим 63, 64. Это значит что openat
был вызван 64 раза. А newfstatat
53.ㅤ
Теперь берем нужный номер системного вызова и применяем инъекцию. Как это сделать и для чего, опять же показывал на примерах (ссылки в начале этого поста).
Тема крутая, не нужно ебаться и считать руками.
Весь вывод
strace
отправляется в stderr
, чтобы иметь возможность разделять вывод трассировки и вывод исследуемой программы.А чтобы получить только трассировку, можно сделать так:
strace -o'|./num_syscalls' -yf ls > /dev/null
Если бесит подсветка, выпили из перловского скрипта управляющий символ «
\e[31m\[em
».Такие дела, изучай!
tags: #linux #debug
—
🔔 ➡️
Задача та же. 8 ферзей.
Предыдущая часть здесь: Воспользуемся тонкостями языка. На шахматной доске 8 клеток (тут может круто подойти восьмеричная система.) Таким образом заменяем 8 вложенных циклов всего одним!!!, с преобразованием числа в восьмеричное.
Каждая цифра - отдельный столбец.
ㅤ
Значение - номер строки.
Обратите внимание тело цикла пустое! Если цикл прошел полностью - дублей нет. Вау.
Алгоритм пермутаций без повторений методом перебора. (проверка на горизонталь).
Дальше аналогично предыдущей программе, кроме
Просто отбрасываем "-". Как конструкция по скорости не знаю, не проверял.
Программа отработала примерно за 41с.
Какой-то код маленький получился, и работает быстрее. Но, главное результаты совпадают.
Кто там хотел изучать bash?
Слабо реализовать на чистом bash?
Интересно было бы и время выполнения сравнить.
tags: #bash © by Tagd Tagd
—
🔔 ➡️
Предыдущая часть здесь: Воспользуемся тонкостями языка. На шахматной доске 8 клеток (тут может круто подойти восьмеричная система.) Таким образом заменяем 8 вложенных циклов всего одним!!!, с преобразованием числа в восьмеричное.
Каждая цифра - отдельный столбец.
ㅤ
Значение - номер строки.
#!/bin/bash
#8 ферзей
awk 'BEGIN{
i=8^8
while(i--){
c=sprintf("%08o",i)
j=8
while(index(c,--j)){}
if(j<0){
j=8
while(j--){q[j]=substr(c,j+1,1)}
b=1
for(m=0;m<7 && b;m++){
for(j=m+1;j<8;j++){
a=q[m]-q[j];sub(/-/,"",a)
if(a==(j-m)){b=0;break}}}
if(b){print c}
}}}'
#---
while(index(c,--j)){}
- чисел всего 8(0-7), если index=0
(нет цифры j в числе с из 8 цифр, значит каких-то цифр 2).Обратите внимание тело цикла пустое! Если цикл прошел полностью - дублей нет. Вау.
Алгоритм пермутаций без повторений методом перебора. (проверка на горизонталь).
while(j--){q[j]=substr(c,j+1,1)}
- преобразовали число c в массив цифр q[]
Дальше аналогично предыдущей программе, кроме
sub(/-/,"",a)
- еще один аналог модуля.Просто отбрасываем "-". Как конструкция по скорости не знаю, не проверял.
Программа отработала примерно за 41с.
Какой-то код маленький получился, и работает быстрее. Но, главное результаты совпадают.
Кто там хотел изучать bash?
Слабо реализовать на чистом bash?
Интересно было бы и время выполнения сравнить.
tags: #bash © by Tagd Tagd
—
🔔 ➡️
Сегодня поговорим про подводные грабли.
ㅤ
Работая над скриптом решил немного оптимизировать код. А чего, зачем цикл, если строка всего одна.
А не тут то было.
Во втором случае read не читает значение. Точнее читает, иначе бы скрипт ожидал ввода с клавиатуры, но переменная REPLY пустая.
Перечитал help по read. Ничего не пойму. Пришлось обратиться к Роману.
Он пояснил, что во втором случае команда read запускается в отдельном subshell, считывает значение. Вот только передать переменную можно только в дочерние процессы, а в родительские нельзя.
Поэтому при завершении процесса read значение переменной REPLY теряется.
Пришлось читать, как работают конвейеры. Здесь писать не буду. Просто приведу ссылку на wiki: https://bit.ly/4fajufR
Оптимизировать можно, но так:
Все, теперь я знаю, как работает pipeline. Надеюсь и Вы.
tags: #bash © by Tagd Tagd
—
🔔 ➡️
ㅤ
Работая над скриптом решил немного оптимизировать код. А чего, зачем цикл, если строка всего одна.
echo "1"|
while read; do
echo $REPLY,2
done
# на
echo "1"| read
echo $REPLY,2
А не тут то было.
1,2
,2
Во втором случае read не читает значение. Точнее читает, иначе бы скрипт ожидал ввода с клавиатуры, но переменная REPLY пустая.
Перечитал help по read. Ничего не пойму. Пришлось обратиться к Роману.
Он пояснил, что во втором случае команда read запускается в отдельном subshell, считывает значение. Вот только передать переменную можно только в дочерние процессы, а в родительские нельзя.
Поэтому при завершении процесса read значение переменной REPLY теряется.
Пришлось читать, как работают конвейеры. Здесь писать не буду. Просто приведу ссылку на wiki: https://bit.ly/4fajufR
Оптимизировать можно, но так:
echo "1"| (read;echo $REPLY,2)
#или так
read < <(echo "1")
echo $REPLY,2
# если переменная одна то классика
a=$(echo 1)
Все, теперь я знаю, как работает pipeline. Надеюсь и Вы.
tags: #bash © by Tagd Tagd
—
🔔 ➡️
Хотите освоить управление файлами в РЕД ОС как профессионал? Приходите на бесплатный открытый урок "Работа с файлами и каталогами в РЕД ОС"!
🔥 Погружение в мир файловой системы РЕД ОС:
Разберемся с основами: файлы, каталоги, пути, и как они работают.
Научимся создавать, редактировать, переименовывать файлы и папки, словно вы гуру Linux.
Освободим вас от страха перед командной строкой, научимся создавать новые файлы с помощью удобных команд.
Прокачаем ваши навыки навигации по файловой системе: абсолютные и относительные пути, никаких "заблуждений"!
Поймем, как работать с пробелами и специальными символами, чтобы больше не было неприятных сюрпризов.
💪 Кому будет полезно:
Системным администраторам, уже знающим Linux, но желающим покорить РЕД ОС.
Тем, кто хочет выйти за рамки базовых знаний и освоить тонкости управления файлами.
🎁 Что вы получите:
Практические навыки использования команд для работы с файлами и каталогами.
Уверенность в организации файловой структуры, чтобы найти нужны...
🔥 Погружение в мир файловой системы РЕД ОС:
Разберемся с основами: файлы, каталоги, пути, и как они работают.
Научимся создавать, редактировать, переименовывать файлы и папки, словно вы гуру Linux.
Освободим вас от страха перед командной строкой, научимся создавать новые файлы с помощью удобных команд.
Прокачаем ваши навыки навигации по файловой системе: абсолютные и относительные пути, никаких "заблуждений"!
💪 Кому будет полезно:
Системным администраторам, уже знающим Linux, но желающим покорить РЕД ОС.
Тем, кто хочет выйти за рамки базовых знаний и освоить тонкости управления файлами.
🎁 Что вы получите:
Практические навыки использования команд для работы с файлами и каталогами.
Уверенность в организации файловой структуры, чтобы найти нужны...
👍1
Мало кто знает что у cloudflare есть фича, которая раньше называлась Argo Tunnel, а сейчас это просто Tunnels. И да, она бесплатная.
⚪ А чо делает?
Смотри, к примеру у тебя локально поднят виртуалбокс (proxmox), а в нем крутятся виртуалки. В какой-то момент тебе понадобилось прокинуть эту виртуалку в интернет. А у тебя дома несколько роутеров, NAT, нет белого айпишника, короче полный набор подводных камней и хуйни.
ㅤ
В теории можно прокинуть на роутере порты, задействовать через API привязку динамического IP адреса к домену. Ну или в крайнем случае воспользоваться ngrok и т.п. решениями.
Грубо говоря можешь свой локальный proxmox на малине посадить на домен и он будет доступен из интернета с автоматическим ssl и всеми плюшками. Аналогично как и свой домашний гитлаб.
Запрятана эта фича знатно и глубоко, поэтому про нее говорят в основном в англоязычном сегменте.
⚪ Как настроить?
Настройку я вынес в отдельную статью. С картинками будет намного понятнее, что происходит и как это работает.
Читаем 👇
➡️ Как настроить Tunnels от Cloudflare.
Репа с демоном на гитхабе, можешь поресерчить если интересно что у них там под капотом и что она может у тебя спиздить.
Такие дела!
tags: #linux #networks #рабочиебудни
—
🔔 ➡️
⚪ А чо делает?
Смотри, к примеру у тебя локально поднят виртуалбокс (proxmox), а в нем крутятся виртуалки. В какой-то момент тебе понадобилось прокинуть эту виртуалку в интернет. А у тебя дома несколько роутеров, NAT, нет белого айпишника, короче полный набор подводных камней и хуйни.
ㅤ
В теории можно прокинуть на роутере порты, задействовать через API привязку динамического IP адреса к домену. Ну или в крайнем случае воспользоваться ngrok и т.п. решениями.
Грубо говоря можешь свой локальный proxmox на малине посадить на домен и он будет доступен из интернета с автоматическим ssl и всеми плюшками. Аналогично как и свой домашний гитлаб.
Tunnels — позволяет поднять туннель до cloudflare и сделать что-то вроде приватной сети, где все нужные сервисы за NAT в домашней сети ты без труда повесишь на домен и выставишь жопой в интернет. Причем вообще не напрягаясь.
Запрятана эта фича знатно и глубоко, поэтому про нее говорят в основном в англоязычном сегменте.
⚪ Как настроить?
Настройку я вынес в отдельную статью. С картинками будет намного понятнее, что происходит и как это работает.
Читаем 👇
➡️ Как настроить Tunnels от Cloudflare.
Репа с демоном на гитхабе, можешь поресерчить если интересно что у них там под капотом и что она может у тебя спиздить.
Такие дела!
tags: #linux #networks #рабочиебудни
—
🔔 ➡️
За пост спасибо нашему коллеге и подписчику - Страйфи Ленджок
В современном мире всё больше задач требуют работы с графическими приложениями на удалённых Linux-серверах, особенно с использованием GPU. Это может быть рендеринг в Blender, обучение нейронных сетей или даже облачный гейминг. Существует несколько способов организации такого доступа, каждый из которых имеет свои особенности.
ㅤ
X11 Forwarding через SSH
Один из самых простых методов — использование X11 Forwarding через SSH. Для этого достаточно базового пакета openssh. Подключение осуществляется командой:
ssh -X -p [порт] [пользователь]@[IP_сервера]
Флаг -X включает проброс X11. После подключения можно запускать графические приложения, например:
firefox &
Однако этот метод имеет значительные недостатки. Интерфейс и ввод отображаются с заметной задержкой, особенно при воспроизведении видео или работе с 3D-графикой. Это связано с тем, что X11 Forwarding передаёт по сети каждое действие с окном без оптимизации и сжатия данных.
RDP в Docker с поддержкой GPU
Более современный и эффективный подход — использование RDP-сервера в контейнере Docker с поддержкой GPU. Протокол RDP изначально разработан для работы с удалённым рабочим столом через сеть и использует алгоритмы сжатия и кэширования элементов интерфейса.
Для настройки поддержки GPU в Docker необходимо установить драйверы и nvidia-container-toolkit, а затем настроить Docker для работы с GPU Nvidia:
sudo apt install nvidia nvidia-container-toolkit
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
Для AMD
sudo apt install "linux-headers-$(uname -r)" "linux-modules-extra-$(uname -r)"
sudo usermod -a -G render,video $LOGNAME
wget https://repo.radeon.com/amdgpu-install/6.2.1/ubuntu/noble/amdgpu-install_6.2.60201-1_all.deb
sudo apt install ./amdgpu-install_6.2.60201-1_all.deb
sudo apt update
sudo apt install amdgpu-dkms rocm
sudo reboot
sudo apt install rocminfo
# Добавить в файле `/etc/environment` PATH="/opt/rocm/bin"
docker run --device=/dev/kfd --device=/dev/dri --security-opt seccomp=unconfined <image>
Здесь:
--device=/dev/kfd — предоставляет доступ к основному интерфейсу вычислений.
--device=/dev/dri — предоставляет доступ к интерфейсу прямого рендеринга.
--security-opt seccomp=unconfined — отключает ограничения seccomp для контейнера, что необходимо для корректной работы с GPU.
Далее запускается контейнер с RDP-сервером, например, с использованием образа. После запуска контейнера можно подключиться к нему с помощью RDP-клиента, такого как Remmina, настроив SSH-туннель для безопасности и сжатия трафика.
Этот метод обеспечивает более высокую производительность и комфортную работу с графическими приложениями на удалённом сервере, включая поддержку GPU для задач, требующих аппаратного ускорения.
tags: #linux © by Страйфи Ленджок
—
🔔 ➡️