Толик Панков
hex_laden
............ .................. ................
Page Summary

December 2025
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

Back Viewing 0 - 20  
Killswitch для Openvpn в Linux. Как сделать так, чтобы трафик не пошел в обход VPN

Преамбула


Итак, что такое killswitch. В случае использования VPN, это механизм, при котором, в случае "падения" VPN вы не спалитесь. Без killswitch обычно бывает так: сидите вы, работаете через VPN и считаете себя защищенным, хотя бы от подглядывания за вами провайдера (и сидящего за СОРМ'ом тов. майора), и тут фигак, VPN падает, ОС предоставляет вам доступ по умолчанию, и мессенджеры, открытые вкладки браузера, и вообще все-все-все выходят в Интернет через ваш обычный провайдерский IP.

Значит, надо сделать так, чтобы трафик, в случае отключения VPN никуда не ушел. Это и есть killswitch.

Первый опыт. Самый простой killswitch.


Изначально все было сделано очень просто. Дома стоял отдельный линуксовый "сервер", который предоставлял остальным устройствам доступ к Интернету, к домашним файл-помойкам (FTP и Samba) и PXE, на случай чего-нибудь переустановить. Внешний VPN, т.е. тот, который крутится на "сервере" - просто OpenVPN-клиент, который коннектится к VPN-провайдеру. И первый killswitch был очень простой: надо отрубить доступ всем клиентам из локальной сети.

Openvpn может при соединении или разъединении с VPN выполнять пользовательские скрипты, и в этих скриптах прописывалась команда iptables -P FORWARD DROP, если соединение падало, или iptables -P FORWARD ACCEPT, когда соединение устанавливалось.

Но такой подход несколько кривоват, подходит это хорошо только для FORWARD-трафика, а для локальной машины на Linux, т.е ноута, который постоянно таскаю на работу, фигово - сделать DROP по INPUT и OUTPUT-цепочкам, или вообще удалить дефолтный маршрут, так до поднятия VPN придется все это сначала "вернуть в зад" (не забыв перед этим закрыть браузер и мессенджеры).

Подробнее про первый способ можно прочесть тут (копия)

Простой Killswitch для локальной машины


1. Надо проверить конфигурацию ядра (см. Посмотреть опции компиляции ядра/узнать конфигурацию ядра Linux (копия), точнее, нас интересует опция CONFIG_NETFILTER_XT_MATCH_OWNER. Если она установлена в Yes (CONFIG_NETFILTER_XT_MATCH_OWNER=y), тогда можно переходить к следующему шагу, если она установлена в CONFIG_NETFILTER_XT_MATCH_OWNER=m, т.е. собрана в виде модуля (как у меня) - смело добавляем в автозагрузку команду (и перезагружаемся):

modprobe xt_owner

В некоторых ОС modprobe owner_xt, посмотрите сами, если modprobe с одним модулем не выдаст ошибку, значит модуль тот, который надо. Если выдаст - попробуйте другой вариант.
Если ядро скомпилировано с опцией CONFIG_NETFILTER_XT_MATCH_OWNER=n, тогда печально - придется пересобирать ядро.

2. Понадобится отдельная группа для запуска OpenVPN и других программ в обход VPN. Все остальное, естественно, должно резаться, если OpenVPN не запущен.
Создаем группу:

groupadd -r killswitch

или

groupadd --system killswitch

Естественно, имя группы killswitch можно заменить на свое. Нужна обязательно системная группа, иначе работать не будет. Про группы Linux можно почитать в источниках [2].

3. Выполняем команды IPTABLES:

iptables -A OUTPUT -m owner --gid-owner killswitch -j ACCEPT
iptables -A OUTPUT -o tun0 -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A OUTPUT -j REJECT --reject-with icmp-admin-prohibited


Вместо tun0 вписываем имя устройства, которое будет создано OpenVPN Параметр можно узнать из конфига для соединения (dev <имя устройства>, например dev tun0). В конфиге можно его и поменять.

Что вообще делают эти команды:

1. Пакеты, отправленные процессами с GID killswitch, пропускаются в сеть.
2. Пакеты на интерфейсе tun0 пропускаются безусловно. Это тот самый сетевой интерфейс, который реализован поверх VPN-подключения. Если у вас этот сетевой интерфейс называется по-другому (опция dev в конфиге OpenVPN позволяет дать ему фиксированное имя вместо tunN), поменяйте его в правилах iptables выше.
3. Пакеты на интерфейсе lo точно так же пропускаются. lo — это loopback-интерфейс, на котором располагается известный 127.0.0.1 (localhost). Поскольку некоторые приложения используют localhost для коммуникации между процессами, его блокировать нежелательно.
4. Все остальные пакеты блокируются. Блокировка при этом происходит с отправкой ICMP-пакета «administratively prohibited» (код ошибки не играет существенной роли). Это лучше, чем просто дропать пакеты, так как в таком случае программы будут сразу получать ошибку, а не висеть до таймаута.
[1]

В источнике есть еще и дополнительные плюшки, как сделать это через CGROUPS

4. Осталось запустить OpenVPN от нужной группы:

sg openvpn --config /path/to/config/config.ovpn

sg, это команда наподобие sudo, только она позволяет запускать программы в нужной группе [4]

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


Вышеприведенный способ режет совсем всё, т.е. доступ в локальную сеть тоже будет закрыт. А мне доступ в локальную сеть нужен, т.к. в ЛВС на работе присутствуют сервера, к которым нужен доступ. Я попытался добавить команды IPTABLES (да, о том, что порядок команд важен, я знаю) для доступа в локальную сеть, закрыв, при этом, доступ к локальному DNS-серверу и шлюзу (он же роутер с IP-адресом 192.168.0.1)

iptables -A OUTPUT -m owner --gid-owner killswitch -j ACCEPT
iptables -A OUTPUT -o tun0 -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A OUTPUT -s 192.168.0.1 -j DROP
iptables -A OUTPUT -d 192.168.0.1 -j DROP
iptables -A INPUT -s 192.168.0.1 -j DROP
iptables -A INPUT -d 192.168.0.1 -j DROP
iptables -A OUTPUT -s 192.168.0.0/24 -j ACCEPT
iptables -A OUTPUT -d 192.168.0.0/24 -j ACCEPT
iptables -A OUTPUT -j REJECT --reject-with icmp-admin-prohibited


-s - входящий трафик
-d - исходящий

Но почему-то пакеты один хрен, уходили в сеть. Поясните, кто больше меня шарит в IPTABLES, где я накосячил.

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

Да, если еще один появится, придется отдельно разрешать доступ, что неудобно. Кто знает, как решить - подскажите.

Так что окончательная конфигурация такая:

iptables -A OUTPUT -m owner --gid-owner killswitch -j ACCEPT
iptables -A OUTPUT -o tun0 -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A OUTPUT -s 192.168.0.66 -j ACCEPT
iptables -A OUTPUT -d 192.168.0.66 -j ACCEPT
iptables -A OUTPUT -s 192.168.0.68 -j ACCEPT
iptables -A OUTPUT -d 192.168.0.68 -j ACCEPT
iptables -A OUTPUT -j REJECT --reject-with icmp-admin-prohibited


Источники


1. Kill switch для OpenVPN на основе iptables (копия в PDF)
2. Как создать группы в Linux (команда groupadd)
3. Как заблокировать ip в iptables
4. sg

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2020/11/22/killswitch-dlya-openvpn-v-linux-kak-sdelat-tak-chtoby-trafik-ne-poshel-v-obhod-vpn/

Tags: ,
Посмотреть опции компиляции ядра/узнать конфигурацию ядра Linux

Иногда бывает необходимо узнать, с какими опциями собрано ядро Linux, например, чтобы узнать какие устройства, файловые системы, протоколы, и (блин) даже опции файервола (NETFILTER/IPTABLES) оно поддерживает.

Файл со списком опций


Если ядро собрано с опцией CONFIG_IKCONFIG_PROC=y, то в /proc присутствует файл config.gz.
Если файла нет, возможно, ядро собрано с опцией CONFIG_IKCONFIG_PROC=m, т.е. конфигурация ядра доступна в виде модуля.
Тогда пробуем выполнить команду

modprobe configs

Файл /proc/config.gz должен появиться.

Да, несколько анекдотичная ситуация. Чтобы узнать конфигурацию ядра, ядро должно быть собрано с опцией отображения конфигурации :)

Если не помогло, можно поискать файл в /boot (некоторые разработчики кладут его туда) или поискать в исходниках ядра. У меня они были установлены с диска дистрибутива, и копия конфига оказалась в /usr/src/linux/.config

Просмотр списка опций


1. Через просмотровщик mc. Идем в /proc/, становимся на файл config.gz и просматриваем его (по нажатию F3).

2. С командной строки:

zcat /proc/config.gz

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2020/11/20/posmotret-optsii-kompilyatsii-yadra-uznat-konfiguratsiyu-yadra-linux/

Tags: ,
Создание виртуальных пользователей Dovecot и скрипты для этого.

Преамбула


Продолжаю свои эксперименты с локальным почтовым сервером, соответственно, понадобилось создать на ём виртуальных пользователей. Пока не стал мудрить со всякими MySQL и прочими сложностями, ограничился простым passwd-file - т.е. текстовым файлом, содержащим список пользователей и соленых хэшей, наподобие стандартного файла Linux /etc/shadow.

Однако, работа с этим файлом в Dovecot как-то не очень продумана, в разных руководствах и статьях предлагается примерно такой способ:

#задаем имя пользователя
#задаем пароль
#...

echo $USERNAME:$(doveadm pw -s ssha512 -p $PASSWORD):::::: >> /etc/dovecot/users

Где $USERNAME и $PASSWORD - ранее заданные переменные скрипта, в которых находятся, соответственно, имя пользователя и пароль.

Таким скриптом легко загадить парольный файл, т.к. никаких проверок на одинаковость имен, РеГИсТР букв в ИмеНАХ пользователей нет. Решил немного улУчшить и углУбить.

+ Все имена пользователей приводятся к нижнему регистру
+ Перед добавлением пользователя проводится проверка, на наличие его в файле пользователей.
- Не стал автоматически прикручивать к имени пользователя домен (@example.org), впрочем, кому надо, там просто допилить, а мне, пока экспериментирую, особо не надо, т.к. домены меняются %).

