<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:dw="https://www.dreamwidth.org">
  <id>tag:dreamwidth.org,2011-08-11:1070441</id>
  <title>Виктор Судаков</title>
  <subtitle>Всё, чему человек научится, когда-нибудь пригодится ему.</subtitle>
  <author>
    <name>Виктор Судаков</name>
  </author>
  <link rel="alternate" type="text/html" href="https://victor-sudakov.dreamwidth.org/"/>
  <link rel="self" type="text/xml" href="https://victor-sudakov.dreamwidth.org/data/atom"/>
  <updated>2024-09-15T06:28:36Z</updated>
  <dw:journal username="victor_sudakov" type="personal"/>
  <entry>
    <id>tag:dreamwidth.org,2011-08-11:1070441:558282</id>
    <link rel="alternate" type="text/html" href="https://victor-sudakov.dreamwidth.org/558282.html"/>
    <link rel="self" type="text/xml" href="https://victor-sudakov.dreamwidth.org/data/atom/?itemid=558282"/>
    <title>Сравнить два неупорядоченных JSON файла</title>
    <published>2024-09-15T06:28:36Z</published>
    <updated>2024-09-15T06:28:36Z</updated>
    <category term="shell"/>
    <category term="unix"/>
    <category term="копилка опыта"/>
    <dw:security>public</dw:security>
    <dw:reply-count>0</dw:reply-count>
    <content type="html">&lt;p&gt;Иногда надо сравнить два JSON файла, данные в которых отличаются мало, а записи перемешаны как попало. diff в этой ситуации использовать невозможно. Есть онлайн инструменты, например &lt;a href="https://www.jsondiff.com/"&gt;The semantic JSON compare tool&lt;/a&gt;, но отправлять туда свои данные как-то не хочется.&lt;/p&gt;

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

&lt;p&gt;&lt;code&gt;diff -u &amp;lt;(jq -S &amp;lt; file1.json ) &amp;lt;(jq -S &amp;lt; file2.json)&lt;/code&gt;&lt;/p&gt;
&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=victor_sudakov&amp;ditemid=558282" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-08-11:1070441:543288</id>
    <link rel="alternate" type="text/html" href="https://victor-sudakov.dreamwidth.org/543288.html"/>
    <link rel="self" type="text/xml" href="https://victor-sudakov.dreamwidth.org/data/atom/?itemid=543288"/>
    <title>Чем потестировать 2FA</title>
    <published>2022-05-12T16:57:10Z</published>
    <updated>2022-05-12T17:17:15Z</updated>
    <category term="security"/>
    <category term="shell"/>
    <category term="unix"/>
    <category term="копилка опыта"/>
    <dw:security>public</dw:security>
    <dw:reply-count>0</dw:reply-count>
    <content type="html">&lt;p&gt;Если нужно потестировать двухфакторную аутентификацию и не хочется засорять Google Authenticator тестовыми ключами, можно использовать oathtool (security/oath-toolkit) для генерации OTP:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;oathtool --totp -b H5HBQM3VSPSZLDCI&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Для настоящих ключей это небезопасно (секретный ключ видно в списке процессов, истории команд shell и т.д.), но для тестов самое то.&lt;/p&gt;
&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=victor_sudakov&amp;ditemid=543288" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-08-11:1070441:527026</id>
    <link rel="alternate" type="text/html" href="https://victor-sudakov.dreamwidth.org/527026.html"/>
    <link rel="self" type="text/xml" href="https://victor-sudakov.dreamwidth.org/data/atom/?itemid=527026"/>
    <title>cat file.txt</title>
    <published>2021-07-22T08:32:13Z</published>
    <updated>2021-07-22T08:32:13Z</updated>
    <category term="morons"/>
    <category term="shell"/>
    <category term="unix"/>
    <dw:security>public</dw:security>
    <dw:reply-count>3</dw:reply-count>
    <content type="html">&lt;p&gt;Мы смеемся над линуксоидами, когда они используют команду cat для просмотра файла, вместо more, less или view. А зря смеемся. Линуксовый терминал по умолчанию настроен так, что после выхода из less, vim и пр. экран &lt;a href="https://victor-sudakov.dreamwidth.org/504434.html"&gt;очищается&lt;/a&gt;, а часто нужно оставить фрагмент просмотренного текста перед глазами.&lt;/p&gt;
