victor_sudakov: (Default)

Иногда надо сравнить два JSON файла, данные в которых отличаются мало, а записи перемешаны как попало. diff в этой ситуации использовать невозможно. Есть онлайн инструменты, например The semantic JSON compare tool, но отправлять туда свои данные как-то не хочется.

Оказывается jq умеет сортировать JSON, поэтому можно использовать его для предварительной сортировки и потом отдавать в diff:

diff -u <(jq -S < file1.json ) <(jq -S < file2.json)

victor_sudakov: (Default)

Если нужно потестировать двухфакторную аутентификацию и не хочется засорять Google Authenticator тестовыми ключами, можно использовать oathtool (security/oath-toolkit) для генерации OTP:

oathtool --totp -b H5HBQM3VSPSZLDCI

Для настоящих ключей это небезопасно (секретный ключ видно в списке процессов, истории команд shell и т.д.), но для тестов самое то.

victor_sudakov: (Default)

Мы смеемся над линуксоидами, когда они используют команду cat для просмотра файла, вместо more, less или view. А зря смеемся. Линуксовый терминал по умолчанию настроен так, что после выхода из less, vim и пр. экран очищается, а часто нужно оставить фрагмент просмотренного текста перед глазами.

victor_sudakov: (Default)

Аналогом FreeBSD-шной /usr/bin/limits в Linux является /usr/bin/prlimit.

Пример запуска программы через обертку, с ограничением доступной памяти в 1GB:

$ prlimit --as=1073741824 stress-ng stress-ng --vm 1 --vm-bytes 2G
stress-ng: info:  [19042] defaulting to a 86400 second (1 day, 0.00 secs) run per stressor
stress-ng: info:  [19042] dispatching hogs: 1 vm
stress-ng: error: [19044] stress-ng-vm: gave up trying to mmap, no available memory
stress-ng: info:  [19042] successful run completed in 10.01s
$

Еще варианты задать ограничение ресурсов:

  1. В bash можно пользоваться ulimit
  2. cgexec из cgroup-tools
  3. systemd-run --scope --user -p MemoryMax=1G (работает странно и сложным путем)

pcregrep

May. 12th, 2021 01:17 pm
victor_sudakov: (Default)

Regex flags следует указывать внутри (?) перед регулярным выражением, например извлечь из mbox только тела писем:

pcregrep -v -M '(?sU)^From .*^$' Mail/1.mbox

Извлечь тела писем можно и

formail -I "" -s cat < Mail/1.mbox

это просто пример использования сабжа.

PS удобный дебаггер PCRE

victor_sudakov: (Default)
#007f7f

Приятный для глаз шрифт для терминала: "Source Code Pro Regular 13" or "Monospace Regular 12".
victor_sudakov: (Default)

Интересная возможность сабжевая в bash есть, можно работать со stdout как с файлом:

$ diff -q <(echo qq) <(echo qq1)
Files /dev/fd/63 and /dev/fd/62 differ

BSD apply

Mar. 19th, 2021 03:56 pm
victor_sudakov: (Default)

Под FreeBSD привык к утилите apply, очень не хватало ее под линуксом для повседневных задач. Под линукс нашлась утилита xe, которая делает то же самое, хотя с непривычки кажется, что менее удобно.

$ apply 'host -t ns' yandex.ru google.com
yandex.ru name server ns2.yandex.ru.
yandex.ru name server ns9.z5h64q92x9.net.
yandex.ru name server ns1.yandex.ru.
google.com name server ns3.google.com.
google.com name server ns2.google.com.
google.com name server ns1.google.com.
google.com name server ns4.google.com.

$ xe -a host -t ns -- yandex.ru google.com
yandex.ru name server ns1.yandex.ru.
yandex.ru name server ns9.z5h64q92x9.net.
yandex.ru name server ns2.yandex.ru.
google.com name server ns4.google.com. 
google.com name server ns1.google.com.
google.com name server ns2.google.com.
google.com name server ns3.google.com.

apply еще красиво работает с подстановкой, с xe этот момент выглядит гораздо кривее

$ apply 'host -t %1 ya.ru ' ns soa
ya.ru name server ns1.yandex.ru.
ya.ru name server ns2.yandex.ru.
ya.ru has SOA record ns1.yandex.ru. sysadmin.yandex.ru. 2021031809 900 600 2592000 900

$ xe -n -a -p % host -t % ya.ru -- ns soa 
host -t ns ya.ru
host -t soa ya.ru

$ xe -a -p % host -t % ya.ru -- ns soa
ya.ru name server ns2.yandex.ru.
ya.ru name server ns1.yandex.ru.
ya.ru has SOA record ns1.yandex.ru. sysadmin.yandex.ru. 2021031809 900 600 2592000 900