Добавление пользователей


Делается скриптом dcadduser.

Можно запускать с параметрами:

dcadduser <user> <password>, например,
dcadduser paulzovatel@example.org passw0rd666

Если запустить без параметров, скрипт предложит ввести имя пользователя и пароль. Если пользователь существует - то скрипт сообщит об этом и завершит работу.

dcadduser на GitHub

Удаление пользователя


Для удаления создал скрипт dcdeluser.
Использование:

dcdeluser <username>

где <username> - имя пользователя в файле passwd-file.

dcdeluser paulzovatel@example.org

Перед удалением будет выдан запрос:

Delete user paulzovatel@example.org? [Y/N]:

Если пользователь не существует, скрипт сообщит об этом и завершит работу.

dcdeluser на GitHub

Изменение пароля пользователя


Для изменения пароля предназначен скрипт dcpasswd.

Использование:

dcpasswd <username> [new_password]

где:

<username> - имя пользователя в файле passwd-file.
[new_password] - новый пароль

Если пользователь не существует, скрипт сообщит об этом и завершит работу.
Если второй параметр (новый пароль) будет опущен, то скрипт предложит ввести новый пароль в интерактивном режиме.

dcpasswd на GitHub

Список пользователей


Скрипт dclistuser выводит список пользователей из passwd-file Dovecot. Запускается без параметров.