&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=victor_sudakov&amp;ditemid=527026" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-08-11:1070441:524649</id>
    <link rel="alternate" type="text/html" href="https://victor-sudakov.dreamwidth.org/524649.html"/>
    <link rel="self" type="text/xml" href="https://victor-sudakov.dreamwidth.org/data/atom/?itemid=524649"/>
    <title>getrlimit, setrlimit, prlimit</title>
    <published>2021-07-07T04:59:52Z</published>
    <updated>2021-07-07T05:05:12Z</updated>
    <category term="shell"/>
    <category term="копилка опыта"/>
    <category term="unix"/>
    <dw:security>public</dw:security>
    <dw:reply-count>0</dw:reply-count>
    <content type="html">&lt;p&gt;Аналогом FreeBSD-шной &lt;a href="https://www.freebsd.org/cgi/man.cgi?query=limits&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=FreeBSD+13.0-RELEASE+and+Ports&amp;amp;arch=default&amp;amp;format=html"&gt;/usr/bin/limits&lt;/a&gt; в Linux является &lt;a href="https://manpages.debian.org/buster/util-linux/prlimit.1.en.html"&gt;/usr/bin/prlimit&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Пример запуска программы через обертку, с ограничением доступной памяти в 1GB:
&lt;pre&gt;
$ 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
$&lt;pre&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Еще варианты задать ограничение ресурсов:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;В bash можно пользоваться ulimit&lt;/li&gt;
&lt;li&gt;cgexec из cgroup-tools&lt;/li&gt;
&lt;li&gt;systemd-run --scope --user -p MemoryMax=1G (работает странно и сложным путем)&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=victor_sudakov&amp;ditemid=524649" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-08-11:1070441:519191</id>
    <link rel="alternate" type="text/html" href="https://victor-sudakov.dreamwidth.org/519191.html"/>
    <link rel="self" type="text/xml" href="https://victor-sudakov.dreamwidth.org/data/atom/?itemid=519191"/>
    <title>pcregrep</title>
    <published>2021-05-12T06:25:45Z</published>
    <updated>2021-05-12T06:25:45Z</updated>
    <category term="shell"/>
    <category term="unix"/>
    <category term="копилка опыта"/>
    <dw:security>public</dw:security>
    <dw:reply-count>0</dw:reply-count>
    <content type="html">&lt;p&gt;Regex flags следует указывать внутри &lt;code&gt;(?)&lt;/code&gt; перед регулярным выражением, например извлечь из mbox только тела писем: &lt;/p&gt;

&lt;p&gt;&lt;code&gt;
pcregrep -v -M '(?sU)^From .*^$' Mail/1.mbox
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Извлечь тела писем можно и&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
formail -I "" -s cat &amp;lt; Mail/1.mbox
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;это просто пример использования сабжа.&lt;/p&gt;

