Шукати в цьому блозі

Показ дописів із міткою linux. Показати всі дописи
Показ дописів із міткою linux. Показати всі дописи

вівторок, 23 квітня 2024 р.

dpkg-deb: error: archive '…skip….deb' uses unknown compression for member 'control.tar.zst', giving up

 За останні декілька днів вже два рази зіткнувся з помилкою "unknown compression for member" при встановленні deb-пакетів. Один раз це відбулося в Linux-контейнері FydeOS, другий раз в Debian Bullseye (11.9). І так, я цілком усвідомлюю, що є новіша версія Debian і там такої помилки не буде. Але що робити якщо є?

Було знайдено наступний "рецепт" (на прикладі apache-netbeans_21-1_all.deb):

$ mkdir apache-netbeans_21-1
$ cd apache-netbeans_21-1/
$ ln -s ../apache-netbeans_21-1_all.deb .
$ ar x apache-netbeans_21-1_all.deb
$ zstd -d < control.tar.zst | xz > control.tar.xz
$ zstd -d < data.tar.zst | xz > data.tar.xz
$ rm apache-netbeans_21-1_all.deb
$ ar -m -c -a sdsd apache-netbeans_21-1_all.deb debian-binary control.tar.xz data.tar.xz
$ rm debian-binary control.tar.xz data.tar.xz control.tar.zst data.tar.zst
$ sudo dpkg -i apache-netbeans_21-1_all.deb

субота, 6 квітня 2024 р.

Key is stored in legacy trusted.gpg keyring, see the DEPRECATION section in apt-key(8) for details

 Дано:

$ apt update
В кеші:1 http://raspbian.raspberrypi.org/raspbian bookworm InRelease
В кеші:2 http://archive.raspberrypi.org/debian bullseye InRelease                                                    
В кеші:3 https://download.docker.com/linux/raspbian bullseye InRelease                                               
Зчитування переліків пакунків... Виконано           
Побудова дерева залежностей... Виконано
Зчитування інформації про стан... Виконано   
1 package can be upgraded. Run 'apt list --upgradable' to see it.
W: http://raspbian.raspberrypi.org/raspbian/dists/bookworm/InRelease: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(8) for details.

"Ліки":

$ apt-key list | grep -A4 "trusted.gpg$"
Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8)).
/etc/apt/trusted.gpg
--------------------
pub   rsa2048 2012-04-01 [SC]
      A0DA 38D0 D76E 8B5D 6388  7281 9165 938D 90FD DD2E
uid           [невідома] Mike Thompson (Raspberry Pi Debian armhf ARMv6+VFP) <mpthompson@gmail.com>

$ sudo apt-key export 90FDDD2E | sudo gpg --dearmor -o /tmp/raspi.gpg
Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8)).

$ file /tmp/raspi.gpg
/tmp/raspi.gpg: OpenPGP Public Key Version 4, Created Sun Apr  1 21:02:33 2012, RSA (Encrypt or Sign, 2048 bits); User ID; Signature; OpenPGP Certificate

$ sudo apt-key del 90FDDD2E
Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8)).
OK

$ sudo mv /tmp/raspi.gpg /etc/apt/trusted.gpg.d/

$ apt update
В кеші:1 http://archive.raspberrypi.org/debian bullseye InRelease
В кеші:2 https://download.docker.com/linux/raspbian bullseye InRelease                                              
В кеші:3 http://raspbian.raspberrypi.org/raspbian bookworm InRelease                                                
Зчитування переліків пакунків... Виконано        
Побудова дерева залежностей... Виконано
Зчитування інформації про стан... Виконано   
1 package can be upgraded. Run 'apt list --upgradable' to see it.

середа, 27 березня 2024 р.

Налаштовуємо netfilter в Linux для виявлення потенційно небажаного трафіка

 Хочу поділится одним "рецептом", який алгоритм роботи якого вже доволі давно було опробовано на RouterOS і от лише нещодавно переписано під netfilter.

В чому полягає ідея?

До того як з'єднання буде встановлено у стан established перевірити потік трафіку, скажемо так, на періодичність доступу. Адже, давайте скажемо чесно, доступ до наших ресурсів (до нашого хоста) з тих чи інших адрес в Інтернет, на порти, на яких не задіяно жодних сервісів, завжди виглядає як не небажаним то підозрілим.

Що ми робимо? Ми організовуємо set-и з timeout-ами. Ці timeout-и можуть бути виставлені в доволі різні значення, але ідея полягає саме в тому, щоб обмежити доступ до хоста, якщо хтось доволі сильно знахабніє у встановлений час. Set-ів може бути багато, може бути мало, в прикладі їх наведено 16. За аналогією можна зробити 10, а можна зробити й 20, тут вже лише фантазія обмежує.

Від лірики до практики.

sudo nft add table ip scanDetector

Створимо "списки довіри". Хтось може обізвати whitelist, але я обізвав trusted та ignore, так вже історично склалося.