Пример вывода:

./dclistuser
bigboss@test1.local
alice@test1.local
bob@test1.local
likovar@test1.local


dclistuser на GitHub

Репозиторий со скриптами

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2020/11/19/sozdanie-virtualnyh-polzovatelej-dovecot-i-skripty-dlya-etogo/

Linux. Получение случайной строки из английских строчных, заглавных букв и цифр.

Например, для создания имени для временного файла.

cat "/dev/urandom"|tr -dc 'a-zA-Z0-9'|head -c 10

1. Читаем cat'ом случайную информацию из /dev/urandom (из /dev/random получится очень медленно), далее передаем ее tr.
2. Опция -d команды tr, означает, что символы нужно удалить, а опция показывает, что символы должны быть кроме присутствующих в наборе. Вторым параметром передается набор ('a-zA-Z0-9'), т.е. будут удалены все символы, не соответствующие набору. Т.е. останутся только латинские строчные, латинские заглавные и цифры.
3. Команда head вырезает из переданных ей данных нужное количество символов. Опция -c указывает команде, что нужно вырезать нужное количество байт (иначе, команда работает со строками). Латинские символы, что в UTF-8, что в однобайтовых кодировках, занимают по 1 байту.

#!/bin/bash

LENSTR="10"

RANDSTR=`cat "/dev/urandom"|tr -dc 'a-zA-Z0-9'|head -c "$LENSTR"`
echo "Random string (length=$LENSTR): $RANDSTR"


Пример вывода:

./randstr
Random string (length=10): e6OFDphzTh
./randstr
Random string (length=10): vF6jJEhOMi
./randstr
Random string (length=10): H0edJFIYte


Скрипт на GitHub

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2020/11/18/linux-poluchenie-sluchajnoj-stroki-iz-anglijskih-strochnyh-zaglavnyh-bukv-i-tsifr/

Tags: ,
Удаление кривого "активатора" для Windows 7 Odin возвращается

Преамбула


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

Kill Odin v 0.01


+ Удаляет драйвер SLIC, восстанавливает Реестр и загрузку.
+ Достаточно скачать единственный файл (и запустить его).
+ Проверка на наличие драйвера Odin
+ Перед вносимыми изменениями в систему будет создана точка восстановления.

Исходники


Репозиторий на GitHub

Скачать


OdinKill.exe

Скриншоты


Скриншоты )

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2020/11/14/udalenie-krivogo-aktivatora-dlya-windows-7-odin-vozvrashhaetsya/

NSIS: Сохранение лога установки в текстовый файл.

На самом деле, не совсем сохранение лога, если быть точным - сохранение текста из окна Details установщика.

1. Необходимо подключить dumplog.nsi (код взят из NSIS Wiki)
2. Вызов функции DumpLog:

StrCpy $0 "$TEMP\test.log" ;Записываем имя файла лога в переменную
Push $0 ;помещаем значение переменной в стек
Call DumpLog ;вызов функции


Примечание: Функция работать не будет, если инсталлятор запущен в тихом режиме.

С русским языком проблем тоже не возникает. Файл сохраняется в формате ANSI.

Источник


NSIS Wiki

Тестовый установщик


Код на GitHub
dumplog.nsi

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2020/11/13/nsis-sohranenie-loga-ustanovki-v-tekstovyj-fajl/

Tags: ,
NSIS. Проверка существования ключа Реестра.

Иногда бывает надо проверить, существует тот или иной ключ Реестра Windows

Решение


Для этого можно воспользоваться стандартной функцией EnumRegKey:

EnumRegKey <var> <root_key> <subkey> <index>

где:
<var> - переменная для названия ключа Реестра, которое будет возвращено функцией.
<root_key> - корневой ключ Реестра (HKCR|HKCU|HKLM|HKU|HKCC)
<subkey> - путь в Реестре, например Software\Microsoft\Windows
<index> - индекс следующего ключа.

Функция перебирает все подключи в указанной ветке Реестра. Пример для перечисления можно посмотреть здесь

Если ключ не существует, то функция EnumRegKey сгенерирует ошибку, которую можно отследить:

!include Logiclib.nsh ;подключаем библиотеку с нормальными логическими конструкциями.
;...
ClearErrors ;очищаем флаг ошибки
EnumRegKey $0 HKCU "Software\Microsoft\" 0
${If} ${Errors} ;ключ не существует
	DetailPrint "HKEY_CURRENT_USER\Software\Microsoft not EXIST!"
${Else} ;ключ существует
	DetailPrint "HKEY_CURRENT_USER\Software\Microsoft EXIST!"
${EndIf}
;...


Пример целиком на GitHub

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2020/11/12/nsis-proverka-sushhestvovaniya-klyucha-reestra/

Tags: ,
NSIS: Создание точки восстановления системы.

Преамбула


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

Плагин SysRestore


Для создания точек восстановления в NSIS применяется плагин SysRestore, который можно скачать с официальной NSIS wiki (копия).

Установка тривиальна - надо распаковать архив в каталог NSIS, например в "C:\Program Files (x86)\NSIS\"

После подключения плагина становятся доступны 4 функции:

SysRestore::StartInstallPoint "<название>" - функция создает точку восстановления с типом "Установка", применяется для создания точки восстановления при установке программы.



SysRestore::StartUninstallPoint "<название>" - функция создает точку восстановления с типом "Удаление", применяется для создания точки восстановления при удалении программы.