&lt;p&gt;PS &lt;a href="https://regex101.com/"&gt;удобный дебаггер PCRE&lt;/a&gt;&lt;/p&gt;
&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=victor_sudakov&amp;ditemid=519191" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-08-11:1070441:518722</id>
    <link rel="alternate" type="text/html" href="https://victor-sudakov.dreamwidth.org/518722.html"/>
    <link rel="self" type="text/xml" href="https://victor-sudakov.dreamwidth.org/data/atom/?itemid=518722"/>
    <title>Цвет рабочего стола OS/2 Warp</title>
    <published>2021-05-06T06:00:29Z</published>
    <updated>2021-05-08T00:40:37Z</updated>
    <category term="копилка опыта"/>
    <category term="shell"/>
    <dw:security>public</dw:security>
    <dw:reply-count>0</dw:reply-count>
    <content type="html">#007f7f&lt;br /&gt;&lt;br /&gt;Приятный для глаз шрифт для терминала: "Source Code Pro Regular 13" or "Monospace Regular 12".&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=victor_sudakov&amp;ditemid=518722" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-08-11:1070441:518296</id>
    <link rel="alternate" type="text/html" href="https://victor-sudakov.dreamwidth.org/518296.html"/>
    <link rel="self" type="text/xml" href="https://victor-sudakov.dreamwidth.org/data/atom/?itemid=518296"/>
    <title>Diff two stdout streams</title>
    <published>2021-04-12T03:31:02Z</published>
    <updated>2021-04-12T03:31:02Z</updated>
    <category term="unix"/>
    <category term="копилка опыта"/>
    <category term="shell"/>
    <dw:security>public</dw:security>
    <dw:reply-count>0</dw:reply-count>
    <content type="html">&lt;p&gt;Интересная возможность сабжевая в bash есть, можно работать со stdout как с файлом:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ diff -q &amp;lt;(echo qq) &amp;lt;(echo qq1)
Files /dev/fd/63 and /dev/fd/62 differ
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=victor_sudakov&amp;ditemid=518296" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-08-11:1070441:517262</id>
    <link rel="alternate" type="text/html" href="https://victor-sudakov.dreamwidth.org/517262.html"/>
    <link rel="self" type="text/xml" href="https://victor-sudakov.dreamwidth.org/data/atom/?itemid=517262"/>
    <title>BSD apply</title>
    <published>2021-03-19T09:07:11Z</published>
    <updated>2021-05-26T02:11:57Z</updated>
    <category term="копилка опыта"/>
    <category term="unix"/>
    <category term="shell"/>
    <dw:security>public</dw:security>
    <dw:reply-count>0</dw:reply-count>
    <content type="html">&lt;p&gt;Под FreeBSD привык к утилите &lt;a href="https://www.freebsd.org/cgi/man.cgi?query=apply"&gt;apply&lt;/a&gt;, очень не хватало ее под линуксом для повседневных задач. Под линукс нашлась утилита &lt;a href="https://manpages.debian.org/buster/xe/xe.1.en.html"&gt;xe&lt;/a&gt;, которая делает то же самое, хотя с непривычки кажется, что менее удобно.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ 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.
&lt;/code&gt;&lt;/pre&gt;

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

&lt;pre&gt;&lt;code&gt;$ 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
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;UPD А еще можно собрать настоящий apply из &lt;a href="https://github.com/leahneukirchen/outils"&gt;outils&lt;/a&gt;. Для сборки на Debian достаточно build-essential.&lt;/p&gt;
&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=victor_sudakov&amp;ditemid=517262" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-08-11:1070441:504434</id>
    <link rel="alternate" type="text/html" href="https://victor-sudakov.dreamwidth.org/504434.html"/>
    <link rel="self" type="text/xml" href="https://victor-sudakov.dreamwidth.org/data/atom/?itemid=504434"/>
    <title>Избавление от alternate screen</title>
    <published>2020-07-27T15:24:17Z</published>
    <updated>2020-07-28T02:27:18Z</updated>
    <category term="shell"/>
    <category term="vim"/>
    <category term="unix"/>
    <category term="копилка опыта"/>
    <dw:security>public</dw:security>
    <dw:reply-count>0</dw:reply-count>
    <content type="html">&lt;p&gt;Можно отключить alternate screen в vim в ~/.vimrc&lt;/p&gt;

&lt;p&gt;&lt;code&gt;set t_ti= t_te=&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;или в less установкой переменной среды:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;setenv LESS "-X"&lt;/code&gt;&lt;/p&gt;

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

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

