Фух, закончились 2 часа партнерских интеграций... Недавно я делал пост по отличиям su от sudo, но есть еще одна вкусная альтернатива, которая называется doas.
doas – утилита, которая позволяет обычным пользователям выполнять задачи от имени root, так же как это делает sudo. Она была разработана проектом OpenBSD как минималистичная альтернатива sudo.
Интересно кстати звучит: do ass (делать жопу)
Утилита доступна в большинстве официальных репозиториев. Поэтому с установкой проблем не возникает.
Запускай
Так как doas не входит по умолчанию в коробочные версии linux, утилита требует немного бОльших настроек, в отличие от sudo. Но конфигурация намного проще для понимания чем sudo. Настраивается все это через файл /etc/doas.conf. Если файла нет, создай!
Цель doas - решить сложность sudo.
Давай эмитируем поведение sudo и позволим пользователю выполнять любые команды от пользователя root. Добавляем в конфиг такую херабору:
Теперь пользователь user сможет выполнять команды от root + пользователь получает льготный период, когда не нужно вводить пароль в течение нескольких минут после последовательных команд doas.
Допустим мне нужно сделать подобное, но для определенной группы, добавляем в конфиг строчку:
Теперь все кто заключен в группу wheel смогут побыть рутом. Также и с белым списком команд, которые можно выдать для запуска без пароля:
Да, конфиг более читабельный чем у sudo. И в обозримом будущем есть очень большая вероятность того, что sudo закинут в деприкейтед, а doas сделают основным рабочим инструментом. Так как sudo уже непроходимоегавно болото в плане поддержки кода, который трудно понимать и использовать.
Возьмем даже валидатор конфига visudo. Который проверяет синтаксис конфига. А это говорит о том, что синтаксис файла sudoers ну совсем фу и воняет. Требует проверки. Да и 99% пользователей используют sudo исключительно для установки софта.
Разница налицо (попахивает порнохабом):
Конфиг sudo
Конфиг «делать жопу»
Ну и с помощью doas можно запустить root shell такой командой:
Кстати был казус с портированием под FreeBSD, спустя несколько часов после публикации doas, в ней нашли критическую уязвимость. Которая позволяла выполнить привилегированные операции даже если был указан неверный пароль пользователя. Как обычно накосячил разработчик, который раздеплоился в прод без тестирования. Ну либо специально заложил бекдор, история умалчивает.
Вот такие пироги. Увидимся совсем скоро и сделаем что-нибудь полезное, например сломаем прод, ну или ногу...
tags: #linux #utils
—
💩 @bashdays
doas – утилита, которая позволяет обычным пользователям выполнять задачи от имени root, так же как это делает sudo. Она была разработана проектом OpenBSD как минималистичная альтернатива sudo.
Интересно кстати звучит: do ass (делать жопу)
Утилита доступна в большинстве официальных репозиториев. Поэтому с установкой проблем не возникает.
Запускай
apt install «делатьжопу»
(или какой там у тебя пакетный менеджер) и погнали смотреть на эти булки поближе.Так как doas не входит по умолчанию в коробочные версии linux, утилита требует немного бОльших настроек, в отличие от sudo. Но конфигурация намного проще для понимания чем sudo. Настраивается все это через файл /etc/doas.conf. Если файла нет, создай!
Цель doas - решить сложность sudo.
Давай эмитируем поведение sudo и позволим пользователю выполнять любые команды от пользователя root. Добавляем в конфиг такую херабору:
permit persist user as root
Теперь пользователь user сможет выполнять команды от root + пользователь получает льготный период, когда не нужно вводить пароль в течение нескольких минут после последовательных команд doas.
Допустим мне нужно сделать подобное, но для определенной группы, добавляем в конфиг строчку:
permit persist :wheel as root
Теперь все кто заключен в группу wheel смогут побыть рутом. Также и с белым списком команд, которые можно выдать для запуска без пароля:
permit persist user as root
permit nopass :user as root cmd apt
Да, конфиг более читабельный чем у sudo. И в обозримом будущем есть очень большая вероятность того, что sudo закинут в деприкейтед, а doas сделают основным рабочим инструментом. Так как sudo уже непроходимое
Возьмем даже валидатор конфига visudo. Который проверяет синтаксис конфига. А это говорит о том, что синтаксис файла sudoers ну совсем фу и воняет. Требует проверки. Да и 99% пользователей используют sudo исключительно для установки софта.
Разница налицо (попахивает порнохабом):
Конфиг sudo
%wheel ALL=(ALL) NOPASSWD: ALL
Конфиг «делать жопу»
permit nopass :wheel as root
Ну и с помощью doas можно запустить root shell такой командой:
doas -s
Кстати был казус с портированием под FreeBSD, спустя несколько часов после публикации doas, в ней нашли критическую уязвимость. Которая позволяла выполнить привилегированные операции даже если был указан неверный пароль пользователя. Как обычно накосячил разработчик, который раздеплоился в прод без тестирования. Ну либо специально заложил бекдор, история умалчивает.
Вот такие пироги. Увидимся совсем скоро и сделаем что-нибудь полезное, например сломаем прод, ну или ногу...
tags: #linux #utils
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Привет, дело было вечером, делать было нечего. Начнем это утро с мнемоники прав доступа. Оно нам сегодня вечером пригодится. Возможно будет сумбурно, но постараюсь разжевать. А вечером будем заниматься хитрой стеганографией на bash, как раз с помощью прав доступа.
Для стандартных трех троек прав доступа справедливо следующее:
Сразу обрати внимание на разряды с единицей (1) в двоичной системе счисления. Они соответствуют позициям прав доступа в символьном представлении из вывода команды ls -l.
Наглядная табличка соответствий:
Если на пальцах, у нас есть 3 базовых цифры 1, 2, 4 которые означают такое:
Берем эти цифры, складываем как угодно и получаем например 7, что равно 1+2+4 = rwx (читаем, пишем, исполняем).
Ладно, большинству из вас оно нахрен не вперлось, но я продолжу. У меня коллега например всегда всем ставит 777 даже не задумываясь. Мол всё работает и никогда нет проблем с доступом к файлам и папкам. Ну ок, возможно однажды встретит своего черношляпа и пересмотрит свои практики. Работает кстати в крупном банке. Только представь какой 3.14здец на серверах у него творится где наши денюжки лежат.
Давай по теме. Создаем массив:
Получаем права в двоичной системе счисления:
На экран выведется:
В bash при указании индекса массива можно применять арифметические операции. Давай воспользуемся и наглядно посмотрим как суммируются права доступа.
Получаем:
То есть когда мы делали arr[1] у нас было 000, а когда применили сложение arr[1+2], 000+001 = 011.
В общем математика и кишочки. Голову сильно не забивай, в повседневных задачах достаточно восьмеричной и символичной системы счислений. Из полезного: теперь ты знаешь как создавать массивы и складывать их.
Ну и на закуску команда, которая выведет права в восьмеричной системе:
Получим такое:
Не забываем что у всей этой ерунды есть еще дополнительные биты, это когда права указываются четырьмя цифрами.
Короче базу рассмотрели, если ничо не понял, забей. Это как Джаз, чтобы от него блевать не хотелось, нужно стать старым пердуном. Но мы же с вами еще так молоды!
Увидимся вечером. Хорошего понедельника!
tags: #linux #bash
—
💩 @bashdays
Для стандартных трех троек прав доступа справедливо следующее:
4 2 1 # восьмеричная система
r-- -w- --x # символьное представление
100 010 001 # двоичная система
Сразу обрати внимание на разряды с единицей (1) в двоичной системе счисления. Они соответствуют позициям прав доступа в символьном представлении из вывода команды ls -l.
Наглядная табличка соответствий:
- 0: 000 / —Если требуется определенный набор прав, то складываем 4, 2, 1. Первая строка это, права, которые получаются при сложении.
- 1: 001 / –x
- 2: 010 / -w-
- 3: 011 / -wx
- 4: 100 / r–
- 5: 101 / r-x
- 6: 110 / rw-
- 7: 111 / rwx
3 5 6 7
1+2 1+4 2+4 1+2+4
-wx r-x rw- rwx
011 101 110 111
Если на пальцах, у нас есть 3 базовых цифры 1, 2, 4 которые означают такое:
4 = r
2 = w
1 = x
Берем эти цифры, складываем как угодно и получаем например 7, что равно 1+2+4 = rwx (читаем, пишем, исполняем).
Ладно, большинству из вас оно нахрен не вперлось, но я продолжу. У меня коллега например всегда всем ставит 777 даже не задумываясь. Мол всё работает и никогда нет проблем с доступом к файлам и папкам. Ну ок, возможно однажды встретит своего черношляпа и пересмотрит свои практики. Работает кстати в крупном банке. Только представь какой 3.14здец на серверах у него творится где наши денюжки лежат.
Давай по теме. Создаем массив:
arr=({0..1}{0..1}{0..1})
Получаем права в двоичной системе счисления:
echo ${arr[1]}
echo ${arr[2]}
echo ${arr[3]}
echo ${arr[4]}
echo ${arr[5]}
echo ${arr[6]}
echo ${arr[7]}
На экран выведется:
000
001
010
011
100
101
110
В bash при указании индекса массива можно применять арифметические операции. Давай воспользуемся и наглядно посмотрим как суммируются права доступа.
echo ${arr[1+2]}
echo ${arr[1+4]}
echo ${arr[2+4]}
echo ${arr[1+2+4]}
Получаем:
010
100
101
110
То есть когда мы делали arr[1] у нас было 000, а когда применили сложение arr[1+2], 000+001 = 011.
В общем математика и кишочки. Голову сильно не забивай, в повседневных задачах достаточно восьмеричной и символичной системы счислений. Из полезного: теперь ты знаешь как создавать массивы и складывать их.
Ну и на закуску команда, которая выведет права в восьмеричной системе:
stat -c'%a %n' /tmp/*
Получим такое:
700 snap-private-tmp
700 ssh-XXXXXX5Fyxmr
700 ssh-XXXXXXENecCm
700 ssh-XXXXXXkPO9QF
700 systemd-logind.tkfPcb
700 systemd-r1KRzA
777 test.txt
Не забываем что у всей этой ерунды есть еще дополнительные биты, это когда права указываются четырьмя цифрами.
Короче базу рассмотрели, если ничо не понял, забей. Это как Джаз, чтобы от него блевать не хотелось, нужно стать старым пердуном. Но мы же с вами еще так молоды!
Увидимся вечером. Хорошего понедельника!
tags: #linux #bash
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Как и обещал, сегодня у нас с тобой хитрая стеганография на bash. Не скажу что тема простая, но будут готовые инструменты, которые можно взять и использовать. Не вникая в кишки.
Как говорится - чтобы что-то спрятать, нужно поместить это на видное место.
Начнём со спойлера:
Пока ничего не понятно, а если я сделаю так:
Сечешь фишку? Это и называется стеганография. Я спрятал в правах файлов скрытое сообщение «bashdays». Вот тут нам и пригодилась тема с правами доступа и всякими этими системами счислений. Давай разбираться как это работает.
Сами bash скрипты mode2char и char2mode закину в конце поста на гитхаб.
В примере выше у меня сопоставляются права доступа с диапазоном символов 32..126 (ASCII). Если номер 7ми битной кодировки ASCII сдвинуть на два бита, то получаем как раз те самые 9 бит прав доступа.
Давай подвигаем!
Распечатаем диапазон ACSII символов 32..126 в восьмеричном формате:
На экран вывалится куча всего, что-то похожее на права доступа:
Чтобы преобразовать в обратную сторону делаем так:
То есть сдвигаем вправо на 2 бита. Из цифр 440, 524, 545 - получили 72, 85, 89.
Ну а теперь всю эту херню ненаглядную, преобразуем в читаемые символы.
Вот это поворот! Странно что на такую строчку антивирус не триггернулся. В общем теперь на экране красуется всем известное слово.
Помнишь я сегодня писал, что единицы двоичного представления прав доступа, соответствуют символам rwx, а нули символу «-». Таким образом можно легко получить закодированный символ вручную подставляя 0 и 1 в нужных местах.
А вот и сам скрипт, который разбивает строку и генерирует кучку файлов с нужными правами доступа. В скрипте не используются сдвиги, работает всё через ассоциативные массивы для декодирования.
Запускается так:
Указываешь директорию, где создаем структуру файлов и саму строчку, которую нужно спрятать в правах доступа.
Конечно есть нюансы. Скрипт будет орать если что-то не так. Существующие файлы не перезаписываются. Именование файлов соответствуют лексикографическому порядку сортировки. Это нужно для того, чтобы получить ту же последовательность файлов, что и при создании. Скрипт декодирования получает имена используя globbing, который сортирует именно так.
Сам скрипт декодирования лежит тут, запускается аналогично:
При использовании скрипта декодирования, можно привязать какие угодно права к конкретному символу без какой-либо логики.
Выбор велик:
А еще же есть имена файлов, временные метки с наносекундами. Ну или вообще упороться и упаковывать более одного числа в атрибуты файла используя уникальную сортировку имен файлов.
Сложно? Конечно! Но думаю общую идею ты понял. Изучай! Увидимся совсем скоро.
tags: #linux #bash
—
💩 @bashdays
Как говорится - чтобы что-то спрятать, нужно поместить это на видное место.
Начнём со спойлера:
ls -l /tmp/box
-rw---x---
-rw----r--
-rwx--xr--
-rw-r-----
-rw--w----
-rw----r--
-rwxr--r--
-rwx--xr--
Пока ничего не понятно, а если я сделаю так:
./mode2char /tmp/box
-rw---x--- (610)
1100010 (98) ('b')
-rw----r-- (604)
1100001 (97) ('a')
-rwx--xr-- (714)
1110011 (115) ('s')
-rw-r----- (640)
1101000 (104) ('h')
-rw--w---- (620)
1100100 (100) ('d')
-rw----r-- (604)
1100001 (97) ('a')
-rwxr--r-- (744)
1111001 (121) ('y')
-rwx--xr-- (714)
1110011 (115) ('s')
bashdays
Сечешь фишку? Это и называется стеганография. Я спрятал в правах файлов скрытое сообщение «bashdays». Вот тут нам и пригодилась тема с правами доступа и всякими этими системами счислений. Давай разбираться как это работает.
Сами bash скрипты mode2char и char2mode закину в конце поста на гитхаб.
В примере выше у меня сопоставляются права доступа с диапазоном символов 32..126 (ASCII). Если номер 7ми битной кодировки ASCII сдвинуть на два бита, то получаем как раз те самые 9 бит прав доступа.
Давай подвигаем!
Распечатаем диапазон ACSII символов 32..126 в восьмеричном формате:
for i in 10 {32..126} ; do printf '%03o\n' $(( i << 2 )) ; done
На экран вывалится куча всего, что-то похожее на права доступа:
372
376
380
Чтобы преобразовать в обратную сторону делаем так:
for i in 440 524 545 ; do echo $(( 8#$i >> 2 )) ; done
То есть сдвигаем вправо на 2 бита. Из цифр 440, 524, 545 - получили 72, 85, 89.
Ну а теперь всю эту херню ненаглядную, преобразуем в читаемые символы.
for i in 440 524 545 ; do printf -v hex '\\x%x' $(( 8#$i >> 2 )) ; echo -e "$hex" ; done
Вот это поворот! Странно что на такую строчку антивирус не триггернулся. В общем теперь на экране красуется всем известное слово.
Помнишь я сегодня писал, что единицы двоичного представления прав доступа, соответствуют символам rwx, а нули символу «-». Таким образом можно легко получить закодированный символ вручную подставляя 0 и 1 в нужных местах.
А вот и сам скрипт, который разбивает строку и генерирует кучку файлов с нужными правами доступа. В скрипте не используются сдвиги, работает всё через ассоциативные массивы для декодирования.
Запускается так:
./char2mode /tmp/box 'Welcome to bashdays'
Указываешь директорию, где создаем структуру файлов и саму строчку, которую нужно спрятать в правах доступа.
Конечно есть нюансы. Скрипт будет орать если что-то не так. Существующие файлы не перезаписываются. Именование файлов соответствуют лексикографическому порядку сортировки. Это нужно для того, чтобы получить ту же последовательность файлов, что и при создании. Скрипт декодирования получает имена используя globbing, который сортирует именно так.
Сам скрипт декодирования лежит тут, запускается аналогично:
./mode2char /tmp/box
При использовании скрипта декодирования, можно привязать какие угодно права к конкретному символу без какой-либо логики.
Выбор велик:
printf '%s\n' {0..7}{0..7}{0..7}
printf '%s\n' {r,-}{w,-}{x,-}{r,-}{w,-}{x,-}{r,-}{w,-}{x,-}
А еще же есть имена файлов, временные метки с наносекундами. Ну или вообще упороться и упаковывать более одного числа в атрибуты файла используя уникальную сортировку имен файлов.
Сложно? Конечно! Но думаю общую идею ты понял. Изучай! Увидимся совсем скоро.
tags: #linux #bash
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Зашел тут разговор, а зачем люди делают touch, перед тем, как что-то записать в файл? Причем так делает большинство, да и в учебниках повсюду это пихают. Но какой в этом смысл, если при записи все равно будет создан файл? Я имею в виду такую ситуацию:
все же проще:
И не нужно никакого touch. Так откуда взялась эта дурная привычка? И дурная ли она? Почему мы не делаем тогда типа такого?
Оно ведь тоже создает новый файл…
На самом деле правильного ответа нет. Единственно что нужно знать, это — используя touch ты всегда будешь уверен, что сможешь записать свои данные в файл.
А не когда набрал в vim кучу текста, сохраняешь, а оно тебеидикатывхуй , permission denied. Файл есть, но владелец кто-то другой. Короче говоря это быстрый способ выяснить, если ли у тебя права на запись, прежде чем ты начнешь редактирование.
Да и еще touch используется для обновления даты модификации. Кстати очень удобная штука. Например, ты редактировал конфиг nginx в прошлом году, но всем нужно показать что вчера, делаешь touch nginx.conf и проставляется актуальная дата и время. И в bash скриптах можно использовать, если есть какая-то логика с lock файлами, таймштампами и т.п.
А как правильно создавать файлы? А просто! Правильный способ для создания файлов, это любая команда, которая использует системный вызов create или open (с флагом O_CREATE). Таких команд и программ дофига.
Вообще ситуацию можно сравнить с grep, мы его используем, потому что не знаем ничего лучше. Старая школа и мышечная память. Ну или сравним с гуглом и chatgpt, я знаю что gpt найдет и даст ответ быстрее, но я все же предпочитаю гуглить.
А все мифы о том, что в старых linux с ядром 0.97 нужно было обязательно использовать touch, всего лишь мифы.
Кстати есть еще такой древний строковый редактор, называется ed. Идет в коробке почти со всеми дистрибутивами. Этот редактор изначально требовал наличия файла перед его редактированием. И да, из этого редактора выйти намного сложнее чем из vim. Попробуй ради интереса.
Как-то так. А как ты создаешь файлы?
tags: #linux
—
💩 @bashdays
touch file.txt
vim file.txt
:w
все же проще:
vim file.txt
:w
И не нужно никакого touch. Так откуда взялась эта дурная привычка? И дурная ли она? Почему мы не делаем тогда типа такого?
dd if=/dev/zero of=newfile bs=1 count=0
Оно ведь тоже создает новый файл…
На самом деле правильного ответа нет. Единственно что нужно знать, это — используя touch ты всегда будешь уверен, что сможешь записать свои данные в файл.
А не когда набрал в vim кучу текста, сохраняешь, а оно тебе
Да и еще touch используется для обновления даты модификации. Кстати очень удобная штука. Например, ты редактировал конфиг nginx в прошлом году, но всем нужно показать что вчера, делаешь touch nginx.conf и проставляется актуальная дата и время. И в bash скриптах можно использовать, если есть какая-то логика с lock файлами, таймштампами и т.п.
А как правильно создавать файлы? А просто! Правильный способ для создания файлов, это любая команда, которая использует системный вызов create или open (с флагом O_CREATE). Таких команд и программ дофига.
Вообще ситуацию можно сравнить с grep, мы его используем, потому что не знаем ничего лучше. Старая школа и мышечная память. Ну или сравним с гуглом и chatgpt, я знаю что gpt найдет и даст ответ быстрее, но я все же предпочитаю гуглить.
А все мифы о том, что в старых linux с ядром 0.97 нужно было обязательно использовать touch, всего лишь мифы.
Кстати есть еще такой древний строковый редактор, называется ed. Идет в коробке почти со всеми дистрибутивами. Этот редактор изначально требовал наличия файла перед его редактированием. И да, из этого редактора выйти намного сложнее чем из vim. Попробуй ради интереса.
Как-то так. А как ты создаешь файлы?
tags: #linux
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Привет, сейчас покажу интересную bash фичу. Которая ну совсем уж не очевидная и про нее мало кто знает.
В bash скрипте можно хранить данные, закодированные в base64. Выглядит это следующим образом:
Функция read_data считывает данные из самого скрипта. С помощью sed удаляются строки от начала файла до строки DATASET. А затем происходит декодирование оставшихся данных. В конце всё сохраняется в массив DATASET с помощью mapfile и выводится через echo.
Красота! Мой скрипт по итогу выведет на экран «Hello BashDays». Где это можно применить, понятия не имею. Возможно тебе удастся это куда-нибудь приспособить.
Еще в этом скрипте мне не нравится exit 0, если есть мысли как от него избавиться, велком в комментарии. Я чет покопался вчера, но так пока и не победил. Если убрать exit 0, оно будет работать, но в конце грязно выругается.
Бери на вооружение, возможно твой стартап нуждается в этом. Увидимся!
tags: #bash
—
💩 @bashdays
В bash скрипте можно хранить данные, закодированные в base64. Выглядит это следующим образом:
#!/bin/bash
read_data() {
mapfile -t DATASET < <(sed '1,/^DATASET/d' "$0" | base64 -d)
}
read_data
echo ${DATASET[@]}
exit 0
DATASET
SGVsbG8gQmFzaERheXM=
Функция read_data считывает данные из самого скрипта. С помощью sed удаляются строки от начала файла до строки DATASET. А затем происходит декодирование оставшихся данных. В конце всё сохраняется в массив DATASET с помощью mapfile и выводится через echo.
Красота! Мой скрипт по итогу выведет на экран «Hello BashDays». Где это можно применить, понятия не имею. Возможно тебе удастся это куда-нибудь приспособить.
Еще в этом скрипте мне не нравится exit 0, если есть мысли как от него избавиться, велком в комментарии. Я чет покопался вчера, но так пока и не победил. Если убрать exit 0, оно будет работать, но в конце грязно выругается.
Бери на вооружение, возможно твой стартап нуждается в этом. Увидимся!
tags: #bash
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Надо было тут провести экстренные технические работы на сервере. Сервер публичный и смотрит жопой в интернет.
Клиенты это обычные пользователи, которые заходят по ssh и пытаются на практике изучать bash и linux. Короче студенты какого-то крупного ВУЗа, а сервер выступает подопытным стендом для всяких лабораторных работ.
Клиентов дофига (человек 800) предупредить о технических работах нет никакой возможности. А если бы и была, то 99% не увидят электронных писем с важной информацией и начнут долбать саппорт.
Задача вроде тривиальная, но нужно было предварительно задропать все сессии + не разрешать повторно подключить. Ну и естественно каким-то хреном выслать уведомление всем тем, кого задропали в моменте.
На самом деле тут все просто. Создаем пустой файл /etc/nologin. Теперь только root сможет авторизоваться по ssh. Да, предварительно нужно разрешить вообще заходить под root’ом.
Часть задачи решили. Теперь нужно уведомить бедолаг, которые в данный момент что-то делают в терминале. Пусть сохраняют свои поделки и отправляются на заслуженный отдых.
Для этого воспользуемся утилитой wall.
Wall — утилита командной строки, которая отображает сообщение на терминалах всех вошедших в систему пользователей.
Запускаем команду:
Все кто был подключен к серверу, получают сообщение:
И неважно что делает человек и где находится, сообщение появится у него на экране. Через wall кстати можно спамить определенным группам пользователей.
Ну все, ответственность с себя сняли. В 10:15 запускаем ассасина:
Вот так вот грубо мы выгнали всех с сервера, кроме root’а. Вот и все, спокойно проводим технические работы, удаляем /etc/nologin и радуемся какие мы молодцы.
Wall можно заменить например на такое:
Но тут сообщение уйдет конкретному пользователю user. Конечно если по какой-то причине отсутствует wall в системе, можно и через цикл выгрести всех юзеров и через echo скормить им уведомление.
write - утилита, позволяющая отправить сообщение другому пользователю, который имеет сессию в этой же системе.
Ну либо так:
Пытался сделать так /dev/pts/[0-9]*, но чет не проканало, заорала как потерпевшая. Ну это всё костыли, в общем неважно.
Ладно, хорошо тебе провести остаток выходного, увидимся завтра.
tags: #bash #linux #utils
—
💩 @bashdays
Клиенты это обычные пользователи, которые заходят по ssh и пытаются на практике изучать bash и linux. Короче студенты какого-то крупного ВУЗа, а сервер выступает подопытным стендом для всяких лабораторных работ.
Клиентов дофига (человек 800) предупредить о технических работах нет никакой возможности. А если бы и была, то 99% не увидят электронных писем с важной информацией и начнут долбать саппорт.
Задача вроде тривиальная, но нужно было предварительно задропать все сессии + не разрешать повторно подключить. Ну и естественно каким-то хреном выслать уведомление всем тем, кого задропали в моменте.
На самом деле тут все просто. Создаем пустой файл /etc/nologin. Теперь только root сможет авторизоваться по ssh. Да, предварительно нужно разрешить вообще заходить под root’ом.
Часть задачи решили. Теперь нужно уведомить бедолаг, которые в данный момент что-то делают в терминале. Пусть сохраняют свои поделки и отправляются на заслуженный отдых.
Для этого воспользуемся утилитой wall.
Wall — утилита командной строки, которая отображает сообщение на терминалах всех вошедших в систему пользователей.
Запускаем команду:
wall "Быстренько сохраняемся и валим с сервера. В 10:15 сервер уходит в запой."
Все кто был подключен к серверу, получают сообщение:
Broadcast message from root@dev (pts/0) (Sun Dec 17 11:38:21 2023):
Быстренько сохраняемся и валим с сервера. В 10:15 сервер уходит в запой.
И неважно что делает человек и где находится, сообщение появится у него на экране. Через wall кстати можно спамить определенным группам пользователей.
Ну все, ответственность с себя сняли. В 10:15 запускаем ассасина:
pkill -9 -u `who | awk '{print $1}'| grep -v root|head -1
Вот так вот грубо мы выгнали всех с сервера, кроме root’а. Вот и все, спокойно проводим технические работы, удаляем /etc/nologin и радуемся какие мы молодцы.
Wall можно заменить например на такое:
echo "Hello from BashDays" | write user
Но тут сообщение уйдет конкретному пользователю user. Конечно если по какой-то причине отсутствует wall в системе, можно и через цикл выгрести всех юзеров и через echo скормить им уведомление.
write - утилита, позволяющая отправить сообщение другому пользователю, который имеет сессию в этой же системе.
Ну либо так:
echo "Hello from BashDays" > /dev/pts/1
Пытался сделать так /dev/pts/[0-9]*, но чет не проканало, заорала как потерпевшая. Ну это всё костыли, в общем неважно.
Ладно, хорошо тебе провести остаток выходного, увидимся завтра.
tags: #bash #linux #utils
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Тишина у каждого своя, у всех в душе свои оркестры…
Как мы с тобой знаем, в начале скрипта принято использовать строку shebang/hashbang. Это то самое, которое #!/bin/bash. Конечно его не обязательно ставить, но рекомендуется. Ранее этот вопрос разбирался здесь.
Так, но порой вместо привычной нам конструкции, можно встретить нечто подобное:
Да, с питончиком тоже такая чача бывает. Но что это за сракафак и зачем? В нашем случае такое хитрое указание интерпретатора имеет смысл.
Основная идея env bash это улучшение переносимости. Никто не может гарантировать, что интерпретатор находится по захардкоженому пути.
Указал ты допустим в скрипте #!/bin/bash, закинул скрипт на сервер, а эндпоинта bin/bash нет. По этой причине господа ребята используют хак с env bash. Использование env позволяет снизить риски за счет запуска команды на основе данных из переменной среды PATH.
Ну и используя env в скрипте можно указывать любые версии интерпретатора. Возможно у тебя стоит две версии bash, ну или как распространено с питончиком. Деприкейтед 2.7 и трёшка. Думаю мысль ты уловил. Чтобы не править скрипты, можно подменять версии интерпретаторов и даже сами интерпретаторы.
Давай посмотрим на практике.
1. Создаем папку bin в домашнем каталоге
2. Копируем интерпретатор sh в ~/bin, но обзываем его bash
3. Экспортируем новый путь ~/bin в PATH
4. Запускам bash через env
Дела… у нас запустился интерпретатор sh. То есть ~/bin/bash (обращаем внимание на знак ~ = домашняя директория пользователя) был найден раньше, чем просто /bin/bash.
Если посмотреть PATH мы увидим следующее:
Наш домашний каталог с бинарниками стал приоритетным. И если теперь в скриптах указать #!/usr/bin/env bash то запустится sh из ~/bin. Ничего сложного. Но на практике обычно никто такой хераборой не занимается. Чисто для примера, ну или для совсем уж костылей, когда нужно быстро и вчера.
Преимущества c env:
- Запуск интерпретатора не из конкретно указанного места, а из того что встретилось первым в переменной окружения PATH.
Недостатки:
- Путь /usr/bin/env банально может не существовать. Но обычно существует.
Ну и если используешь env, в него можно прокинуть параметры, делается через ключик -S:
Venv в Python работает по такому же принципу, реврайтит PATH и позволяет использовать разные версии.
Если посмотреть PATH (
То есть к нашему PATH добавился каталог /tmp/.venv/bin, который стал приоритетнее чем /home/user/bin.
Вот так вот это всё и работает под капотом. Я эти env по большей части никогда не использую, хреначу #!/bin/bash и погнали, пока всегда и везде работало. Конец!
tags: #bash #linux
—
💩 @bashdays
Как мы с тобой знаем, в начале скрипта принято использовать строку shebang/hashbang. Это то самое, которое #!/bin/bash. Конечно его не обязательно ставить, но рекомендуется. Ранее этот вопрос разбирался здесь.
Так, но порой вместо привычной нам конструкции, можно встретить нечто подобное:
#!/usr/bin/env bash
#!/usr/bin/env python
#!/usr/bin/env python3
Да, с питончиком тоже такая чача бывает. Но что это за сракафак и зачем? В нашем случае такое хитрое указание интерпретатора имеет смысл.
Основная идея env bash это улучшение переносимости. Никто не может гарантировать, что интерпретатор находится по захардкоженому пути.
Указал ты допустим в скрипте #!/bin/bash, закинул скрипт на сервер, а эндпоинта bin/bash нет. По этой причине господа ребята используют хак с env bash. Использование env позволяет снизить риски за счет запуска команды на основе данных из переменной среды PATH.
Ну и используя env в скрипте можно указывать любые версии интерпретатора. Возможно у тебя стоит две версии bash, ну или как распространено с питончиком. Деприкейтед 2.7 и трёшка. Думаю мысль ты уловил. Чтобы не править скрипты, можно подменять версии интерпретаторов и даже сами интерпретаторы.
Давай посмотрим на практике.
mkdir ~/bin
cp /bin/sh ~/bin/bash
export PATH=~/bin:$PATH
env bash
1. Создаем папку bin в домашнем каталоге
2. Копируем интерпретатор sh в ~/bin, но обзываем его bash
3. Экспортируем новый путь ~/bin в PATH
4. Запускам bash через env
Дела… у нас запустился интерпретатор sh. То есть ~/bin/bash (обращаем внимание на знак ~ = домашняя директория пользователя) был найден раньше, чем просто /bin/bash.
Если посмотреть PATH мы увидим следующее:
echo $PATH
/root/bin:/root:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
Наш домашний каталог с бинарниками стал приоритетным. И если теперь в скриптах указать #!/usr/bin/env bash то запустится sh из ~/bin. Ничего сложного. Но на практике обычно никто такой хераборой не занимается. Чисто для примера, ну или для совсем уж костылей, когда нужно быстро и вчера.
Преимущества c env:
- Запуск интерпретатора не из конкретно указанного места, а из того что встретилось первым в переменной окружения PATH.
Недостатки:
- Путь /usr/bin/env банально может не существовать. Но обычно существует.
Ну и если используешь env, в него можно прокинуть параметры, делается через ключик -S:
#!/usr/bin/env -S var1=a var2=b bash --help
Venv в Python работает по такому же принципу, реврайтит PATH и позволяет использовать разные версии.
> index.py
python3 -m venv .venv
source .venv/bin/activate
import sys
print(sys.executable)
/tmp/.venv/bin/python
Если посмотреть PATH (
echo $PATH
) при активации venv, то увидим совершенно другой PATH:/tmp/.venv/bin:/home/user/bin:/usr/local/opt/libpcap/bin:/home/user/.pyenv/bin:/opt/homebrew/opt/openjdk/bin
То есть к нашему PATH добавился каталог /tmp/.venv/bin, который стал приоритетнее чем /home/user/bin.
Вот так вот это всё и работает под капотом. Я эти env по большей части никогда не использую, хреначу #!/bin/bash и погнали, пока всегда и везде работало. Конец!
tags: #bash #linux
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Привет. Утренний микропост. Короче когда перенаправляешь вывод результатов в файл, то на экране нифига не видно. Но порой это бывает критично, а нужно и в файл записать и глазками позырить в реалтайме.
На этот случай у нас есть утилита tee, которая как раз этой хераборой и занимается.
На картинке хорошо видно, откуда произошло название tee, это буква T в произношении. Вывод затекает сверху слева и вытекает в двух направлениях. Ты видишь происходящее на экране, а параллельно это происходящее записывается и в файл. Удобно.
Вот как нужно называть утилиты! Взял произношение буквы и можно в коробку упаковывать. Кстати пока писал, вспомнил что английская «H», взяло название от Eighth - то есть восьмая буква алфавита. Короче никто особо не заморачивался с неймингом.
Ну а еще есть подобная утилита, называется просто script. Она позволяет записать всё происходящее на экране сразу в файл. Работает даже в интерактивном режиме. Запустил ты ее и работаешь в консоли, а она пишет все твои действия в кабачок.
Ключей у нее много разных, если интересно можешь глянуть хелпину. Видел что её подключают в bashrc чтобы логировать все действия криворуких обезьян.
Я ни tee ни script не использую, потому что всё время про них забываю, да и особой необходимости нет.
Такие дела. Вечерком закину еще чтива, увидимся!
tags: #bash #utils
—
💩 @bashdays
На этот случай у нас есть утилита tee, которая как раз этой хераборой и занимается.
command | tee log.txt
На картинке хорошо видно, откуда произошло название tee, это буква T в произношении. Вывод затекает сверху слева и вытекает в двух направлениях. Ты видишь происходящее на экране, а параллельно это происходящее записывается и в файл. Удобно.
Вот как нужно называть утилиты! Взял произношение буквы и можно в коробку упаковывать. Кстати пока писал, вспомнил что английская «H», взяло название от Eighth - то есть восьмая буква алфавита. Короче никто особо не заморачивался с неймингом.
Ну а еще есть подобная утилита, называется просто script. Она позволяет записать всё происходящее на экране сразу в файл. Работает даже в интерактивном режиме. Запустил ты ее и работаешь в консоли, а она пишет все твои действия в кабачок.
Ключей у нее много разных, если интересно можешь глянуть хелпину. Видел что её подключают в bashrc чтобы логировать все действия криворуких обезьян.
Я ни tee ни script не использую, потому что всё время про них забываю, да и особой необходимости нет.
Такие дела. Вечерком закину еще чтива, увидимся!
tags: #bash #utils
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Привет. Давно не виделись, конец года, все как с ума посходили, всем нужно вчера и срочно. Надеюсь у тебя тоже все хорошо. Сегодня поделюсь задачей которую решал на днях для клиента, связанную со swap.
Задача от заказчика: У меня есть приложение, которое уходит в swap, мне нужно чтобы оно туда не уходило. Сам swap отключать нельзя.
Задаю очевидный вопрос — а зачем? Чтобы что? Ну свапится оно, ну и пусть свапится, никогда с этим проблем ни у кого не встречал.
Как оказалось, они там провели у себя какие-то хитрые тесты и доказали, что если их приложение начинает свапится, то это влияет на скорость его работы. Ну да, есть в этом доля правды. Если на сервере достаточно RAM, можно и реализовать это безобразие.
А решается эта задача через cgroups.
cgroups (Control Groups) представляют собой механизм в ядре Linux для ограничения, изоляции и управления ресурсами, предоставляемыми группам процессов. Они предоставляют интерфейс для создания и управления группами процессов, а затем накладывают ограничения на ресурсы, потребляемые этими группами.
Сначала ставим необходимые пакеты, если они не стоят:
Создаем отдельную группу asshole, в нее будем добавлять приложения, которые нужно оградить от swap:
Запрещаем вытеснять процессы в swap:
Добавляем процесс в группу asshole:
Для примера я добавил nginx, который не будет уходить в swap. Но ты можешь добавить все что угодно.
Дополнительно для группы asshole отключим OOM:
Вот и всё, теперь приложение не будет уходить в swap и OOM (Linux Out-Of-Memory Killer) обломается. Ну и как вариант: всё нахуй встанет раком, продакшен издаст последний вздох и упадет в новогодние праздники. Но тут, как говорится — хозяин барин! Хотели отключить, отключили.
Все настройки производились на ubuntu 22.04, в других версиях есть различия на названия
После создания группы, зайди, посмотри что у тебя там создалось. И от туда уже пляши. У меня этот способ не сработал на виртуальных серверах в Селектеле (permissions denied), но прекрасно сработал в Digital Ocean и на локальной виртуалке.
Экспериментируйте! Кстати после перезагрузки, cgroups слетят и по возможности создавай юнит в systemd, типа такого:
/etc/systemd/system/asshole.service
Хорошего понедельника! И всегда помни, если что-то ограничиваешь, рано или поздно оно взбунтуется и сделает уйму головняков.
tags: #linux
—
💩 @bashdays
Задача от заказчика: У меня есть приложение, которое уходит в swap, мне нужно чтобы оно туда не уходило. Сам swap отключать нельзя.
Задаю очевидный вопрос — а зачем? Чтобы что? Ну свапится оно, ну и пусть свапится, никогда с этим проблем ни у кого не встречал.
Как оказалось, они там провели у себя какие-то хитрые тесты и доказали, что если их приложение начинает свапится, то это влияет на скорость его работы. Ну да, есть в этом доля правды. Если на сервере достаточно RAM, можно и реализовать это безобразие.
А решается эта задача через cgroups.
cgroups (Control Groups) представляют собой механизм в ядре Linux для ограничения, изоляции и управления ресурсами, предоставляемыми группам процессов. Они предоставляют интерфейс для создания и управления группами процессов, а затем накладывают ограничения на ресурсы, потребляемые этими группами.
Сначала ставим необходимые пакеты, если они не стоят:
apt-get install cgroup-tools
Создаем отдельную группу asshole, в нее будем добавлять приложения, которые нужно оградить от swap:
cgcreate -g memory,cpu:/asshole
Запрещаем вытеснять процессы в swap:
echo 0 | tee /sys/fs/cgroup/asshole/memory.swap.max
Добавляем процесс в группу asshole:
cgclassify -g memory,cpu:/asshole/ $(pidof nginx)
Для примера я добавил nginx, который не будет уходить в swap. Но ты можешь добавить все что угодно.
Дополнительно для группы asshole отключим OOM:
echo 1 | tee /sys/fs/cgroup/asshole/memory.oom.group
Вот и всё, теперь приложение не будет уходить в swap и OOM (Linux Out-Of-Memory Killer) обломается. Ну и как вариант: всё нахуй встанет раком, продакшен издаст последний вздох и упадет в новогодние праздники. Но тут, как говорится — хозяин барин! Хотели отключить, отключили.
Все настройки производились на ubuntu 22.04, в других версиях есть различия на названия
memory.swap.max, memory.oom.group
и прочее.После создания группы, зайди, посмотри что у тебя там создалось. И от туда уже пляши. У меня этот способ не сработал на виртуальных серверах в Селектеле (permissions denied), но прекрасно сработал в Digital Ocean и на локальной виртуалке.
Экспериментируйте! Кстати после перезагрузки, cgroups слетят и по возможности создавай юнит в systemd, типа такого:
/etc/systemd/system/asshole.service
[Unit]
Description=My cgroup configuration
[Service]
ExecStartPre=/bin/mkdir -p /sys/fs/cgroup/asshole
ExecStartPre=/bin/mount -t cgroup -o memory asshole /sys/fs/cgroup/asshole
ExecStart=/bin/echo 1 > /sys/fs/cgroup/asshole/memory.oom.group
[Install]
WantedBy=default.target
systemctl daemon-reload
systemctl start asshole
systemctl enable asshole
Хорошего понедельника! И всегда помни, если что-то ограничиваешь, рано или поздно оно взбунтуется и сделает уйму головняков.
tags: #linux
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Ребята, что я вам принёс! Кринжатину! Офигительная консольная, мульти-плеерная игруля под названием «piu-piu».
Под капотом нативный Bash + ANSI. Подозреваю изобрел её наш русскоговорящий соотечественник, судя по локализации терминала на видео.
Суть игрушки: Летим на вертолёте, управляем wasd, стреляем на «p» и уничтожаем вражеские юниты. Жизни и патроны расходуются. Но это еще не всё, в игре присутствует режим penis mode.
Как пишет автор — если тебе не достаточно весело, запускай игру так:
Бери друга и вперед! В два ствола летать гораздо веселее. Так же присутствует режим дуэли, который позволит выяснить у кого прибор длиннее. Выясни это здесь и сейчас!
А в последнем обновлении, добавлен эффект трясущегося хозяйства. Вообще у разработчика большие планы на этот проект, обещают добавить кастомизацию размеров с плавающей точкой.
Если у тебя еще остались друзья, можешь нехило зарубиться!
Ставится элементарно через apt (но версия не последняя), либо сливаешь себе репозиторий, чмодишь на «икс» и запускаешь.
На выбор либо вертолет, либо penis mode. Сам уже отталкивайся от своих предпочтений.
Здесь страница проекта и мануалы как ставить. Погнали!
tags: #linux #bash #games
—
💩 @bashdays
Под капотом нативный Bash + ANSI. Подозреваю изобрел её наш русскоговорящий соотечественник, судя по локализации терминала на видео.
Суть игрушки: Летим на вертолёте, управляем wasd, стреляем на «p» и уничтожаем вражеские юниты. Жизни и патроны расходуются. Но это еще не всё, в игре присутствует режим penis mode.
Как пишет автор — если тебе не достаточно весело, запускай игру так:
penis=big ./piu-piu
Бери друга и вперед! В два ствола летать гораздо веселее. Так же присутствует режим дуэли, который позволит выяснить у кого прибор длиннее. Выясни это здесь и сейчас!
А в последнем обновлении, добавлен эффект трясущегося хозяйства. Вообще у разработчика большие планы на этот проект, обещают добавить кастомизацию размеров с плавающей точкой.
Если у тебя еще остались друзья, можешь нехило зарубиться!
Ставится элементарно через apt (но версия не последняя), либо сливаешь себе репозиторий, чмодишь на «икс» и запускаешь.
На выбор либо вертолет, либо penis mode. Сам уже отталкивайся от своих предпочтений.
Здесь страница проекта и мануалы как ставить. Погнали!
tags: #linux #bash #games
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Вчера в комментариях к посту про «set -k», задали вопрос про решение задачи. Чтобы понять какие опции включены в оболочке bash через «set», достаточно выполнять команду:
В этой команде «$-» представляет текущие опции командной строки.
На экран выведется, что типа такого:
Это все опции, которые на данный момент включены в оболочке Bash через команду «set». Ну и дальше уже можно искать проблемы с нелогичным поведением при выполнении команд. Каждая буква это опция, вызываешь хелп и смотришь что она означает.
Ну или через скрипт, как мы любим:
Про «$-» мало кто знает, в книжках я про неё никогда не встречал. В оболочке zsh эта штука тоже фурычит. Такие дела.
tags: #bash
—
💩 @bashdays
echo $-
В этой команде «$-» представляет текущие опции командной строки.
На экран выведется, что типа такого:
hikmBHs
Это все опции, которые на данный момент включены в оболочке Bash через команду «set». Ну и дальше уже можно искать проблемы с нелогичным поведением при выполнении команд. Каждая буква это опция, вызываешь хелп и смотришь что она означает.
Ну или через скрипт, как мы любим:
if [[ $- == *k* ]]; then
echo "Опция -k установлена."
else
echo "Опция -k не установлена."
fi
Про «$-» мало кто знает, в книжках я про неё никогда не встречал. В оболочке zsh эта штука тоже фурычит. Такие дела.
tags: #bash
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Привет, всех с Новым Годом! Праздники праздниками, но пора уже входить в рабочий поток и разгрести локальный техдолг. На этот раз решаем задачку с тремя известными: Windows + WSL + VirtualBox.
Суть такая. Понадобилось мне вхреначить на локальную машину VirtualBox с убунтой, для тестирования фичи, которую писал в этом посте. Фича не хотела заводиться на виртуальных серверах Селектела, хотя и должна была. Потребовалось убедиться, что дело не в моих кривых руках. Ладно, лирика…
Короче цепануться к убунте из wsl по ssh к VirtualBox из коробки не получилось. Да и понятно, подсети разные. Пришлось временно воспользоваться powershell и через ssh проверить гипотезу с cgroup. Винда видит подсеть виртуалки и с этим проблем нет. Проверил, забыл.
Но вопрос остался открытым: как блять/дь малой кровью из WSL (с ubuntu 22.04) подключиться напрямую к виртуалке c ubuntu 22.04 по ssh? И не задрачиваться с таблицами роутинга? Рассказываю!
Чтобы не лезть в маршрутизацию, пришлось воспользоваться стандартным функционалом проброса портов в самом VirtualBox. Жопа конечно знатно сгорела, но желаемого добился.
В общем, пиздуем в настройки VirtualBox: Сеть, Адаптер1. В нем по умолчанию включен NAT. Открываем пункт - Дополнительно, видим кнопку: Проброс портов. Заходим и начинаем заниматьсяочередной хуитой магией.
Сначала роутим на виндовую машину:
Так, теперь в powershell я могу цепануться к виртуалке так:
Оно и ежу понятно, теперь усложняем задачу:
Этой хернёй разрешаем подключение из powershell по такому принципу:
Ага, айпишник
Ну и теперь финальный штрих, прикручиваем WSL:
Айпишник
То есть цепляемся в виндовой/хостовой машине на 22 порт, который уже проброшен. Закидываем public ключи, делаем алиасы для быстрого коннекта. Всё! Дело в шляпе! Мы подключились из WSL (ubuntu) по ssh к виртуальной машине в VirtualBox.
Есть нюанс, у меня дополнительно поднят VPN через wireguard, там еще один фактор с подсетью. Поэтому я добавил еще мусора:
Теперь при активации VPN, подключение к VirtualBox через WSL будет выглядеть так:
Логично, адрес виндовой/хостовой машины меняется с
Я себе сделал 2 алиаса в wsl ~/.zshrc:
Алиасы подключения без ВПН и с ВПН. Ну ты и так про это знаешь. Картинки с настройками залил сюда (открываются нативно в телеграфе), заскриншотил свои поделки. Визуальнее всегда понятнее. Но у меня там дэцл хосты и айпишники по другому обзываются. Не обессудь.
Если знаешь более красивое решение этой задачи с пробросом, сердечно ждем в комментариях.
Ладно, самое время включить режим «День-Тюлень». Еще раз всех с НГ. Увидимся!
tags: #linux #wsl #windows #network
—
💩 @bashdays
Суть такая. Понадобилось мне вхреначить на локальную машину VirtualBox с убунтой, для тестирования фичи, которую писал в этом посте. Фича не хотела заводиться на виртуальных серверах Селектела, хотя и должна была. Потребовалось убедиться, что дело не в моих кривых руках. Ладно, лирика…
Короче цепануться к убунте из wsl по ssh к VirtualBox из коробки не получилось. Да и понятно, подсети разные. Пришлось временно воспользоваться powershell и через ssh проверить гипотезу с cgroup. Винда видит подсеть виртуалки и с этим проблем нет. Проверил, забыл.
Но вопрос остался открытым: как блять/дь малой кровью из WSL (с ubuntu 22.04) подключиться напрямую к виртуалке c ubuntu 22.04 по ssh? И не задрачиваться с таблицами роутинга? Рассказываю!
Чтобы не лезть в маршрутизацию, пришлось воспользоваться стандартным функционалом проброса портов в самом VirtualBox. Жопа конечно знатно сгорела, но желаемого добился.
В общем, пиздуем в настройки VirtualBox: Сеть, Адаптер1. В нем по умолчанию включен NAT. Открываем пункт - Дополнительно, видим кнопку: Проброс портов. Заходим и начинаем заниматься
Сначала роутим на виндовую машину:
Имя: ssh_win
Протокол: tcp
Адрес хоста: 127.0.0.1
Порт хоста: 2222
Адрес гостя: пусто
Порт гостя: 22
Так, теперь в powershell я могу цепануться к виртуалке так:
ssh -p2222 user@127.0.0.1
Оно и ежу понятно, теперь усложняем задачу:
Имя: ssh_win_host
Протокол: tcp
Адрес хоста: 192.168.31.100
Порт хоста: 22
Адрес гостя: пусто
Порт гостя: 22
Этой хернёй разрешаем подключение из powershell по такому принципу:
ssh user@192.168.31.100
Ага, айпишник
192.168.31.100
это адрес, который выдал роутер моей виндовой машине. Как видим уже используется 22 порт. Посмотреть айпишник можно командой ipconfig в терминале powershell. Да простят меня адепты линукса.Ну и теперь финальный штрих, прикручиваем WSL:
Имя: ssh_wsl
Протокол: tcp
Адрес хоста: 172.21.20.123
Порт хоста: 2222
Адрес гостя: пусто
Порт гостя: 22
Айпишник
172.21.20.123
выдан убунте в WSL, смотрим его через ifconfig. А дальше заходим в сам WSL и подключаемся к VirtualBox как к обычному серверу:ssh user@192.168.31.100
То есть цепляемся в виндовой/хостовой машине на 22 порт, который уже проброшен. Закидываем public ключи, делаем алиасы для быстрого коннекта. Всё! Дело в шляпе! Мы подключились из WSL (ubuntu) по ssh к виртуальной машине в VirtualBox.
Есть нюанс, у меня дополнительно поднят VPN через wireguard, там еще один фактор с подсетью. Поэтому я добавил еще мусора:
Имя: ssh_vpn
Протокол: tcp
Адрес хоста: 10.66.64.55
Порт хоста: 22
Адрес гостя: пусто
Порт гостя: 22
Теперь при активации VPN, подключение к VirtualBox через WSL будет выглядеть так:
ssh user@10.66.64.55
Логично, адрес виндовой/хостовой машины меняется с
192.168.31.100
на 10.66.64.55
. Но это детали. Еще есть тема, что при включении/выключении VPN вся это тягомотина с пробросом портов подхватывается не сразу. Имей это ввиду.Я себе сделал 2 алиаса в wsl ~/.zshrc:
alias box1="ssh user@192.168.31.100"
alias box2="ssh user@10.66.64.55"
Алиасы подключения без ВПН и с ВПН. Ну ты и так про это знаешь. Картинки с настройками залил сюда (открываются нативно в телеграфе), заскриншотил свои поделки. Визуальнее всегда понятнее. Но у меня там дэцл хосты и айпишники по другому обзываются. Не обессудь.
Если знаешь более красивое решение этой задачи с пробросом, сердечно ждем в комментариях.
Ладно, самое время включить режим «День-Тюлень». Еще раз всех с НГ. Увидимся!
tags: #linux #wsl #windows #network
—
Please open Telegram to view this post
VIEW IN TELEGRAM