В стек эти функции (как и другие функции данного модуля) помещают код возврата, который можно извлечь из стека командой

Pop <переменная>

И далее проанализировать:

0 - Функция завершена успешно, точка восстановления создана.
1 - Уже запущено создание точки восстановления, предыдущую точку восстановления надо закрыть или отменить (см. ниже).
10 - Windows запущена в "Безопасном режиме"
13 - The sequence number is invalid (сам автор плагина не знает, что это за ошибка).
80 - Ошибка с таким кодом встречается в Windows ME.
112 - Восстановление системы находится в режиме ожидания, поскольку закончилось место на жестком диске под точки восстановления.
1058 - Восстановление системы отключено.
1359 - Внутренняя ошибка при создании точки восстановления.
1460 - Время ожидания вызова истекло из-за ожидания мьютекса для установки точек восстановления (вот это уже я не знаю, что такое).

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

Я не знаю, являются ли эти коды актуальными кодами ошибок, я просто проанализировал соответствующие include-файлы в SDK. Я тестировал код 1058 - восстановление системы отключено, и провел тест в безопасном режиме - код ошибки 10, я предполагаю, что эти коды верны.

Так что возможно ограничиться анализом кодов 0 (ОК), 1 (см. ниже), 10 (безопасный режим) и 1058 (восстановление системы отключено). Если функция выдаст что-то кроме этих четырех понятных кодов, остальное можно (в первом приближении) отправить в великий класс Неизвестная Ошибка (Unknown Error). Хотя, если вы знаете больше, чем автор плагина, а тем более, чем я - добро пожаловать в комментарии.

Кроме вышеперечисленных инициализирующих функций, существует "закрывающая" и "отменяющая" функции. "Закрывающая":

SysRestore::FinishRestorePoint

Ее необходимо вызывать, после того, как все изменения в системе произведены, чтобы закрыть точку восстановления, и чтобы система получила нужные данные о том, что было изменено в системных/программных файлах и Реестре. Попытка создать новую точку восстановления без закрытия предыдущей, в одном и том же инсталляторе, приводит к тому что функции StartInstallPoint/StartUninstallPoint выдадут ошибку 1.

Как я понимаю, система все равно закроет restore point после завершения работы установщика, но лучше эту функцию использовать.

"Отменяющая" функция, это:

SysRestore::RemoveRestorePoint

Она позволяет удалить незакрытую точку восстановления из системы. Может понадобиться в случае, если пользователь отменил установку в процессе, и установщик откатил процесс установки.

Коды возврата последних двух функций:

0 - OK
2 - Не произведен запуск точки восстановления (т.е. предварительно не вызваны функции StartInstallPoint или StartUninstallPoint)

Пример кода

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

Section "Create Restore Point Example"
	;Настраиваем секцию
	;Создаем точку восстановления
	DetailPrint "Create restore point..."
	SysRestore::StartRestorePoint "Test Restore Point"
	Pop $0 ;достаем из стека код восстановления в переменную $0
	${If} $0 = 0 ;анализируем его
		DetailPrint "OK"
	${ElseIf} $0 = 1
		DetailPrint "Start point already set (start function only)."
	${ElseIf} $0 = 10
		DetailPrint "The system is running in safe mode. "
	${ElseIf} $0 = 13
		DetailPrint "The sequence number is invalid."
	${ElseIf} $0 = 80
		DetailPrint "Windows Me code."
	${ElseIf} $0 = 112
		DetailPrint "System Restore is in standby mode because disk space is low."
	${ElseIf} $0 = 1058
		DetailPrint "System Restore is disabled."
	${ElseIf} $0 = 1359
		DetailPrint "An internal error with system restore occurred."
	${ElseIf} $0 = 1460
		DetailPrint "The call timed out due to a wait on a mutex for setting restore points."
	${Else}
		DetailPrint "Unknow error."
	${EndIf}
	
	;производим установку программы, копируем файлы, пишем в Реестр
	;...
SectionEnd

;в завершающей секции

Section -FinishSection
;...
; Генерируем uninstaller, пишем соотв. ключи в Реестр
;...	
	;Закрываем точку восстановления
	SysRestore::FinishRestorePoint
	DetailPrint "Finish restore point..."
	${If} $0 = 0
		DetailPrint "OK"
	${ElseIf} $0 = 2
		DetailPrint "No Start point set (finish function only)."
	${Else}
		DetailPrint "Unknow error."
	${EndIf}

SectionEnd


Готовый пример


Тестовый установщик создает точку восстановления, далее устанавливает во временный каталог системы программу, которая при запуске показывает приветственное окно и завершает работу, прописывает ее в автозагрузку Реестра, и генерирует uninstaller во временном каталоге.

Код на GitHub
Скомпилированный инсталлятор

Скачать плагин


1. NSIS Wiki
2. Копия (на 07.11.2020)

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2020/11/08/nsis-sozdanie-tochki-vosstanovleniya-sistemy/

Tags: ,
NSIS warning 7998: ANSI targets are deprecated, как исправить.

Преамбула


Обновил NSIS с v 3.04 до 3.06.1, в логе компилятора стал вылезать warning:

Processed 1 file, writing output (x86-ansi):
warning 7998: ANSI targets are deprecated
...
warning:
  7998: ANSI targets are deprecated


Т.е. ANSI ему устарело. Warning не error, но все равно неприятно. Впрочем, исправить не составило особого труда.

Исправление


Для исправления этого дела, в начало скрипта надо добавить команду:

Unicode true

Только команду надо добавлять в самое начало скрипта, во всяком случае до секций и до определения параметра InstallDir. Если добавить после InstallDir:

;...
Name "${APPNAMEANDVERSION}"
InstallDir "$TEMP"
Unicode true