&lt;p&gt;&lt;code&gt;set-window-option -g alternate-screen off&lt;/code&gt;&lt;/p&gt;
&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=victor_sudakov&amp;ditemid=504434" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-08-11:1070441:490650</id>
    <link rel="alternate" type="text/html" href="https://victor-sudakov.dreamwidth.org/490650.html"/>
    <link rel="self" type="text/xml" href="https://victor-sudakov.dreamwidth.org/data/atom/?itemid=490650"/>
    <title>Быстро узнать свой внешний IP-адрес из командной строки</title>
    <published>2020-02-28T04:15:17Z</published>
    <updated>2022-11-30T04:33:26Z</updated>
    <category term="networks"/>
    <category term="ipv6"/>
    <category term="shell"/>
    <category term="копилка опыта"/>
    <category term="unix"/>
    <dw:security>public</dw:security>
    <dw:reply-count>1</dw:reply-count>
    <content type="html">fetch -4 -o- &lt;a href="http://ident.me"&gt;http://ident.me&lt;/a&gt;; fetch -6 -o- &lt;a href="http://ident.me"&gt;http://ident.me&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;На Linux можно "curl -4 &lt;a href="http://ident.me"&gt;http://ident.me&lt;/a&gt;".&lt;br /&gt;&lt;br /&gt;UPD есть еще &lt;a href="http://ifconfig.me"&gt;http://ifconfig.me&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