UPD А еще можно собрать настоящий apply из outils. Для сборки на Debian достаточно build-essential.

victor_sudakov: (Default)

Можно отключить alternate screen в vim в ~/.vimrc

set t_ti= t_te=

или в less установкой переменной среды:

setenv LESS "-X"

но если хочется отключить глобально - приходится делать это настройкой в программе-эмуляторе терминала. PuTTY умеет ("Disable switching to the alternate screen"), xterm умеет ("XTerm*titeInhibit: true" в ~/.Xresources), а Xfce Terminal и прочие производные от Gnome Terminal - не умеют.

Радикальное решение - запускать внутри такого терминала tmux, а в ~/.tmux.conf прописать

set-window-option -g alternate-screen off

victor_sudakov: (Default)
fetch -4 -o- http://ident.me; fetch -6 -o- http://ident.me

На Linux можно "curl -4 http://ident.me".

UPD есть еще http://ifconfig.me

curl ident.me
curl -6 ident.me
curl ifconfig.me


Если нет браузера, например надо из командной строки Cisco, то
telnet ident.me
victor_sudakov: (Default)
Очень удобный плагин Integrity Checker для подсчета, сравнения и проверки контрольных сумм файлов (Автор: Ariman).

https://github.com/lazyhamster/IntChecker/releases
victor_sudakov: (Default)
Когда mount_smbfs стал окончательно бесполезен после повсеместного выключения SMBv1, встал вопрос о том, как сохранять на Windows-файлсервере резервные копии FreeBSD без создания временных файлов на самой FreeBSD (для последующей передачи по FTP и т.п.)

Посоветовали поставить OpenSSH на Windows, он заработал, появилась возможность делать SSH/SCP с FreeBSD на Windows, даже с аутентификацией по ключу. Однако чем на стороне Windows поймать вывод "zfs send" или "dump -f -" и сохранить в файл, оставалось по-прежнему неясным.

Решение было найдено неожиданное. Архиватор 7-Zip умеет работать в потоковом режиме, в том числе его виндовая реализация. Поэтому делаю так:
zfs send XXX@weekly-2019-14 | ssh winserver "7z a -si b:\backup\XXX-weekly-2019-14.7z"

Заодно 7-Zip его немного сжимает.
victor_sudakov: (Default)
bhyve и некоторые другие гипервизоры (похоже что VirtualBox тоже) в режиме EFI не поддерживают эмуляцию NVRAM для сохранения efi variables между перезагрузками. Это может привести к проблеме: гостевая ОС установится штатно, а после перезагрузки получаем сообщение от EFI наподобие
Boot Failed. EFI DVD/CDROM
Failed to set MokListRT: Invalid Parameter
Failed to open \EFI\BOOT\grubx64.efi - Not Found
Failed to load image \EFI\BOOT\grubx64.efi: Not Found
start_image() returned Not Found
Boot Failed. EFI Misc Device
.

Это происходит оттого, что инсталлятор при установке ОС сохранил в efi variables путь к загрузчику (например "\EFI\centos\grubx64.efi"), а после перезагрузки гостевой системы настройка забылась и гипервизор начинает пытаться грузить нечто другое, что заложено в него по умолчанию или по эвристике.

Решений может быть несколько.

Первое тупое. Подмонтировать как-нибудь efi-раздел установленной гостевой ОС (например из другой виртуалки, или из LiveCD в той же виртуалке) и положить нужный загрузчик в то место, где его ищет и не может найти гипервизор: например подложить его в качестве "\EFI\BOOT\BOOTX64.EFI", или как в примере выше, скопировать из \EFI\centos\grubx64.efi в \EFI\BOOT\grubx64.efi.

Второе более интересное. После неудачной загрузки дождаться EFI interactive shell и создать файл startup.nsh, это типа такой autoexec.bat:

fs0:
edit startup.nsh


А в нем уже прописать тот загрузчик, который нужен гостевой ОС, например строчку "\EFI\centos\grubx64.efi".

Третье фантастическое. Запинать авторов UEFI-EDK2 firmware реализовать поддержку сохранения efi variables между перезагрузками.

UPDATE. Вот на ту же тему https://www.centos.org/forums/viewtopic.php?p=278745#p278745

UPDATE 2. А инсталлятор FreeBSD уже сразу создает в EFI-разделе startup.nsh c нужным загрузчиком. Молодцы!

PuTTY

Mar. 23rd, 2019 11:55 am
victor_sudakov: (Default)
Человек, у которого не установлен PuTTY, называется непутёвым. У которого установлен - уже путный человек. А у В.В.Путина установлена специальная версия PuTTY с поддержкой SSH до 10 версии включительно.
victor_sudakov: (Default)
Копировать имя текущего файла вместе с полным путем в буфер обмена: Alt+Shift+Ins