OutFile "TempUnicode.exe"
;...


То это вызовет ошибку:

Error: Can't change target charset after data already got compressed or header already changed!

Невозможно изменить целевую кодировку после того, как данные уже сжаты или заголовок изменен!

А лучше добавлять Unicode true вообще в самое начало скрипта, первой строчкой, даже до !include, как пишут на форуме NSIS, т.к. от чего компилятор так реагирует на смену кодировки, в документации не описано.

Примечание: с русским языком в инсталляторе проблем при смене кодировки не случилось, хотя редактор передает компилятору скрипт на STDIN, а редактор сохраняет файл скрипта в ANSI (кодировка Win 1251). Во всяком случае, проблем не случилось при использовании Venis IX.



Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2020/11/07/nsis-warning-7998-ansi-targets-are-deprecated-kak-ispravit/

Tags: ,
NSIS: Отслеживание кода возврата исполняемого приложения.

Преамбула


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

При вызове внешней программы надо отследить ее работу, завершена ли она корректно, или же в процессе выполнения произошла ошибка. Могу привести довольно древний пример из своего опыта, когда-то программы распространялись на CD, и производитель материнской платы давал диск с "бонусным" софтом. Но в инсталлятор была встроена программа, определявшая модель материнской платы - если модель не совпадала, установщик "халявных" программ отказывался что-либо устанавливать. Когда я распаковал установщик и проанализировал это дело, выяснилось, что установщик сначала распаковывал и запускал внешнюю утилиту, которая проверяла модель мать-доски. И возвращала код выхода: 0 - правильная мать-доска, 1 - неправильная.


Вызов внешнего приложения и получение его кода возврата из NSIS-установщика


Вызов внешнего приложения выполняется командой

ExecWait "путь_и_имя_файла параметры_программы" [переменная_для_кода_возврата]

Например:

ExecWait "$TEMP\retcode.exe 42"

Второй параметр - переменная для сохранения кода возврата вызванной программы, т.е. если мы хотим вызывать программу и анализировать ее код завершения, надо действовать так:

;...
ExecWait "$TEMP\retcode.exe 42" $0


Далее анализируем содержимое переменной $0.

Пример


Пример инсталлятора на GitHub

Источник


Reference/ExecWait

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2020/11/05/nsis-otslezhivanie-koda-vozvrata-ispolnyaemogo-prilozheniya/

Tags: ,
Код возврата в консольном приложении C#

Преамбула


Известно, что все приложения в Windows, после завершения передают ОС код возврата, который можно потом получить, например в BAT-файле в переменной %ERRORLEVEL% и проанализировать. Например, чтобы понять, успешно ли завершена работа программы, или же в процессе работы произошла ошибка.

А как вернуть нужный код возврата, если создаешь приложение в C#? Пока остановлюсь только на консольном приложении.

Код возврата в консольном приложении


Для возврата кода в консольном приложении достаточно изменить заголовок функции Main с
static void Main(string[] args)
на
static int Main(string[] args),
т.е. заставить главную функцию возвращать значение int (от -2147483648 до 2147483647).

Естественно, там, где функция завершается, необходимо добавить оператор
return <код_возврата>;

Пример


Программа выводит заданный в командной строке код завершения.

Исходник
EXE с тестовым BAT-файлом

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2020/11/05/kod-vozvrata-v-konsolnom-prilozhenii-c/

Tags: ,
Файл фрагмента (SHS), что это, чем и как открывать.

Файл SHS - это файл Windows Shell Scrap Object, т.е. файл обмена, позволяющий обмениваться данными между программами, или временно сохранять содержимое буфера обмена на диск. Служба Windows Shell Scrap Object была удалена из Windows версий, начиная с Vista, так что открыть его в другой ОС, кроме Windows XP не получится.

Поскольку SHS - файл обмена, т.е. фактически файл-контейнер, то внутренний формат файла может быть любым, однако, некоторые способы открыть его есть.

scrap2rtf


Если в файле SHS сохранен формат текста Word или TXT, то можно применить утилиту scrap2rtf. Есть версии под Windows и Linux, как с графическим интерфейсом, так и для командной строки.

Скачать из архива Google.Code

Копии:

- Версии для Windows
- Версии для Linux

Восстановление работы Windows Shell Scrap Object в Windows 7


Если первый способ не помог, можно попробовать установить службу Windows Shell Scrap Object в Windows 7 из Windows XP. AfiX написал для этого утилиту.

SHSSupportW7.exe
Исходники

Простой, но долгий способ


1. Установить Windows XP на виртуальную машину.
2. Перенести на виртуальную машину файл SHS.
3. Установить нужный (или предполагаемый) софт, данные которого были в файле фрагмента.
4. Открыть фрагмент двойным кликом мыши.
...
ФАНФАРЫ!

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2020/11/05/fajl-fragmenta-shs-chto-eto-chem-i-kak-otkryvat/

Преобразование REG-файла в код скрипта инсталлятора NSIS

Понадобилось тут добавить ключи из REG-файла в код своего инсталлятора на NSIS. Оказывается, все придумано до нас. Имеется утилита Reg2Nsis, которая этим и занимается.

Использование


reg2nsis REG-файл [ПАРАМЕТРЫ]
или
reg2nsis ключ_реестра [ПАРАМЕТРЫ]

Т.е. утилита может преобразовать в код NSIS, как содержимое REG-файла, так и данные непосредственно из реестра.

Параметры:
-r - обработать ключ реестра со всеми подключами, начиная с указанного. Срабатывает только если в качестве источника указан путь в реестре.
-o <файл> - код будет сохранен в указанный файл
Если вместо -o <файл> указать ключ -O, то код будет сохранен в файл с именем, аналогичным указанному REG-файлу, но с расширением .nsh