curl ident.me
curl -6 ident.me
curl ifconfig.me
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Если нет браузера, например надо из командной строки Cisco, то &lt;pre&gt;telnet ident.me&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=victor_sudakov&amp;ditemid=490650" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-08-11:1070441:482761</id>
    <link rel="alternate" type="text/html" href="https://victor-sudakov.dreamwidth.org/482761.html"/>
    <link rel="self" type="text/xml" href="https://victor-sudakov.dreamwidth.org/data/atom/?itemid=482761"/>
    <title>Плагин Integrity Checker к Far</title>
    <published>2019-09-17T05:24:06Z</published>
    <updated>2019-09-17T05:24:06Z</updated>
    <category term="shell"/>
    <category term="копилка опыта"/>
    <category term="windows"/>
    <dw:security>public</dw:security>
    <dw:reply-count>0</dw:reply-count>
    <content type="html">Очень удобный плагин Integrity Checker для подсчета, сравнения и проверки контрольных сумм файлов (Автор: Ariman).&lt;br /&gt;&lt;br /&gt;&lt;a href="https://github.com/lazyhamster/IntChecker/releases"&gt;https://github.com/lazyhamster/IntChecker/releases&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=victor_sudakov&amp;ditemid=482761" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-08-11:1070441:470683</id>
    <link rel="alternate" type="text/html" href="https://victor-sudakov.dreamwidth.org/470683.html"/>
    <link rel="self" type="text/xml" href="https://victor-sudakov.dreamwidth.org/data/atom/?itemid=470683"/>
    <title>Поток байт с FreeBSD сохранить на Windows</title>
    <published>2019-05-01T07:12:07Z</published>
    <updated>2019-05-01T07:26:01Z</updated>
    <category term="windows"/>
    <category term="unix"/>
    <category term="копилка опыта"/>
    <category term="shell"/>
    <dw:security>public</dw:security>
    <dw:reply-count>6</dw:reply-count>
    <content type="html">Когда mount_smbfs стал окончательно бесполезен после повсеместного выключения SMBv1, встал вопрос о том, как сохранять на Windows-файлсервере резервные копии FreeBSD без создания временных файлов на самой FreeBSD (для последующей передачи по FTP и т.п.)&lt;br /&gt;&lt;br /&gt;Посоветовали поставить OpenSSH на Windows, он заработал, появилась возможность делать SSH/SCP с FreeBSD на Windows, даже с аутентификацией по ключу. Однако чем на стороне Windows поймать вывод "zfs send" или "dump -f -" и сохранить в файл, оставалось по-прежнему неясным. &lt;br /&gt;&lt;br /&gt;Решение было найдено неожиданное. Архиватор 7-Zip умеет работать в потоковом режиме, в том числе его виндовая реализация. Поэтому делаю так:&lt;br /&gt;&lt;pre&gt;zfs send XXX@weekly-2019-14 | ssh winserver "7z a -si b:\backup\XXX-weekly-2019-14.7z"&lt;/pre&gt;&lt;br /&gt;Заодно 7-Zip его немного сжимает.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=victor_sudakov&amp;ditemid=470683" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-08-11:1070441:468856</id>
    <link rel="alternate" type="text/html" href="https://victor-sudakov.dreamwidth.org/468856.html"/>
    <link rel="self" type="text/xml" href="https://victor-sudakov.dreamwidth.org/data/atom/?itemid=468856"/>
    <title>решение проблемы с efi boot в bhyve и VirtualBox</title>
    <published>2019-04-08T15:54:32Z</published>
    <updated>2019-04-27T16:42:47Z</updated>
    <category term="virtualization"/>
    <category term="shell"/>
    <category term="bug"/>
    <category term="копилка опыта"/>
    <category term="unix"/>
    <category term="hardware"/>
    <category term="boot"/>
    <dw:security>public</dw:security>
    <dw:reply-count>0</dw:reply-count>
    <content type="html">bhyve и некоторые другие гипервизоры (похоже что VirtualBox тоже) в режиме EFI не поддерживают эмуляцию NVRAM для сохранения efi variables между перезагрузками. Это может привести к проблеме: гостевая ОС установится штатно, а после перезагрузки получаем сообщение от EFI наподобие&lt;br /&gt;&lt;pre&gt;
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
.
&lt;/pre&gt;&lt;br /&gt;Это происходит оттого, что инсталлятор при установке ОС сохранил в efi variables путь к загрузчику (например "\EFI\centos\grubx64.efi"), а после перезагрузки гостевой системы  настройка забылась и гипервизор начинает пытаться грузить нечто другое, что заложено в него по умолчанию или по эвристике.&lt;br /&gt;&lt;br /&gt;Решений может быть несколько.&lt;br /&gt;&lt;br /&gt;Первое тупое. Подмонтировать как-нибудь efi-раздел установленной гостевой ОС (например из другой виртуалки, или из LiveCD в той же виртуалке) и положить нужный загрузчик в то место, где его ищет и не может найти гипервизор: например подложить его в качестве "\EFI\BOOT\BOOTX64.EFI", или как в примере выше, скопировать из \EFI\centos\grubx64.efi в \EFI\BOOT\grubx64.efi.&lt;br /&gt;&lt;br /&gt;Второе более интересное. После неудачной загрузки дождаться EFI interactive shell и создать файл startup.nsh, это типа такой autoexec.bat:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
fs0:
edit startup.nsh
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;А в нем уже прописать тот загрузчик, который нужен гостевой ОС, например строчку "\EFI\centos\grubx64.efi".&lt;br /&gt;&lt;br /&gt;Третье фантастическое. Запинать авторов UEFI-EDK2 firmware реализовать поддержку сохранения efi variables между перезагрузками.&lt;br /&gt;&lt;br /&gt;UPDATE. Вот на ту же тему &lt;a href="https://www.centos.org/forums/viewtopic.php?p=278745#p278745"&gt;https://www.centos.org/forums/viewtopic.php?p=278745#p278745&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;UPDATE 2. А инсталлятор FreeBSD уже сразу создает в EFI-разделе startup.nsh c нужным загрузчиком. Молодцы!&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=victor_sudakov&amp;ditemid=468856" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-08-11:1070441:468058</id>
    <link rel="alternate" type="text/html" href="https://victor-sudakov.dreamwidth.org/468058.html"/>
    <link rel="self" type="text/xml" href="https://victor-sudakov.dreamwidth.org/data/atom/?itemid=468058"/>
    <title>PuTTY</title>
    <published>2019-03-23T04:59:43Z</published>
    <updated>2019-03-28T14:04:56Z</updated>
    <category term="shell"/>
    <category term="funny"/>
    <dw:security>public</dw:security>
    <dw:reply-count>0</dw:reply-count>
    <content type="html">Человек, у которого не установлен &lt;a href="https://www.chiark.greenend.org.uk/~sgtatham/putty/"&gt;PuTTY&lt;/a&gt;, называется непутёвым. У которого установлен - уже путный человек. А у В.В.Путина установлена специальная версия PuTTY с поддержкой SSH до 10 версии включительно.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=victor_sudakov&amp;ditemid=468058" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-08-11:1070441:466386</id>
    <link rel="alternate" type="text/html" href="https://victor-sudakov.dreamwidth.org/466386.html"/>
    <link rel="self" type="text/xml" href="https://victor-sudakov.dreamwidth.org/data/atom/?itemid=466386"/>
    <title>Удобства в Far Manager</title>
    <published>2019-02-28T15:58:56Z</published>
    <updated>2019-02-28T15:59:40Z</updated>
    <category term="windows"/>
    <category term="копилка опыта"/>
    <category term="shell"/>
    <dw:security>public</dw:security>
    <dw:reply-count>0</dw:reply-count>
    <content type="html">Копировать имя текущего файла вместе с полным путем в буфер обмена: Alt+Shift+Ins&lt;br /&gt;&lt;br /&gt;Поймать вывод команды в буфер обмена, редактор или вьюер:&lt;br /&gt;&lt;pre&gt;