sudo nft add set ip scanDetector trusted { type ipv4_addr\; flags interval\; auto-merge\; comment \"Truster ip and net\" \; }
sudo nft add element ip scanDetector trusted { 192.168.1.0/24, 195.38.16.2, 195.38.16.8 }

sudo nft add set ip scanDetector ignore { type ipv4_addr\; flags interval\; auto-merge\; comment \"Ignore ip and net\" \; }
sudo nft add element ip scanDetector ignore { 0.0.0.0, 127.0.0.0/8 }

Тепер створимо set-и у створеній нами таблиці scanDetector:
sudo nft add set ip scanDetector level15 { type ipv4_addr\; flags dynamic\; comment \"SynScan Level 15\" \; timeout 1m \; }
sudo nft add set ip scanDetector level14 { type ipv4_addr\; flags dynamic\; comment \"SynScan Level 14\" \; timeout 2m \;  }
sudo nft add set ip scanDetector level13 { type ipv4_addr\; flags dynamic\; comment \"SynScan Level 13\" \; timeout 3m \;  }
sudo nft add set ip scanDetector level12 { type ipv4_addr\; flags dynamic\; comment \"SynScan Level 12\" \; timeout 4m \;  }
sudo nft add set ip scanDetector level11 { type ipv4_addr\; flags dynamic\; comment \"SynScan Level 11\" \; timeout 5m \;  }
sudo nft add set ip scanDetector level10 { type ipv4_addr\; flags dynamic\; comment \"SynScan Level 10\" \; timeout 10m \;  }
sudo nft add set ip scanDetector level9  { type ipv4_addr\; flags dynamic\; comment \"SynScan Level 9\" \;  timeout 15m \;  }
sudo nft add set ip scanDetector level8  { type ipv4_addr\; flags dynamic\; comment \"SynScan Level 8\" \;  timeout 20m \; }
sudo nft add set ip scanDetector level7  { type ipv4_addr\; flags dynamic\; comment \"SynScan Level 7\" \;  timeout 30m \; }
sudo nft add set ip scanDetector level6  { type ipv4_addr\; flags dynamic\; comment \"SynScan Level 6\" \;  timeout 40m \; }
sudo nft add set ip scanDetector level5  { type ipv4_addr\; flags dynamic\; comment \"SynScan Level 5\" \;  timeout 50m \; }
sudo nft add set ip scanDetector level4  { type ipv4_addr\; flags dynamic\; comment \"SynScan Level 4\" \;  timeout 1h \; }
sudo nft add set ip scanDetector level3  { type ipv4_addr\; flags dynamic\; comment \"SynScan Level 3\" \;  timeout 1h10m \; }
sudo nft add set ip scanDetector level2  { type ipv4_addr\; flags dynamic\; comment \"SynScan Level 2\" \;  timeout 1h20m \; }
sudo nft add set ip scanDetector level1  { type ipv4_addr\; flags dynamic\; comment \"SynScan Level 1\" \;  timeout 1h30m \; }
sudo nft add set ip scanDetector level0  { type ipv4_addr\; flags dynamic\; comment \"SynScan Level 0\" \;  timeout 3h \; }
sudo nft add set ip scanDetector scan    { type ipv4_addr\; flags dynamic\; comment \"Scan Detect\" \;      timeout 31d \; }
"Повісимо" hook і дамо йому priority нижчий за той в якому робимо всі інші перевірки з контролю доступу:
sudo nft add chain ip scanDetector input { type filter hook input priority -50 \; }
Ну й нарешті правила, які контролюють всі пакети, які ще не пройшли перевірки, тобто мають state new, а не established, тощо:
do nft add rule scanDetector input ct state new ip saddr @trusted counter log return
sudo nft add rule scanDetector input ct state new ip saddr @ignore counter log return
sudo nft add rule scanDetector input ct state new ip saddr != @scan    ip saddr @level0  add @scan    { ip saddr } counter
sudo nft add rule scanDetector input ct state new ip saddr != @level0  ip saddr @level1  add @level0  { ip saddr } counter
sudo nft add rule scanDetector input ct state new ip saddr != @level1  ip saddr @level2  add @level1  { ip saddr } counter
sudo nft add rule scanDetector input ct state new ip saddr != @level2  ip saddr @level3  add @level2  { ip saddr } counter
sudo nft add rule scanDetector input ct state new ip saddr != @level3  ip saddr @level4  add @level3  { ip saddr } counter
sudo nft add rule scanDetector input ct state new ip saddr != @level4  ip saddr @level5  add @level4  { ip saddr } counter
sudo nft add rule scanDetector input ct state new ip saddr != @level5  ip saddr @level6  add @level5  { ip saddr } counter
sudo nft add rule scanDetector input ct state new ip saddr != @level6  ip saddr @level7  add @level6  { ip saddr } counter
sudo nft add rule scanDetector input ct state new ip saddr != @level7  ip saddr @level8  add @level7  { ip saddr } counter
sudo nft add rule scanDetector input ct state new ip saddr != @level8  ip saddr @level9  add @level8  { ip saddr } counter
sudo nft add rule scanDetector input ct state new ip saddr != @level9  ip saddr @level10 add @level9  { ip saddr } counter
sudo nft add rule scanDetector input ct state new ip saddr != @level10 ip saddr @level11 add @level10 { ip saddr } counter
sudo nft add rule scanDetector input ct state new ip saddr != @level11 ip saddr @level12 add @level11 { ip saddr } counter
sudo nft add rule scanDetector input ct state new ip saddr != @level12 ip saddr @level13 add @level12 { ip saddr } counter
sudo nft add rule scanDetector input ct state new ip saddr != @level13 ip saddr @level14 add @level13 { ip saddr } counter
sudo nft add rule scanDetector input ct state new ip saddr != @level14 ip saddr @level15 add @level14 { ip saddr } counter
sudo nft add rule scanDetector input ct state new ip saddr != @level15                   add @level15 { ip saddr } counter
sudo nft add rule scanDetector input ct state new ip saddr @scan update @scan { ip saddr } counter log prefix \"[nft] scandetect-input-drop \" drop
sudo nft add rule scanDetector input              ip saddr @scan update @scan { ip saddr } counter log prefix \"[nft] scandetect-input-another-drop \" drop
Тобто, безумовно пропускаємо трафак з хостів та мереж, які було додано в set-и trusted та ignore.  Хости в списки level15…level0 додаються поступово. І це нормально. Не кожен хто до нас "стукає" може бути зловмисником. Але якщо стукає ну дуже вже нахабно то рано чи пізно він потрапить в список scan. Так, в set scan потрапляють лише і виключно ті хости, які були ну ду-у-у-у-уже нахабними. А вибратися з set-у scan не так вже й просто, бо якщо виявляється new-пакет з хоста, що вже є в set-і scan то час його перебування в списку оновлюється на початковий, той, що задано параметром timeout.
От такий от рецепт з блокування доступу.

Масштабуємо рішення на доступ до docker-контейнерів.

Все це добре, але щоб контролювати транзитний трафік hook на input нам не дуже підходить. То додаємо hook на forward:
sudo nft add chain ip scanDetector forward { type filter hook forward priority -50 \; }
Ну, а далі треба пройтися по інтерфейсах, на яких "живуть" docker-контейнери і на них "підвісити" правила. Для цього можна скористатися переглядом або всіх netfilter-правил:
sudo nft list ruleset
або ж лише тієї частки в яких задано chain DOCKER, в моєму випадку це:
sudo nft list table filter
То ж сформуємо правила:
for IFACE in $( sudo nft list table filter | sed '/chain DOCKER {/,/^$/!d;/^$/,$d' | awk '$4~/^oifname$/ { print $5 }' | tr -d \" | sort -u ); do
    sudo nft add rule scanDetector forward iifname != ${IFACE} oifname ${IFACE} ct state new ip saddr @trusted counter log return
    sudo nft add rule scanDetector forward iifname != ${IFACE} oifname ${IFACE} ct state new ip saddr @ignore counter log return
    sudo nft add rule scanDetector forward iifname != ${IFACE} oifname ${IFACE} ct state new ip saddr != @scan    ip saddr @level0  add @scan    { ip saddr } counter
    sudo nft add rule scanDetector forward iifname != ${IFACE} oifname ${IFACE} ct state new ip saddr != @level0  ip saddr @level1  add @level0  { ip saddr } counter
    sudo nft add rule scanDetector forward iifname != ${IFACE} oifname ${IFACE} ct state new ip saddr != @level1  ip saddr @level2  add @level1  { ip saddr } counter
    sudo nft add rule scanDetector forward iifname != ${IFACE} oifname ${IFACE} ct state new ip saddr != @level2  ip saddr @level3  add @level2  { ip saddr } counter
    sudo nft add rule scanDetector forward iifname != ${IFACE} oifname ${IFACE} ct state new ip saddr != @level3  ip saddr @level4  add @level3  { ip saddr } counter
    sudo nft add rule scanDetector forward iifname != ${IFACE} oifname ${IFACE} ct state new ip saddr != @level4  ip saddr @level5  add @level4  { ip saddr } counter
    sudo nft add rule scanDetector forward iifname != ${IFACE} oifname ${IFACE} ct state new ip saddr != @level5  ip saddr @level6  add @level5  { ip saddr } counter
    sudo nft add rule scanDetector forward iifname != ${IFACE} oifname ${IFACE} ct state new ip saddr != @level6  ip saddr @level7  add @level6  { ip saddr } counter
    sudo nft add rule scanDetector forward iifname != ${IFACE} oifname ${IFACE} ct state new ip saddr != @level7  ip saddr @level8  add @level7  { ip saddr } counter
    sudo nft add rule scanDetector forward iifname != ${IFACE} oifname ${IFACE} ct state new ip saddr != @level8  ip saddr @level9  add @level8  { ip saddr } counter
    sudo nft add rule scanDetector forward iifname != ${IFACE} oifname ${IFACE} ct state new ip saddr != @level9  ip saddr @level10 add @level9  { ip saddr } counter
    sudo nft add rule scanDetector forward iifname != ${IFACE} oifname ${IFACE} ct state new ip saddr != @level10 ip saddr @level11 add @level10 { ip saddr } counter
    sudo nft add rule scanDetector forward iifname != ${IFACE} oifname ${IFACE} ct state new ip saddr != @level11 ip saddr @level12 add @level11 { ip saddr } counter
    sudo nft add rule scanDetector forward iifname != ${IFACE} oifname ${IFACE} ct state new ip saddr != @level12 ip saddr @level13 add @level12 { ip saddr } counter
    sudo nft add rule scanDetector forward iifname != ${IFACE} oifname ${IFACE} ct state new ip saddr != @level13 ip saddr @level14 add @level13 { ip saddr } counter
    sudo nft add rule scanDetector forward iifname != ${IFACE} oifname ${IFACE} ct state new ip saddr != @level14 ip saddr @level15 add @level14 { ip saddr } counter
    sudo nft add rule scanDetector forward iifname != ${IFACE} oifname ${IFACE} ct state new ip saddr != @level15                   add @level15 { ip saddr } counter
    sudo nft add rule scanDetector forward iifname != ${IFACE} oifname ${IFACE} ct state new ip saddr @scan update @scan { ip saddr } counter log prefix \"[nft] scandetect-forward-drop \" drop
    sudo nft add rule scanDetector forward iifname != ${IFACE} oifname ${IFACE}              ip saddr @scan update @scan { ip saddr } counter log prefix \"[nft] scandetect-forward-another-drop \" drop
done
Все, всі правила в table scanDetector сформовано. Заданий priority для chain нижчий за той, що задано hook-ами в table filter, відповідно й всі ці перевірки будуть виконуватися раніше. І лише після цих перевірок пакети потралятимуть на перевірку в table filter.

Подивитися на те, що вийшло

Всі set-и та правила:

sudo nft list table scanDetector

Подивитися на вміста set-у scan:

sudo nft list table scanDetector | sed '/set scan {/,/^$/!d;/^$/,$d'

Кількість елементів у set-і scan:

sudo nft list table scanDetector | sed '/set scan {/,/^$/!d;/^$/,$d' | egrep expires | awk -v RS='[[:space:]]+' '/expires/' | wc -l

Які підводні камені?

Ну, наприклад, одних з неприємних моментів, при застосуванні лише цих правил, може бути блокування зовнішніх клієнтів, наприклад, web-сервісів, які можуть бути розташовані на хосту. Вірішеється це доволі просто, теж з set-ами, але це тема для зовсім іншої статті.

неділя, 24 березня 2024 р.

Встановлення VirtualBox на Debian 12 (bookworm)

Без зайвих слів, покроково:

  1. wget -O- -q https://www.virtualbox.org/download/oracle_vbox_2016.asc | sudo gpg --dearmour -o /usr/share/keyrings/oracle_vbox_2016.gpg
  2. echo "deb [arch=amd64 signed-by=/usr/share/keyrings/oracle_vbox_2016.gpg] http://download.virtualbox.org/virtualbox/debian bookworm contrib" | sudo tee /etc/apt/sources.list.d/virtualbox.list
  3. sudo apt update
  4. sudo apt install virtualbox-7.0
  5. wget https://download.virtualbox.org/virtualbox/$( vboxmanage -v | cut -dr -f1 )/Oracle_VM_VirtualBox_Extension_Pack-$( vboxmanage -v | cut -dr -f1 ).vbox-extpack
  6. sudo vboxmanage extpack install Oracle_VM_VirtualBox_Extension_Pack-7.0.14.vbox-extpack
    vboxmanage list extpacks
  7. groups ${USERNAME}
    sudo usermod -a -G vboxusers ${USERNAME}

четвер, 11 січня 2024 р.

Альтернатива poweroff та reboot в Linux

Так чи інакше, всі сучасні, більш-менш просунуті в консолі користувачі Linux знають про команди:

$ sudo reboot
$ sudo poweroff

Косматі діді з бородами можуть згадати про магічні заклинання через команду shutdown, як то, в сачасній інтерпретації:

$ sudo shutdown -r -t now
$ sudo shutdown -P -t now

Але для справжніх джедаїв є інший шлях!

Якщо "не хочуть" працювати а ні reboot, а ні poweroff то…

Перезавантажуємо хост з Linux на борту:

# echo 1 > /proc/sys/kernel/sysrq
# echo b > /proc/sysrq-trigger

Те саме, тільки перед перезавантаженням робимо аналог sync

# echo 1 > /proc/sys/kernel/sysrq
# echo s > /proc/sysrq-trigger
# echo b > /proc/sysrq-trigger

Ну, а наступні магічні закляття просто вимикають хост:

# echo 1 > /proc/sys/kernel/sysrq
# echo о > /proc/sysrq-trigger

Як при цьому ще й зробити sync, пропоную здогадатися самостійно ;)

четвер, 28 грудня 2023 р.

binfmts для exe-файлів

В попередній статті я частково вже зачепив тему binfmts.

Що це за приблуда, що це за звір такий?

update-binfmts — maintain registry of executable binary formats

Тобто в Debian (та й інших дистрибутивах Linux) ми можемо запускати бінарні файли на виконання, навіть якщо це не ELF. Просто для цього треба навчити Linux їх запускати.

Для початку можна подивитися на вже встановлені зв'язки. Виглядатиме це приблизно так:

$ sudo update-binfmts --display
cli (enabled):
     package = mono-runtime
        type = magic
      offset = 0
       magic = MZ
        mask = 
 interpreter = /usr/bin/cli
    detector = /usr/lib/cli/binfmt-detector-cli
jar (enabled):
     package = oracle-java16
        type = magic
      offset = 0
       magic = PK\x03\x04
        mask = 
 interpreter = /usr/lib/jvm/java-16-oracle/lib/jexec
    detector = 
python2.7 (enabled):
     package = python2.7
        type = magic
      offset = 0
       magic = \x03\xf3\x0d\x0a
        mask = 
 interpreter = /usr/bin/python2.7
    detector = 
python3.9 (enabled):
     package = python3.9
        type = magic
      offset = 0
       magic = \x61\x0d\x0d\x0a
        mask = 
 interpreter = /usr/bin/python3.9
    detector = 

Як бачимо то тут встановлено зв'язки для бінарних (скопмільованих) форматів - cli (exe), jar, python 2.7 та 3.9.

Якщо раптом закортить додати запуск exe (MZ) не через wine то достатньо просто додати наступну конфігурацію:

$ sudo update-binfmts --package wine --install wine /usr/bin/wine --magic 'MZ'

Дивимося:

$ sudo update-binfmts --display
cli (enabled):
     package = mono-runtime
        type = magic
      offset = 0
       magic = MZ
        mask = 
 interpreter = /usr/bin/cli
    detector = /usr/lib/cli/binfmt-detector-cli
jar (enabled):
     package = oracle-java16
        type = magic
      offset = 0
       magic = PK\x03\x04
        mask = 
 interpreter = /usr/lib/jvm/java-16-oracle/lib/jexec
    detector = 
python2.7 (enabled):
     package = python2.7
        type = magic
      offset = 0
       magic = \x03\xf3\x0d\x0a
        mask = 
 interpreter = /usr/bin/python2.7
    detector = 
python3.9 (enabled):
     package = python3.9
        type = magic
      offset = 0
       magic = \x61\x0d\x0d\x0a
        mask = 
 interpreter = /usr/bin/python3.9
    detector = 
wine (enabled):
     package = wine
        type = magic
      offset = 0
       magic = MZ
        mask = 
 interpreter = /usr/bin/wine
    detector = 

Все, після цього можна "прозоро" запускати exe-файли через wine. Наприклад:

$ chmod +x ./winbox-3.40.exe
$ ./winbox-3.40.exe

Якщо ж хочеться встановити коректне відображення кодування CP1251 то можна виконати запуск наступним чином:

$ LANG=ru_RU.cp1251 luit winbox.exe

Видалити конфігурацію binfmts так само легко як і встановити:

$ sudo update-binfmts --package wine --remove wine /usr/bin/wine

Ось така магія ;)

Java 21 & Debian (Ubuntu)

Нарешті! Нарешті це сталося!

Oracle почала випускати deb-пакети з Java. Принаймні Java 21 вже можна завантажити як deb-пакет. А далі все стає просто і без зайвих танців з бубном. За потреби, видаляємо залишки openjdk:

sudo apt purge openjdk-17-jre-headless

Також, переда встановленням deb-пакету з Java 21, краще видалити binfmts для попередньої версії (в моєму випадку це openjdk-17):

sudo update-binfmts --display
sudo update-binfmts --package openjdk-17 --remove jar /usr/bin/jexec

Встановлюємо пакет:

sudo dpkg -i jdk-21_linux-x64_bin.deb

Все ;)

понеділок, 18 грудня 2023 р.

Viber 21.0.0.1 на Debian 11.8 (Bullseye)

 Зіткнувся з проблемою при оновленні версії Viber, а саме - припинив запускатися. При запуску в консолі виводить наступне:

$ /opt/viber/Viber
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.

Available platform plugins are: wayland, eglfs, minimalegl, minimal, offscreen, vnc, linuxfb, wayland-egl, xcb.
З'ясувалося, що лікується доволі просто, хоч і не очевидно. Встановлюємо пакет libxcb-cursor0:
$ sudo apt install libxcb-cursor0
Після встановлення Viber "ожив".
Неочевидність полягає саме в тому, що встановлення самого по собі пакету xcb не допомагає. Більше того, для роботи Viber, його можна й не встановлювати.

понеділок, 2 жовтня 2023 р.

Встановлення з'єднання wireguard між Mikrotik та Linux (Debian)

Linux

Встановлюємо пакети wireguard та wireguard-dkms:

# apt install wireguard wireguard-dkms

Створюємо пару ключів:

# cd /etc/wireguard
# wg genkey > private-key
# wg pubkey > public-key < private-key

Скоріш за все, після цього, не зможете отримати доступ з під поточного користувача до файлів /etc/wireguard/private-key та /etc/wireguard/public-key. Хтось грається з заміною користувача та/або групи для каталогу /etc/wireguard, але я пропоную/практикую інший шлях:

$ sudo setfacl -m u:username:r-x /etc/wireguard
$ sudo setfacl -m u:username:r-x /etc/wireguard/private-key
$ sudo setfacl -m u:username:r-x /etc/wireguard/public-key

Отримуємо/дивимося на пару ключів:

$ cat /etc/wireguard/public-key
$ cat /etc/wireguard/private-key

Mikrotik

Тут все простіше:

/interface wireguard
add listen-port=13231 mtu=1420 name=wireguard1
/interface wireguard peers
add allowed-address=0.0.0.0/0 endpoint-address=10.10.10.11 endpoint-port=13231 interface=wireguard1 persistent-keepalive=30s public-key="…public key from /etc/wireguard/public-key…"
/ip address
add address=10.3.2.1/30 interface=wireguard1

Linux NetworkManager

Файл /etc/NetworkManager/system-connections/wireguard1.nmconnection при цьому може виглядати якось так:

[connection]
id=wireguard1
uuid=6b31553d-8782-4952-98e2-739ef4a05a87
type=wireguard
autoconnect=false
interface-name=wireguard1
permissions=
timestamp=1696251106

[wireguard]
listen-port=13231
private-key=…private key from /etc/wireguard/private-key…

[wireguard-peer.…public key from Mikrotik…]
endpoint=10.10.10.10:13231
persistent-keepalive=30
allowed-ips=10.3.2.0/24;192.168.88.0/24;

[ipv4]
address1=10.3.2.2/30
dns-search=
method=manual

[ipv6]
addr-gen-mode=stable-privacy
dns-search=
method=ignore

[proxy]

Після чого активуємо інтерфейс:

$ sudo nmcli con up wireguard1

Все просто й доступно.

понеділок, 25 вересня 2023 р.

Як ввімкнути rc.local в Debian?

Якщо ви запускаєте дистрибутив Linux з використанням Systemd, то можете помітити, що при завантаженні системи інструкції з файлу /etc/rc.local не виконуються. Далі в статті йдеться про те як це виправити.

Якщо раптом при виконанні команди sudo systemctl status rc.local  побачите подібне повідомлення:
$ sudo systemctl status rc-local
○ rc-local.service - /etc/rc.local Compatibility
     Loaded: loaded (/lib/systemd/system/rc-local.service; static)
    Drop-In: /usr/lib/systemd/system/rc-local.service.d
             └─debian.conf
     Active: inactive (dead)
       Docs: man:systemd-rc-local-generator(8)
Або інше, відмінне від "Active: active", а sudo systemctl enable rc-local  видасть
$ sudo systemctl enable rc-local
The unit files have no installation config (WantedBy=, RequiredBy=, Also=,
Alias= settings in the [Install] section, and DefaultInstance= for template
units). This means they are not meant to be enabled using systemctl.
 
Possible reasons for having this kind of units are:
• A unit may be statically enabled by being symlinked from another unit's
  .wants/ or .requires/ directory.
• A unit's purpose may be to act as a helper for some other unit which has
  a requirement dependency on it.
• A unit may be started when needed via activation (socket, path, timer,
  D-Bus, udev, scripted systemctl call, ...).
• In case of template units, the unit is meant to be enabled with some
  instance name specified.
То можна виконати наступні інструкції, які мають виправити ситуацію:

$ echo "[Unit]
Description=/etc/rc.local Compatibility
ConditionPathExists=/etc/rc.local

[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes
SysVStartPriority=99

[Install]
WantedBy=multi-user.target" | sudo tee /etc/systemd/system/rc-local.service > /dev/null
$ printf '%s\n' '#!/bin/bash' 'exit 0' | sudo tee -a /etc/rc.local
#!/bin/bash
exit 0
$ sudo chmod +x /etc/rc.local
$ sudo systemctl enable rc-local
Created symlink /etc/systemd/system/multi-user.target.wants/rc-local.service → /etc/systemd/system/rc-local.service.
$ sudo systemctl start rc-local.service
І отримати результат:
$ sudo systemctl status rc-local.service
* rc-local.service - /etc/rc.local Compatibility
     Loaded: loaded (/etc/systemd/system/rc-local.service; enabled; preset: enabled)
    Drop-In: /usr/lib/systemd/system/rc-local.service.d
             `-debian.conf
     Active: active (exited) since Mon 2023-09-25 13:38:53 EEST; 15min ago
    Process: 34112 ExecStart=/etc/rc.local start (code=exited, status=0/SUCCESS)
        CPU: 1ms

Sep 25 13:38:53 oghome systemd[1]: Starting rc-local.service - /etc/rc.local Compatibility...
Sep 25 13:38:53 oghome systemd[1]: Started rc-local.service - /etc/rc.local Compatibility.
За мотивами статті How to Enable /etc/rc.local with Systemd.

вівторок, 22 серпня 2023 р.

ovpn-файл до статті "Налаштування OpenVPN-сервера на Mikrotik"

Вступ

Нещодавно в статті Налаштування OpenVPN-сервера на Mikrotik (метод 2) було наведено вміст ovpn-файла, для OpenVPN-клієнта Windows/Linux, в той самий час в статті Налаштування OpenVPN-сервера на Mikrotik було розглянуто лише налаштування OpenVPN-клієнта в RouterOS. Спробуємо виправити ситуацію.

Експорт сертифікатів

Нарешті ми налаштували OpenVPN-сервер на Mikrotik і тепер хочемо роздати нашим клієнтам ovpn-файл, щоб вони підключалися до сервера.

Експортуємо ca та клієнтський сертифікати. Тут все просто:
/certificate export-certificate ca file-name=ca-v1 type=pem 
/certificate export-certificate ovpn-muter file-name=ovpn-client-v1 type=pem export-passphrase="passphrase"
Створюємо ovpn-файл
client
dev tun
remote <ip address or dns name of the ovpn server> 1194 tcp
nobind
persist-key
persist-tun
remote-cert-tls server
data-ciphers AES-256-CBC
cipher AES-256-CBC
auth-user-pass
auth SHA1
redirect-gateway def1
verb 1
<ca>
-----BEGIN CERTIFICATE-----
вставляємо вміст з експортованого файла ca-v1.crt
-----END CERTIFICATE-----
</ca>
<cert>
-----BEGIN CERTIFICATE-----
вставляємо вміст з експортованого файла ovpn-client-v1.crt
-----END CERTIFICATE-----
</cert>
<key>
-----BEGIN ENCRYPTED PRIVATE KEY-----
вставляємо вміст з експортованого файла ovpn-client-v1.key
-----END ENCRYPTED PRIVATE KEY-----
</key>

середа, 31 травня 2023 р.

Як з консолі перевірити термін дії SSL-сертифікату на ресурсі (наприклад https)

$ echo "GET / " | openssl s_client -servername att.privatbank.ua -connect att.privatbank.ua:443 | openssl x509 -noout -dates
depth=2 C = US, O = Amazon, CN = Amazon Root CA 1
verify return:1
depth=1 C = US, O = Amazon, CN = Amazon RSA 2048 M01
verify return:1
depth=0 CN = oteroprod.lnt.cl
verify return:1
DONE
notBefore=May 30 00:00:00 2023 GMT
notAfter=Jun 28 23:59:59 2024 GMT
Ось ці строчки і показують з якого і по який час сертифікат буде дійсним:
notBefore=May 30 00:00:00 2023 GMT
notAfter=Jun 28 23:59:59 2024 GMT

середа, 17 липня 2019 р.

Як встановити Netbeans 11 на Debian (Ubuntu, Linux Mint)

Встановили Java, скажемо версії 11.0.3, та отримуємо Netbeans потрібної 11-ї версії:
wget https://www-us.apache.org/dist/incubator/netbeans/incubating-netbeans/incubating-11.0/incubating-netbeans-11.0-bin.zip
розпакуємо отриманий архів:
unzip incubating-netbeans-11.0-bin.zip
перемістимо розпакований каталог netbeans в opt:
sudo mv netbeans /opt
потрібний для запуску файл тепер знаходиться тут /opt/netbeans/bin/netbeans.
Таким чином шлях /opt/netbeans/bin можна додати до PATH, наприклад у .bashrc:
export PATH=${PATH}:~/bin:/opt/netbeans/bin
Все, можна запускати netbeans з консолі, або ж посилання у меню чи створити іконку на робочому столі.

Модулі, що не запустилися в мене у новій версії:
 org.netbeans.libs.nashorn - No module providing the capability com.oracle.js.parser.implementation could be found.
 org.netbeans.modules.javascript2.doc - The module org.netbeans.libs.nashorn would also need to be installed.
 org.netbeans.modules.javascript2.model - The module org.netbeans.libs.nashorn would also need to be installed.
 org.netbeans.modules.javascript2.model - The module org.netbeans.modules.javascript2.doc would also need to be installed.
 org.netbeans.modules.javascript2.editor - The module org.netbeans.libs.nashorn would also need to be installed.
 org.netbeans.modules.javascript2.editor - The module org.netbeans.modules.javascript2.model would also need to be installed.
 org.netbeans.modules.javascript2.editor - The module org.netbeans.modules.javascript2.doc would also need to be installed.
 org.netbeans.modules.javascript2.requirejs - The module org.netbeans.modules.javascript2.editor would also need to be installed.
 org.netbeans.modules.javascript2.requirejs - The module org.netbeans.modules.javascript2.model would also need to be installed.
 org.netbeans.modules.javascript2.nodejs - The module org.netbeans.modules.javascript2.editor would also need to be installed.
 org.netbeans.modules.javascript2.nodejs - The module org.netbeans.modules.javascript2.model would also need to be installed.
 org.netbeans.modules.javascript.nodejs - The module org.netbeans.modules.javascript2.nodejs would also need to be installed.
 org.netbeans.modules.html.angular - The module org.netbeans.modules.javascript2.editor would also need to be installed.
 org.netbeans.modules.html.angular - The module org.netbeans.modules.javascript2.model would also need to be installed.
 org.netbeans.modules.javascript2.prototypejs - The module org.netbeans.modules.javascript2.model would also need to be installed.
 org.netbeans.modules.javascript2.extjs - The module org.netbeans.modules.javascript2.editor would also need to be installed.
 org.netbeans.modules.javascript2.extjs - The module org.netbeans.modules.javascript2.model would also need to be installed.
 org.netbeans.modules.javascript2.knockout - The module org.netbeans.modules.javascript2.model would also need to be installed.
 org.netbeans.modules.html.knockout - The module org.netbeans.modules.javascript2.editor would also need to be installed.
 org.netbeans.modules.html.knockout - The module org.netbeans.modules.javascript2.knockout would also need to be installed.
 org.netbeans.modules.javascript2.jquery - The module org.netbeans.modules.javascript2.editor would also need to be installed.
 org.netbeans.modules.javascript2.jquery - The module org.netbeans.modules.javascript2.model would also need to be installed.
 org.netbeans.modules.javascript2.extdoc - The module org.netbeans.modules.javascript2.doc would also need to be installed.
 org.netbeans.modules.javascript2.jsdoc - The module org.netbeans.modules.javascript2.doc would also need to be installed.
 org.netbeans.modules.javascript2.sdoc - The module org.netbeans.modules.javascript2.doc would also need to be installed.
 org.netbeans.modules.javascript2.kit - The module org.netbeans.modules.javascript2.prototypejs would also need to be installed.
 org.netbeans.modules.javascript2.kit - The module org.netbeans.modules.javascript2.editor would also need to be installed.
 org.netbeans.modules.javascript2.kit - The module org.netbeans.modules.javascript2.nodejs would also need to be installed.
 org.netbeans.modules.javascript2.kit - The module org.netbeans.modules.javascript2.requirejs would also need to be installed.
 org.netbeans.modules.javascript2.kit - The module org.netbeans.modules.javascript2.knockout would also need to be installed.
 org.netbeans.modules.javascript2.kit - The module org.netbeans.modules.javascript2.jsdoc would also need to be installed.
 org.netbeans.modules.javascript2.kit - The module org.netbeans.modules.javascript2.extjs would also need to be installed.
 org.netbeans.modules.javascript2.kit - The module org.netbeans.modules.javascript2.jquery would also need to be installed.
 org.netbeans.modules.javascript2.kit - The module org.netbeans.modules.javascript2.extdoc would also need to be installed.
 org.netbeans.modules.javascript2.kit - The module org.netbeans.modules.javascript2.sdoc would also need to be installed.
 org.netbeans.modules.javascript2.source.query - The module org.netbeans.modules.javascript2.model would also need to be installed.
 org.netbeans.modules.web.client.kit - The module org.netbeans.modules.javascript.nodejs would also need to be installed.
 org.netbeans.modules.web.client.kit - The module org.netbeans.modules.javascript2.source.query would also need to be installed.
 org.netbeans.modules.web.kit - The module org.netbeans.modules.web.client.kit would also need to be installed.
 org.netbeans.modules.web.struts - The module org.netbeans.modules.web.kit would also need to be installed.
 org.netbeans.modules.spring.webmvc - The module org.netbeans.modules.web.kit would also need to be installed.
 org.netbeans.modules.websvc.kit - The module org.netbeans.modules.web.kit would also need to be installed.
 org.netbeans.modules.j2ee.kit - The module org.netbeans.modules.web.kit would also need to be installed.
 org.netbeans.modules.web.jsf.kit - The module org.netbeans.modules.web.kit would also need to be installed.
 org.netbeans.modules.web.primefaces - The module org.netbeans.modules.web.jsf.kit would also need to be installed.
 org.netbeans.modules.html.ojet - The module org.netbeans.modules.javascript2.editor would also need to be installed.
 org.netbeans.modules.html.ojet - The module org.netbeans.modules.html.knockout would also need to be installed.
 org.netbeans.modules.html.ojet - The module org.netbeans.modules.web.client.kit would also need to be installed.
 org.netbeans.modules.html.ojet - The module org.netbeans.modules.javascript2.model would also need to be installed.
 org.netbeans.modules.websvc.restkit - The module org.netbeans.modules.websvc.kit would also need to be installed.
але це певно вже зовсім інша історія…

четвер, 4 жовтня 2018 р.

git - відновлення пошкодженого локального репозиторію

Отримав нещодавно, після "раптового" зникнення електроенергії, помилку
error: object file .git/objects/52/29e2cbdd8cd8d8bef72431eba74fd70455e734 is empty
error: object file .git/objects/52/29e2cbdd8cd8d8bef72431eba74fd70455e734 is empty
fatal: loose object 5229e2cbdd8cd8d8bef72431eba74fd70455e734 (stored in .git/objects/52/29e2cbdd8cd8d8bef72431eba74fd70455e734) is corrupt
Постала задача відновити репозиторій.
Виявилося, що зробити це відносно просто:
mv -v .git .git_old &&            # remove old git
git init &&                       # initialise new repo
git remote add origin "${url}" && # link to old repo
git fetch &&                      # get old history
git reset origin/master --mixed   # force update to old history
Також до уваги пропонується наступний скрипт (чесно взятий звідси):
#!/bin/bash

# Author: Zoey Llewellyn "Zobean" Hewll
#
# Usage: fix-git [REMOTE-URL]
#   Must be run from the root directory of the repository.
#   If a remote is not supplied, it will be read from .git/config
# 
# For when you have a corrupted local repo, but a trusted remote.
# This script replaces all your history with that of the remote.
# If there is a .git, it is backed up as .git_old, removing the last backup.
# This does not affect your working tree.
#
# This does not currently work with submodules!
# This will abort if a suspected submodule is found.
# You will have to delete them first
# and re-clone them after (with `git submodule update --init`)
#
# Error codes:
# 1: If a url is not supplied, and one cannot be read from .git/config
# 4: If the url cannot be reached
# 5: If a git submodule is detected


if [[ "$(find -name .git -not -path ./.git | wc -l)" -gt 0 ]] ;
then
    echo "It looks like this repo uses submodules" >&2
    echo "You will need to remove them before this script can safely execute" >&2
    echo "Then use \`git submodule update --init\` to re-clone them" >&2
    exit 5
fi

if [[ $# -ge 1 ]] ;
then
    url="$1"
else
    if ! url="$(git config --local --get remote.origin.url)" ;
    then
        echo "Unable to find remote 'origin': missing in '.git/config'" >&2
        exit 1
    fi
fi
url_base="$(echo "${url}" | sed -E 's;^([^/]*://)?([^/]*)(/.*)?$;\2;')"
echo "Attempting to access ${url_base} before continuing"
if ! wget -p "${url_base}" -O /dev/null -q --dns-timeout=5 --connect-timeout=5 ;
then
    echo "Unable to reach ${url_base}: Aborting before any damage is done" >&2
    exit 4
fi

echo
echo "This operation will replace the local repo with the remote at:"
echo "${url}"
echo
echo "This will completely rewrite history,"
echo "but will leave your working tree intact"
echo -n "Are you sure? (y/N): "

read confirm
if ! [ -t 0 ] ; # i'm open in a pipe
then
    # print the piped input
    echo "${confirm}"
fi
if echo "${confirm}"|grep -Eq "[Yy]+[EeSs]*" ; # it looks like a yes
then
    if [[ -e .git ]] ;
    then
        # remove old backup
        rm -vrf .git_old | tail -n 1 &&
        # backup .git iff it exists
        mv -v .git .git_old
    fi &&
    git init &&
    git remote add origin "${url}" &&
    git config --local --get remote.origin.url | sed 's/^/Added remote origin at /' &&
    git fetch &&
    git reset origin/master --mixed
else
    echo "Aborting without doing anything"
fi

вівторок, 10 липня 2018 р.

Як визначити дистрибутив та версію Linux?

В принципі Linux це ядро, але знати версію ядра це не еквівалент того, що ми одразу можемо дізнатися щось про дистрибутив системи. А от у останньому допоможе пакет inxi.
Запускаємо:
inxi -S
і дізнаємося дещо значно більше ніж просто про версію ядра.
$ inxi -S
System:    Host: askue Kernel: 2.6.32-573.22.1.el6.x86_64 x86_64 bits: 64 Console: tty 2
           Distro: CentOS release 6.7 (Final)
або
$ inxi -S
System:    Host: olden Kernel: 4.9.0-7-amd64 x86_64 (64 bit) Desktop: Cinnamon 3.2.7
           Distro: Debian GNU/Linux 9 (stretch)
Але й це не все, про систему можна та "залізо" можна дізнатися більше якщо запустити inxi з параметром -F:

$ inxi -F
System:    Host: askue Kernel: 2.6.32-573.22.1.el6.x86_64 x86_64 bits: 64 Console: tty 2
           Distro: CentOS release 6.7 (Final)
Machine:   Device: server System: Supermicro product: X10DRH v: 123456789 serial: 123456789
           Mobo: Supermicro model: X10DRH-C v: 1.01 serial: NM15AS011867
           UEFI [Legacy]: American Megatrends v: 2.0 date: 12/17/2015
CPU(s):    2 6 core Intel Xeon E5-2620 v3s (-MT-MCP-SMP-) cache: 30720 KB
           clock speeds: max: 2399 MHz 1: 2399 MHz 2: 2399 MHz 3: 2399 MHz 4: 2399 MHz 5: 2399 MHz 6: 2399 MHz
           7: 2399 MHz 8: 2399 MHz 9: 2399 MHz 10: 2399 MHz 11: 2399 MHz 12: 2399 MHz 13: 2399 MHz 14: 2399 MHz
           15: 2399 MHz 16: 2399 MHz 17: 2399 MHz 18: 2399 MHz 19: 2399 MHz 20: 2399 MHz 21: 2399 MHz
           22: 2399 MHz 23: 2399 MHz 24: 2399 MHz
Graphics:  Card: ASPEED ASPEED Graphics Family
           Display Server: N/A driver: N/A tty size: 211x53 Advanced Data: N/A for root out of X
Network:   Card-1: Intel I350 Gigabit Network Connection driver: igb
           IF: eth0 state: up speed: 1000 Mbps duplex: full mac: 0c:c4:7a:6c:de:ce
           Card-2: Intel I350 Gigabit Network Connection driver: igb
           IF: eth1 state: up speed: 1000 Mbps duplex: full mac: 0c:c4:7a:6c:de:cf
Drives:    HDD Total Size: 1999.3GB (0.2% used)
           ID-1: /dev/sda model: SMC3108 size: 1999.3GB
Partition: ID-1: / size: 9.5G used: 1.5G (17%) fs: ext4 dev: /dev/dm-0
           ID-2: /boot size: 477M used: 57M (13%) fs: ext4 dev: /dev/sda1
           ID-3: swap-1 size: 1.07GB used: 0.00GB (0%) fs: swap dev: /dev/dm-1
RAID:      No RAID devices: /proc/mdstat, md_mod kernel module present
Sensors:   System Temperatures: cpu: No active sensors found. Have you configured your sensors yet? mobo: N/A
Info:      Processes: 478 Uptime: 314 days Memory: 573.9/15838.4MB Init: Upstart runlevel: 3
           Client: Shell (bash) inxi: 2.3.56 
$ inxi -F
System:    Host: olden Kernel: 4.9.0-7-amd64 x86_64 (64 bit) Desktop: Cinnamon 3.2.7
           Distro: Debian GNU/Linux 9 (stretch)
Machine:   Device: desktop Mobo: ASUSTeK model: P5Q SE PLUS v: Rev 1.xx BIOS: American Megatrends v: 2204 date: 08/28/2009
CPU:       Quad core Intel Core2 Quad Q8300 (-MCP-) cache: 2048 KB 
           clock speeds: max: 2499 MHz 1: 2003 MHz 2: 2003 MHz 3: 2003 MHz 4: 2003 MHz
Graphics:  Card: NVIDIA G73 [GeForce 7600 GS]
           Display Server: X.Org 1.19.2 driver: nvidia Resolution: 1920x1080@60.00hz, 1920x1080@60.00hz
           GLX Renderer: GeForce 7600 GS/PCIe/SSE2 GLX Version: 2.1.2 NVIDIA 304.137
Audio:     Card Intel 82801JI (ICH10 Family) HD Audio Controller driver: snd_hda_intel
           Sound: Advanced Linux Sound Architecture v: k4.9.0-7-amd64
Network:   Card: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller driver: r8169
           IF: eth0 state: up speed: 1000 Mbps duplex: full mac: 20:cf:30:19:46:f7
Drives:    HDD Total Size: 2320.5GB (35.7% used)
           ID-1: /dev/sdb model: WDC_WD20EFRX size: 2000.4GB
           ID-2: /dev/sda model: SAMSUNG_HD321KJ size: 320.1GB
Partition: ID-1: / size: 9.1G used: 3.1G (36%) fs: ext4 dev: /dev/sda1
           ID-2: /usr size: 14G used: 11G (79%) fs: ext4 dev: /dev/sda6
           ID-3: /home size: 184G used: 161G (93%) fs: ext4 dev: /dev/sda5
           ID-4: /var size: 74G used: 13G (18%) fs: ext4 dev: /dev/sda7
           ID-5: /tmp size: 11G used: 29M (1%) fs: ext4 dev: /dev/sda9
           ID-6: swap-1 size: 3.00GB used: 0.08GB (3%) fs: swap dev: /dev/sda8
Sensors:   System Temperatures: cpu: 35.5C mobo: 47.0C gpu: 71C
           Fan Speeds (in rpm): cpu: 2220 psu: 0 sys-1: 1117
Info:      Processes: 281 Uptime: 1:03 Memory: 3754.7/7987.1MB Client: Shell (bash) inxi: 2.3.5 
ну й не забуваймо про
man inxi
А ще можна уважно подивитися у бік:
$ cat /etc/*-release
$ cat /etc/issue

вівторок, 20 грудня 2016 р.

Як розбити flac по наявному cue у Linux?

Як виявилося тема ця не нова. Найпростіший шлях такий. Встановлюємо:
sudo aptitude install cuetools shntool flac
Далі, припустимо у нас є наступні файли:
$ ls -1 Океан\ Ельзи\ -\ Без\ меж.*
Океан Ельзи - Без меж.cue
Океан Ельзи - Без меж.flac
Тоді розбити оригінальний flac на окремі композиції можна так:
$ cuebreakpoints Океан\ Ельзи\ -\ Без\ меж.cue | \
  shnsplit -o flac Океан\ Ельзи\ -\ Без\ меж.flac
Після чого отримуємо наступний список файлів:
$ ls -1 split-track*
split-track01.flac
split-track02.flac
split-track03.flac
split-track04.flac
split-track05.flac
split-track06.flac
split-track07.flac
split-track08.flac
split-track09.flac
split-track10.flac
split-track11.flac
Окремий файл - окрема композиція.
Але є певна проблема, у отриманих файлах відсутня інформація про виконавця, альбом, тощо. Це не зовсім зручно, якщо збираємося додати ці файли у сучасні медіаплеєри, які вміють читати ці метадані.

Покроково.
Кількість композицій:
$ cueprint -d '%N' Океан\ Ельзи\ -\ Без\ меж.cue
11
Метадані по композиції №1:
$ cueprint -n 1 Океан\ Ельзи\ -\ Без\ меж.cue | iconv -f cp1251
Track 1 Information
arranger: 
composer: 
genre:  
ISRC:  
message: 
track number: 1
perfomer: Океан Ельзи
title:  Віддай мені (свою любов)
ISRC (CD-TEXT): 
або у заданому форматі:
$ cueprint -n 1 -t \
  'ARRANGER=%A\nCOMPOSER=%C\nGENRE=%G\nMESSAGE=%M\nTRACKNUMBER=%n\nARTIST=%p\nTITLE=%t\nALBUM=%T\n' \
  Океан\ Ельзи\ -\ Без\ меж.cue | \
  iconv -f cp1251
ARRANGER=
COMPOSER=
GENRE=
MESSAGE=
TRACKNUMBER=1
ARTIST=Океан Ельзи
TITLE=Віддай мені (свою любов)
ALBUM=Без меж

Всі ці моменти можна об'єднати у скрипт. Проект можна завантажити звідси splitflac.

UPDATE:
Був отримав помилку:
shnsplit: error: m:ss.ff format can only be used with CD-quality files
Таблетка:
cuebreakpoints *.cue | sed s/$/0/ | shnsplit -t %n -o flac *.flac

вівторок, 19 квітня 2016 р.

Сортування ip-адрес у консолі

Постало питання у виводі на консоль відсортувати ip-адреси (v4). Виявилося, що це робиться доволі просто, через стандартну команду sort:
$ nmap -sP 10.100.1.* 2>&1 >/dev/null
$ ip neigh show | \
  awk '$4~/^INCOMPLETE$/ { print $1 }' | \
  sort -t . -k 1,1n -k 2,2n -k 3,3n -k 4,4n

  • -t . : Set field to . (dot) as our IPs separated by dot symbol;
  • -n : Makes the program sort according to numerical value;
  • -k opts: Sort data / fields using the given column number. For example, the option -k 2 made the program sort using the second column of data. The option -k 3,3n -k 4,4n sorts each column. First it will sort 3rd column and then 4th column.

середа, 16 березня 2016 р.

Debian: встановлення Adobe Reader

Завантажуємо Adobe Reader 9.5.5 enu (AdbeRdr9.5.5) і встановлюємо acroread.
wget http://ardownload.adobe.com/pub/adobe/reader/unix/9.x/9.5.5/enu/AdbeRdr9.5.5-1_i386linux_enu.deb
sudo aptitude install gdebi
sudo gdebi AdbeRdr9.5.5-1_i386linux_enu.deb
acroread
Варто зауважити, що Adobe припинила випуски та підтримку acroread-ера для Linux.

понеділок, 14 березня 2016 р.

Gnome3 - початковий автоматичний запуск додатків

При спробі знайти засіб для налаштування автоматичного запуску додатків при вході у gnome3 google наполегливо відсилає нас на сторінки де рекомендується застосувати
gnome-session-properties
але треба зауважити, що цей додаток є застарілим. Замість нього можна використати
gnome-tweak-tool
де можна перейти у пункт "Початкові програми". Але, завжди є але. А якщо хочеться додати те чого немає у наданому меню? Тоді все також доволі просто - консоль! Переходимо у
cd .config/autostart/
і створюємо desktop-файл з описом додатка. Наприклад - xkb-lang.desktop:
[Desktop Entry]
Exec=/home/olden/bin/xkb-lang.sh
Hidden=true
Name=XKB-Lang
Icon=xterm
Terminal=false
Type=Application
X-GNOME-Autostart-enabled=true
Якщо після цього зайти у gnome-tweak-tool то можна побачити, що цей додаток буде відтворюватись у меню "Початкових програм" і, відповідно, буде запускатися при вході у gnome3.

середа, 9 березня 2016 р.

Debian Upgrade та повне відновлення KDE або Gnome

Нарешті оновився з wheezy на jessie, але при цьому повністю за залежностями зламався kde. Постало питання, а як же оновити kde та/або gnome якщо вони "зламалися"?
Відповідь, як завжди, лежить у Debian Wiki.
sudo aptitude install ~t^desktop$ ~t^kde-desktop$
sudo tasksel -t install gnome-desktop
sudo aptitude -q --without-recommends \
    -o APT::Install-Recommends=no -y \
    install ~t^desktop$ ~t^gnome-desktop$
Для KDE можна спробувати щось на кшталт такого як і для Gnome:
sudo tasksel -t install kde-desktop
sudo aptitude -q --without-recommends \
    -o APT::Install-Recommends=no -y \
    install ~t^desktop$ ~t^kde-desktop$