Без дополнительных параметров, код NSIS будет выведен на консоль (stdout)

Программа смотрит в настройки системы и автоматически преобразует стандартные системные пути в стандартные переменные NSIS. Например, встретившийся путь C:\Windows\ будет преобразован в $WINDIR\.

Это можно отключить, добавив в командной строке ключ -s.

При анализе REG-файла, программа распознает как добавление ключа/значения, что понятно, так и команду на его удаление.
Т.е. запись в REG-файле:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\oem-drv64]

будет преобразована в:

WriteRegStr HKEY_LOCAL_MACHINE "SYSTEM\CurrentControlSet\services\oem-drv64" "" ""
А запись:

[-HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\oem-drv64]

преобразуется в следующий код:

DeleteRegKey HKEY_LOCAL_MACHINE "SYSTEM\CurrentControlSet\services\oem-drv64"

Скачать


С официальной NSIS-wiki
Копия на mega.nz

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2020/11/04/preobrazovanie-reg-fajla-v-kod-skripta-installyatora-nsis/

Tags: , ,
Консольный клиент для бесплатного VPN vpngate.net



Когда-то давно на сайте писали о бесплатном японском VPN vpngate.net, к сожалению, официальный клиент был только под винды, но народ наскриптил и под Android/iOS и графический клиент под Gnome

А вот консольного не было, пришлось делать самому.

Зависимости


- wget
- openvpn
- dialog

Возможности


- Получение списка серверов
- Сортировка списка серверов
- Добавление дополнительных опций в конфиг VPN
- Установка соединения с сервером

Переменные скрипта.


Настройка скрипта осуществляется путем редактирования переменных скрипта.

Основные настройки.


LISTADDR="http://www.vpngate.net/api/iphone/" - адрес списка серверов
LISTFILE="servers" - файл со списком серверов на локальной машине
DATADIR="./data" - рабочий каталог
DIALOG="dialog" - команда, вызывающая утилиту dialog.
OPENVPN="openvpn"- команда, вызывающая утилиту openvpn.

Настройки авторизации.


VPN_LOGIN="vpn" - логин.
VPN_PASS="vpn" - пароль
AUTH_FILE="vpngate.auth" - файл авторизации
AUTH_DIR="$DATADIR" - директория с файлом авторизации.

Настройки log'а


LOG_FILE="" - путь к файлу log'а
LOG_TTYN="3" - отправлять log на терминал, номер которого указан в переменной
RMLOG=0 - удалять log по выходу из программы (0 - не удалять, 1 - удалять)
LOG_APPEND=0 - дописывать log (0 - не дописывать 1 - дописывать)

Использование


1. Установите пакет (Slackware) или скачайте основной скрипт, скрипт настройки маршрутизации и опции VPN
2. В случае необходимости измените значения переменных скрипта
3. Измените скрипт маршрутизации в соответствии с вашими настройками
3. Запустите скрипт (vpngate)
4. Обновите список VPN-серверов (пункт основного меню Update VPN List)
5. В случае необходимости отсортируйте список серверов и откорректируйте список дополнительных опций VPN.
6. Выберите пункт меню Connect VPN...
7. Выберите нужный сервер и нажмите OK

Скриншоты



Главное меню

Остальные скриншоты )

Окно About

Тест соединения


Скачать


Репозиторий на GitHub
Пакет для Slackware

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2020/11/02/konsolnyj-klient-dlya-besplatnogo-vpn-vpngate-net/

Назначение стандартных каталогов Linux.

Шпаргалка Леше к экзамену по ОС.

/ - корневой каталог