tracert ya.ru | clip
edit:&amp;lt;tracert ya.ru
view:&amp;lt;tracert ya.ru
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=victor_sudakov&amp;ditemid=466386" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-08-11:1070441:465204</id>
    <link rel="alternate" type="text/html" href="https://victor-sudakov.dreamwidth.org/465204.html"/>
    <link rel="self" type="text/xml" href="https://victor-sudakov.dreamwidth.org/data/atom/?itemid=465204"/>
    <title>Вывести графическое оповещение в Windows</title>
    <published>2019-02-04T12:50:04Z</published>
    <updated>2019-08-26T06:10:26Z</updated>
    <category term="копилка опыта"/>
    <category term="shell"/>
    <category term="windows"/>
    <dw:security>public</dw:security>
    <dw:reply-count>0</dw:reply-count>
    <content type="html">Вывести на рабочий стол графическое оповещение, наподобие убранного "net send", можно с помощью PowerShell&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
powershell -windowstyle hidden -command "[reflection.assembly]::LoadWithPartialName('System.Windows.Forms')|out-null;[windows.forms.messagebox]::Show('%COMPUTERNAME%')"
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Данный пример выведет оповещение с именем компьютера.&lt;br /&gt;&lt;br /&gt;Безобразная длинная строчка, но разбить её на несколько не получается, "^" внутри кавычек не работает.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=victor_sudakov&amp;ditemid=465204" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-08-11:1070441:463780</id>
    <link rel="alternate" type="text/html" href="https://victor-sudakov.dreamwidth.org/463780.html"/>
    <link rel="self" type="text/xml" href="https://victor-sudakov.dreamwidth.org/data/atom/?itemid=463780"/>
    <title>nginx и CGI скрипты</title>
    <published>2019-01-24T15:28:55Z</published>
    <updated>2019-01-25T01:06:26Z</updated>
    <category term="unix"/>
    <category term="web"/>
    <category term="копилка опыта"/>
    <category term="shell"/>
    <dw:security>public</dw:security>
    <dw:reply-count>0</dw:reply-count>
    <content type="html">nginx, в отличие например от Apache httpd, не умеет сам запускать CGI-скрипты, ему нужен внешний сервер приложений, с которым nginx будет &lt;a href="https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html"&gt;общаться&lt;/a&gt; по протоколу FastCGI или другому.&lt;br /&gt;&lt;br /&gt;Если не нужна высокая производительность или фичи, а просто хочется эмулировать функционал апачевского 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-скриптах).&lt;br /&gt;&lt;br /&gt;Если CGI-скрипты планируется держать в /usr/local/www/cgi-bin/, а сокет для обмена между nginx и fcgiwrap в /tmp/fcgiwrap.socket, то секция nginx.conf должна выглядеть так:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
        location /cgi-bin/ {
            root   /usr/local/www;
            include /usr/local/etc/nginx/fastcgi_params;
            fastcgi_pass unix:/tmp/fcgiwrap.socket;
        }
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Обратите внимание, что в директиве root отсутствует "cgi-bin", хотя это реальный каталог на диске, в котором хранятся скрипты. Почему так?&lt;br /&gt;&lt;br /&gt;Дело в том, что путь к скрипту задаётся (передаётся в fcgiwrap) склеиванием двух переменных: DOCUMENT_ROOT и SCRIPT_NAME, в которые мапятся (в fastcgi_params) nginx-овские переменные $document_root и $fastcgi_script_name соответственно. По умолчанию $fastcgi_script_name=$request_uri, то есть при обращении к &lt;pre&gt;http://myserver.example/cgi-bin/myscript&lt;/pre&gt; fcgiwrap получит команду найти на диске и выполнить "/usr/local/www"+"/cgi-bin/myscript". Естественно $fastcgi_script_name можно переопределить, например с помощью  $fastcgi_split_path_info, но для простейшей эмуляции mod_cgi это не нужно.&lt;br /&gt;&lt;br /&gt;Отлаживать скрипты вообще без веб-сервера можно как показано ниже, заодно это помогает лучше понять протокол обмена:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;#!/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'
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=victor_sudakov&amp;ditemid=463780" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-08-11:1070441:456415</id>
    <link rel="alternate" type="text/html" href="https://victor-sudakov.dreamwidth.org/456415.html"/>
    <link rel="self" type="text/xml" href="https://victor-sudakov.dreamwidth.org/data/atom/?itemid=456415"/>
    <title>IFCONFIG_FORMAT</title>
    <published>2018-10-17T16:34:51Z</published>
    <updated>2018-10-27T17:02:01Z</updated>
    <category term="networks"/>
    <category term="копилка опыта"/>
    <category term="unix"/>
    <category term="shell"/>
    <dw:security>public</dw:security>
    <dw:reply-count>0</dw:reply-count>
    <content type="html">Очень неудобно видеть во FreeBSD в выводе ifconfig маску сети в виде "netmask 0xfffffe00". И кто такое придумал? &lt;br /&gt;&lt;br /&gt;К счастью, теперь есть переменная среды IFCONFIG_FORMAT, и "setenv IFCONFIG_FORMAT inet:cidr" или "setenv IFCONFIG_FORMAT inet:dotted" помогают увидеть маску подсети в привычном виде.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=victor_sudakov&amp;ditemid=456415" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-08-11:1070441:434680</id>
    <link rel="alternate" type="text/html" href="https://victor-sudakov.dreamwidth.org/434680.html"/>
    <link rel="self" type="text/xml" href="https://victor-sudakov.dreamwidth.org/data/atom/?itemid=434680"/>
    <title>Сформировать строчку для master.passwd</title>
    <published>2018-02-06T16:17:37Z</published>
    <updated>2018-02-10T04:17:30Z</updated>
    <category term="unix"/>
    <category term="копилка опыта"/>
    <category term="shell"/>
    <category term="security"/>
    <dw:security>public</dw:security>
    <dw:reply-count>1</dw:reply-count>
    <content type="html">"openssl passwd" не работает с современными алгоритмами хэширования, поэтому приходится использовать Питон:&lt;br /&gt;&lt;pre&gt;python3.6 -c 'import crypt; print(crypt.crypt("MySecretPass",crypt.mksalt(crypt.METHOD_SHA512)))'&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Более изящные варианты welcome.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=victor_sudakov&amp;ditemid=434680" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-08-11:1070441:432154</id>
    <link rel="alternate" type="text/html" href="https://victor-sudakov.dreamwidth.org/432154.html"/>
    <link rel="self" type="text/xml" href="https://victor-sudakov.dreamwidth.org/data/atom/?itemid=432154"/>
    <title>Filenames and Pathnames in Shell</title>
    <published>2018-01-08T07:54:13Z</published>
    <updated>2018-01-08T07:57:29Z</updated>
    <category term="shell"/>
    <category term="цитаты"/>
    <category term="копилка опыта"/>
    <category term="unix"/>
    <dw:security>public</dw:security>
    <dw:reply-count>0</dw:reply-count>
    <content type="html">Две ссылки о том, как правильно обрабатывать имена файлов и каталогов в скриптах на sh&lt;br /&gt;&lt;br /&gt;"Filenames and Pathnames in Shell: How to do it Correctly" &lt;a href="https://www.dwheeler.com/essays/filenames-in-shell.html"&gt;https://www.dwheeler.com/essays/filenames-in-shell.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;"Fixing Unix/Linux/POSIX Filenames:&lt;br /&gt;Control Characters (such as Newline), Leading Dashes, and Other Problems" &lt;a href="https://www.dwheeler.com/essays/fixing-unix-linux-filenames.html"&gt;https://www.dwheeler.com/essays/fixing-unix-linux-filenames.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=victor_sudakov&amp;ditemid=432154" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-08-11:1070441:431585</id>
    <link rel="alternate" type="text/html" href="https://victor-sudakov.dreamwidth.org/431585.html"/>
    <link rel="self" type="text/xml" href="https://victor-sudakov.dreamwidth.org/data/atom/?itemid=431585"/>
    <title>Повтор команды до успеха в tcsh</title>
    <published>2018-01-01T15:27:22Z</published>
    <updated>2018-01-08T07:57:10Z</updated>
    <category term="morons"/>
    <category term="копилка опыта"/>
    <category term="unix"/>
    <category term="shell"/>
    <dw:security>public</dw:security>
    <dw:reply-count>0</dw:reply-count>
    <content type="html">Я знаю, что психически здоровые люди не пользуются csh, а только с детства ушибленные BSD. Cабж в интерактивном шелле делается так:&lt;br /&gt;&lt;pre&gt;$ while ( { my_cmd } == 0 )