Поймать вывод команды в буфер обмена, редактор или вьюер:
tracert ya.ru | clip
edit:<tracert ya.ru
view:<tracert ya.ru
victor_sudakov: (Default)
Вывести на рабочий стол графическое оповещение, наподобие убранного "net send", можно с помощью PowerShell

powershell -windowstyle hidden -command "[reflection.assembly]::LoadWithPartialName('System.Windows.Forms')|out-null;[windows.forms.messagebox]::Show('%COMPUTERNAME%')"


Данный пример выведет оповещение с именем компьютера.

Безобразная длинная строчка, но разбить её на несколько не получается, "^" внутри кавычек не работает.
victor_sudakov: (Default)
nginx, в отличие например от Apache httpd, не умеет сам запускать CGI-скрипты, ему нужен внешний сервер приложений, с которым nginx будет общаться по протоколу FastCGI или другому.

Если не нужна высокая производительность или фичи, а просто хочется эмулировать функционал апачевского mod_cgi, то проще всего поставить из портов демон www/fcgiwrap и передавать ему запросы через Unix socket. При запуске демона очень желательно указывать fcgiwrap_flags="-f", иначе ошибки fcgiwrap будут уходить в никуда (а при -f будут видны в nginx/error.log). И при необходимости перезапустить его вручную надо не забывать очистить переменные среды (например "env -i /usr/local/etc/rc.d/fcgiwrap restart"), иначе весь environment рута станет виден в CGI-скриптах).

Если CGI-скрипты планируется держать в /usr/local/www/cgi-bin/, а сокет для обмена между nginx и fcgiwrap в /tmp/fcgiwrap.socket, то секция nginx.conf должна выглядеть так:

        location /cgi-bin/ {
            root   /usr/local/www;
            include /usr/local/etc/nginx/fastcgi_params;
            fastcgi_pass unix:/tmp/fcgiwrap.socket;
        }


Обратите внимание, что в директиве root отсутствует "cgi-bin", хотя это реальный каталог на диске, в котором хранятся скрипты. Почему так?

Дело в том, что путь к скрипту задаётся (передаётся в fcgiwrap) склеиванием двух переменных: DOCUMENT_ROOT и SCRIPT_NAME, в которые мапятся (в fastcgi_params) nginx-овские переменные $document_root и $fastcgi_script_name соответственно. По умолчанию $fastcgi_script_name=$request_uri, то есть при обращении к
http://myserver.example/cgi-bin/myscript
fcgiwrap получит команду найти на диске и выполнить "/usr/local/www"+"/cgi-bin/myscript". Естественно $fastcgi_script_name можно переопределить, например с помощью $fastcgi_split_path_info, но для простейшей эмуляции mod_cgi это не нужно.

Отлаживать скрипты вообще без веб-сервера можно как показано ниже, заодно это помогает лучше понять протокол обмена:

#!/bin/sh -x

DOCUMENT_ROOT=/usr/local/www/ ; export DOCUMENT_ROOT
REQUEST_URI=/cgi-bin/myscript ; export REQUEST_URI
SCRIPT_NAME=$REQUEST_URI; export SCRIPT_NAME
REQUEST_METHOD=GET ; export REQUEST_METHOD
su -m www -c '/usr/local/bin/cgi-fcgi -bind -connect /tmp/fcgiwrap.socket'
victor_sudakov: (Default)
Очень неудобно видеть во FreeBSD в выводе ifconfig маску сети в виде "netmask 0xfffffe00". И кто такое придумал?

К счастью, теперь есть переменная среды IFCONFIG_FORMAT, и "setenv IFCONFIG_FORMAT inet:cidr" или "setenv IFCONFIG_FORMAT inet:dotted" помогают увидеть маску подсети в привычном виде.
victor_sudakov: (Default)
"openssl passwd" не работает с современными алгоритмами хэширования, поэтому приходится использовать Питон:
python3.6 -c 'import crypt; print(crypt.crypt("MySecretPass",crypt.mksalt(crypt.METHOD_SHA512)))'


Более изящные варианты welcome.
victor_sudakov: (Default)
Две ссылки о том, как правильно обрабатывать имена файлов и каталогов в скриптах на sh

"Filenames and Pathnames in Shell: How to do it Correctly" https://www.dwheeler.com/essays/filenames-in-shell.html

"Fixing Unix/Linux/POSIX Filenames:
Control Characters (such as Newline), Leading Dashes, and Other Problems" https://www.dwheeler.com/essays/fixing-unix-linux-filenames.html

Profile

victor_sudakov: (Default)
Виктор Судаков

December 2024

S M T W T F S
1234567
891011121314
15161718192021
22232425262728
293031    

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jun. 10th, 2025 07:03 pm
Powered by Dreamwidth Studios