/bin - содержит стандартные утилиты Linux. Или, скажем так, - этот каталог содержит основные исполняемые файлы (в Windows такие файлы имеют расширение .exe), доступные всем пользователям, а также содержит символьные ссылки на исполняемые файлы. Символьная ссылка это специальный файл в файловой системе, внутри которого есть только одна-две строки с указанием полного пути, который должен быть открыт при попытке обратиться к данной ссылке (файлу).
/boot - содержит конфигурационные файлы загрузчика GRUB, образы ядра (по умолчанию хранятся последние три), файлы Initrd. Чтобы было понятно, что это за такие мифические файлы Initrd, немного внесем ясность. Когда начинается начальная загрузка системы, сначала монтируется временный виртуальный диск, который содержит временную корневую файловую систему, с помощью которой, в свою очередь, осуществляется запуск ядра Linux. Файл Initrd - образ этой временной корневой системы, который хранится на загрузочном устройстве.
/dev - содержит файлы устройств. В Linux устройством называется оборудование, которое подключается к системе в процессе загрузки ядра или в процессе работы системы. Эти устройства представляют методы для ввода или вывода информации. Например, жесткий диск - устройство для ввода (запись) и вывода (чтение), мышь - устройство ввода. Каждое движение или нажатие на кнопки мыши отправляет символ на устройство /dev/mouse, клавиатура - тоже устройство ввода. Большинство устройств в Linux представляют из себя файлы в особой файловой системе (исключение составляют сетевые карты). И вот эти файлы хранятся в каталоге /dev, куда к ним обращается система для выполнения задач, связанных с вводом/выводом.
/etc - содержит конфигурационные файлы операционной системы и всех сетевых служб. Данный каталог можно сравнить с реестром Windows, но в Windows общесистемные настройки хранятся в одном большом бинарном файле, а в Linux - в разных конфигурационных файлах, которые можно редактировать обычным текстовым редактором.
/home - название каталога говорит само за себя. Здесь содержатся домашние каталоги всех пользователей, которые зарегистрированы в системе. В домашних каталогах пользователей хранятся пользовательские файлы, а также пользовательские настройки различных программ. Как мы уже упоминали в предыдущей статье, Linux является многопользовательской системой, и поэтому каждый пользователь имеет свой уникальный и неповторимый каталог для своих личных, персональных файлов. Этот каталог называется Домашним каталогом пользователя и обозначается, как мы уже говорили немного ранее, /home/Имя_Пользователя. Такое разделение пользовательских каталогов и файлов операционной системы упрощает сохранение данных и повышает надежность самой операционной системы.
/lib - здесь находятся различные библиотеки и модули ядра. В процессе установки различных программ в Linux (в том числе и драйверов) устанавливаются зависимости (о них мы уже говорили) для корректной работы программы. Вот эти зависимости в большинстве случаев и есть библиотеки - набор собранных особым образом файлов, которые подключаются во время установки к устанавливаемой программе.
/lost+found - этот каталог нужен для хранения испорченных файлов при проблемах с файловой системой, которые были восстановлены после, например, некорректного размонтирования файловой системы. Это очень ценный каталог, удалить его не получится (он всё равно снова появится).
/misc - может содержать все что угодно.
/mnt и /media - обычно в этих каталогах содержатся точки монтирования. В современных дистрибутивах Linux этот процесс обычно происходит автоматически. При этом в каталогах /mnt или /media создается подкаталог, имя которого совпадает с именем монтируемого тома.
/opt - здесь обычно размещаются установленные программы, имеющие большой дисковый объем, или вспомогательные пакеты, например, у меня в этом каталоге всего две программы - это Adobe Reader и Google Chrome
/proc - это не совсем обычный каталог, это каталог псевдофайловой системы procfs, которая используется для предоставления информации о процессах (по-другому это виртуальная файловая система, которая обеспечивает связь с ядром и монтируется в каталогу /proc). Да-да, в системе Linux присутствует виртуальный файловый объект, именуемый каталогом /proc. Он существует только во время работы системы в оперативной памяти компьютера. Каталог представляет интерес и с точки зрения безопасности. Многие из утилит, выводящие информацию о системе (например, команда ps), берут свои исходные данные именно из этого каталога.
/root - каталог пользователя root (кто это такой, мы упоминали в одной из предыдущих статей).
/run - это совершенно новый каталог, который появился совсем недавно. И создан он (по задумке разработчиков) для хранения данных, которые были запущены приложениями, требующимися в процессе работы (это могут быть и службы, запускаемые самой системой, и программы, которые Вы запускаете сами).
Сюда входят:
- Идентификаторы процессов PID (каждый запущенный в среде Linux процесс имеет свой уникальный идентификатор - по-другому это адрес (в числовом виде) процесса, с которым будут взаимодействовать другие запущенные процессы во время работы);
- Информация о межпроцессорном взаимодействии (проще говоря, это обмен данными между запущенными процессами);
- Заблокированные файлы (если в процессе работы приложение или не запускается, или работает нестабильно? это может означать, что некоторые файлы этого приложения заблокированы другими процессами и происходит это тогда, когда сразу несколько приложений пытаются использовать один общий ресурс); - ну и другие данные, необходимые во время работы.

/sbin - набор утилит для системного администрирования, содержит исполняемые файлы, необходимые для загрузки системы и ее восстановления в различных щекотливых ситуациях. Запускать эти утилиты имеет право только root.
/tmp - каталог, в котором хранятся временные файлы. Linux, в отличие от Windows, следит за чистотой и регулярно очищает этот каталог.
/usr - содержит пользовательские программы, документацию, исходные коды программ и ядра. По размеру это один из самых больших каталогов файловой системы. В этот каталог устанавливаются практически все программы. И его (этот каталог) с большой натяжкой можно сравнить с каталогом Program Files в Windows.
/var - содержит файлы, которые подвергаются наиболее частому изменению. Например, кэши различных программ; файлы блокировки для недопустимости одновременного использования одной программы несколькими пользователями; файлы системных журналов; временные файлы (при выключении компьютера содержимое очищается); информация о различных программах; общая информация о состоянии системы с момента последней загрузки, входа в систему и т.д.; очередь печати, факсов, а также входящие почтовые ящики пользователей и т.д.

Источник

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2020/11/02/naznachenie-standartnyh-katalogov-linux/

Tags: ,
Linux. Узнать размер файла в байтах и сохранить его в переменную в скрипте.

Размер файла в байтах


Для дальнейшего использования удобнее всего получить размер файла с помощью утилиты du. Она входит в пакет coreutils, так что есть практически везде:

du -sb ./test.txt

где:
-sb - показывать размер в байтах
./test.txt - путь к файлу.

Вывод:

10 ./test.txt

Запись значения в переменную


Вывод команды du скармливаем awk и пишем результат в переменную:

CURSIZE=`du -sb path/file|awk '{print $1}'`

Пример использования


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

MINSIZE="10" #minimal file size (in bytes)
    
#check file size
CURSIZE=`du -sb "path/file"|awk '{print $1}'`
if [ "$CURSIZE" -le "MINSIZE" ]; then
	echo "File is small. Download error?"
fi


Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2020/11/02/linux-uznat-razmer-fajla-v-bajtah-i-sohranit-ego-v-peremennuyu-v-skripte/

Tags: ,
Получение root-прав на Андроид 5.0 и удаление лишних приложений

0. Включаем в настройках возможность устанавливать приложения из неизвестных источников (Настройки --> Безопасность --> Неизвестные источники)
1. Ставим Kingroot 4.85
2. Пролистываем приветственный экран Kingroot до конца, жмем кнопку на экране, получаем root
3. Перезагружаем телефон
4. Опять запускаем Kingroot
5. Выбираем на главном экране Удаление программ
6. Выкидываем ненужное но неудаляемое дерьмо типа спамяндекса.

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2020/10/29/poluchenie-root-prav-na-android-5-0-i-udalenie-lishnih-prilozhenij/