while? sleep 3
while? end&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Если команда my_cmd завершилась неуспешно (с ненулевым кодом), то { my_cmd } будет равен нулю. &lt;s&gt;Истина - это ложь, война - это мир...&lt;/s&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=victor_sudakov&amp;ditemid=431585" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-08-11:1070441:160198</id>
    <link rel="alternate" type="text/html" href="https://victor-sudakov.dreamwidth.org/160198.html"/>
    <link rel="self" type="text/xml" href="https://victor-sudakov.dreamwidth.org/data/atom/?itemid=160198"/>
    <title>Esc+P, Esc+N  в bash как в tcsh</title>
    <published>2013-02-04T04:45:12Z</published>
    <updated>2018-01-08T08:03:01Z</updated>
    <category term="shell"/>
    <category term="копилка опыта"/>
    <category term="unix"/>
    <dw:security>public</dw:security>
    <dw:reply-count>0</dw:reply-count>
    <content type="html">tcsh's ESC-p, ESC-n to jump to command starting with what you typed so far for bash:&lt;br /&gt;&lt;br /&gt;$ more ~/.inputrc&lt;br /&gt;"\ep": history-search-backward&lt;br /&gt;"\en": history-search-forward&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=victor_sudakov&amp;ditemid=160198" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-08-11:1070441:67114</id>
    <link rel="alternate" type="text/html" href="https://victor-sudakov.dreamwidth.org/67114.html"/>
    <link rel="self" type="text/xml" href="https://victor-sudakov.dreamwidth.org/data/atom/?itemid=67114"/>
    <title>find world and group writable files</title>
    <published>2011-09-08T10:54:06Z</published>
    <updated>2018-01-08T08:03:10Z</updated>
    <category term="shell"/>
    <category term="копилка опыта"/>
    <category term="unix"/>
    <dw:security>public</dw:security>
    <dw:reply-count>0</dw:reply-count>
    <content type="html">find /some/dir -perm -0002&lt;br /&gt;find /some/dir -perm -0020&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=victor_sudakov&amp;ditemid=67114" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
</feed>