Отключение спящего режима на Android

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

Как вылечить нашел здесь Копия в PDF

Заодно уж, как зайти в режим разработчика Копия в PDF

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2020/10/28/otklyuchenie-spyashhego-rezhima-na-android/

Получение в скрипте bash PID процесса, запущенного в фоне.

Преамбула


В Linux практически любой процесс можно сделать фоновым, для чего достаточно добавить & через пробел после команды. Например:

openvpn --config ~/vpn/myvpn.ovpn &

Да, про опцию конфига daemon писать в комментах не надо, вызов openvpn просто для примера.

Но как же управлять процессом, например, остановить именно запущенный? По PID. Почему просто не воспользоваться pkill? Поясню на реальной задаче, например, на машине запускается несколько процессов openvpn, обеспечивающих коннект к нескольким провайдерам или нескольким сетям - если сделать pkill openvpn, положим сразу все процессы, а не конкретный. Значит, чтобы придушить конкретный процесс, надо получить конкретный PID.

Получение PID запущенного в фоне процесса.


На самом деле все придумали за нас, в bash есть системная переменная $!, хранящая PID последнего запущенного в фоне процесса.

Чтобы в другом скрипте остановить процесс, запущенный в первом, например, мы должны написать два скрипта для старта и остановки некоторой программы, мы должны куда-то сохранить полученный PID.

Демоны в Linux обычно делают текстовый файл (т.н. PID-файл), куда записывают свой PID при запуске. В своем скрипте мы можем сделать также:

openvpn --config ~/vpn/myvpn.ovpn & #запуск процесса
VPNPID=$! #сохраняем PID в переменную
echo "VPN PID $VPNPID" #выводим PID на консоль
echo $VPNPID > /tmp/myvpn.pid #сохраняем в файл


Использование сохраненного PID в другом скрипте


Например, для остановки процесса:

VPNPID=`cat "/tmp/myvpn.pid"` # Читаем PID-файл
echo "Stopping: $VPNPID" # Сообщение пользователю
kill "$VPNPID" # Завершаем процесс с сохраненным PID
rm "$PIDFILE" # Удаляем файл с неактуальным PID


Примечание по поводу network namespaces


Поскольку в системе всем процессам выдается уникальный PID, вне зависимости, например, от network namespace, в котором запущен процесс, соответственно, алгоритм сработает и для процесса, запущенного в сетевом неймспейсе:

Запуск:
ip netns exec <имя_неймспейса> openvpn --config ~/vpn/myvpn.ovpn &
VPNPID=$!
echo "VPN PID $VPNPID"
echo $VPNPID > /myfiles/server/ddns/vpn.pid


Останов:

VPNPID=`cat "/tmp/myvpn.pid"` # Читаем PID-файл
echo "Stopping: $VPNPID" # Сообщение пользователю
kill "$VPNPID" # Завершаем процесс с сохраненным PID
rm "$PIDFILE" # Удаляем файл с неактуальным PID


ФАНФАРЫ!

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2020/10/27/poluchenie-v-skripte-bash-pid-protsessa-zapushhennogo-v-fone/

Tags: ,
Linux dialog --tailbox

tailbox - интересный виджет программы dialog, позволяющий видеть дополнения в текстовом файле в реальном времени, что делает его удобным для отображения логов



Прямая ссылка: https://youtu.be/kdOjJFtbuI4

Если переданный программе лог не дополняется, то tailbox просто отображает последние строки из файла (насколько хватает заданных размеров виджета)



Вызов виджета:

dialog --title "заголовок_окна"  \
	  --exit-label "Надпись_на_кнопке_выхода" \
       --tailbox "текстовый_файл" высота ширина


Например:

dialog --title "LOG"  \
	  --exit-label "Close log window" \
       --tailbox "/tmp/mylog.log" 24 70


Для демонстрации написал простой log viewer.
Использование:

logview путь_к_файлу

logview )

Скрипт на GitHub

Отправка лога одновременно на дополнительный терминал, в файл и отображение в tailbox'е


Вроде бы виджет простой, но при некоторой смекалке можно делать интересные вещи, например, вести лог сразу в трех местах - отображая его в --tailbox'е, одновременно отправляя изменения, происходящие в реальном времени на отдельный терминал, и сохраняя лог в файл (с перезаписью или дозаписью)



Прямая ссылка https://youtu.be/AARNx4SbYJg

Добиться этого можно, совместив dialog tailbox с командой tee (копия).

Написал демонстрационный скрипт:
Демонстрационный скрипт )

В качестве источника логов, демо-скрипт вызывает в фоновом режиме другой скрипт tscript, который выводит 10 случайных чисел на консоль и завершает работу:

#!/bin/bash

SEC=1
CTR=10

echo "Test script, write to STDOUT random number after $SEC sec."

while [ "$CTR" -ne 0 ];do
    let "CTR=CTR-1"
    printf '%x Number: %x\n' $CTR $RANDOM
    sleep $SEC
done

echo "Complete!"


Настройки скрипта для поиграться можно провести через внутренние переменные:

LOG_FILE="./test.log" - если значение не задано, создается временный файл, который по завершению скрипта удаляется.
LOG_TTY="/dev/tty4" - если значение не задано, лог в реалтайме не отправляется на дополнительный терминал
RMLOG=0 - 0 - по завершению скрипта лог не удаляется, 1 - удаляется.
LOG_APPEND=1 - 0 - при каждом запуске создается новый файл. 1 - добавление данных в лог, если он существует.

Скрипты на GitHub

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2020/10/25/linux-dialog-tailbox/

Tags: , ,
Back Viewing 0 - 20