Иконка для своего приложения Windows. Стандартные размеры иконок

И как сделать ICO файл с несколькими изображениями
Спрашивали, как надо правильно делать иконку для своего Windows-приложения.

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

Если изображение будет одно и маленькое, то иконка будет выглядеть некрасиво, пойдет квадратными пикселями.

То же самое касается и иконки для формы приложения, хотя на самой форме корректно будет отображаться и маленькая иконка 16×16 пикселей, при переключении по Alt+Tab уже будет заметно и некрасиво.


Рисовать, то лучше в каком-нибудь векторном редакторе, чтоб было потом проще создать несколько растровых изображений разных размеров. Мы, например, пользуемся Inkscape, он простой, бесплатный и для простых изображений вполне подойдет.

Еще момент — изображение должно, очевидно, быть квадратным.

Стандартные размеры иконок приложения

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

— 16×16
— 32×32
— 48×48
— 256×256

Где-то читал рекомендацию, что нужен значок еще 128×128, но на практике пока не заметил, чтобы его наличие было критично.
Для Windows 7 и выше обязательно нужен значок 48×48
Обратите внимание, что размер значка рабочего стола по умолчанию в XP был 32×32, а в Windows 7 — 48×48

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

Сборка нескольких изображений в одну иконку

Известно, что в одном файле ICO могут храниться несколько изображений разных размеров. Для сборки есть много приложений и онлайн-сервисов, но мы пользуемся простой бесплатной программкой icon sushi Копия

Пользоваться очень просто.
1. Открываем все нужные изображения
2. Выделяем их в окне программы:

3. Сохраняем иконку (File — Save as Multiple Icon)

ЗЫ. Чтоб два раза не вставать.
Кто-то просил картинки-кнопочки от XuliOrganizzer’а
Так Леша выложил картинки на Github

Патчи от WannaCry, NotPetya и скрытых майнеров для Windows XP

Пришлось столкнуться, слава Ктулху не с самими вирями и майнерами, но с незаделанными дырками. Есть два пути обновить пожилую ОС, протестировать на наличие уязвимости Eternal Blue и заткнуть только ее, или сделать кумулятивное обновление.

Тестирование

Протестировать наличие дыры можно с помощью программы Eternal Blues. Пользоваться очень просто, вводим диапазон IP в локальной сети и жмем кнопку SCAN. Где в графе Vulnerable? указано YES, там дырка не заделана.

Заделываем

Качаем официальные патчи от MS

KB4012583
KB4012598

Устанавливаем, перезагружаемся, и проверяем результат программой Eternal Blues

Кумулятивное обновление

Вот тут в прямом смысле слава Украине, а точнее конкретному украинцу под именем Simplix, который заботливо собрал все обновления со времен выхода SP3 в одну кучу, протестировал и выложил в одном пакете.

Скачать можно с его сайта simplix

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

Установка детально описана на его же форуме.

Большой плюс для виндопользователей пиратской винды, если таковые найдутся :), после обновлений активация не слетает.

Копии на всякий случай

Eternal Blues
KB4012583 и KB4012598
UpdatePackLive-18.2.18 (update.bat запускает пакет обновления с ключом, обновляющим IE до версии 8)

OPENVPN: Запуск в фоновом режиме, настройка маршрутизации, фаервола и другие мелочи

Бредистория

Год назад, может раньше, по совету товарищей, я переполз с PPTP VPN на Openvpn. За это время узнал несколько хинтов, которые, периодически нужны либо по работе, либо кому-нибудь.
Эталонный конфиг, который буду модифицировать, лежит здесь

Проблема с установкой, требует модуль PAM

Windows: не актуально
Linux: да
Решение:
Собрать из исходников, предварительно переконфигурировав командой
./configure --disable-plugin-auth-pam

Автоматический ввод пароля

Windows: да
Linux: да, за исключением старых версий, которые приходилось пересобирать со специальным ключом. Если вдруг такое попалось, то обновить.
Решение:
В конфиг соединения надо добавить строку auth-user-pass /path/to/auth/file
где
/path/to/auth/ — путь к файлу авторизации
file — имя файла
Для Windows будет что-то типа C:\path\to\file.txt

Файл авторизации — простой текстовый файл в котором содержатся две строки: первая — логин, вторая — пароль:

содержимое файла file:
username
pa$$w05D

Запуск в фоновом режиме

Windows: не актуально
Linux: да
Решение:
В конфиг соединения надо добавить строку daemon

Выполнение пользовательских скриптов

Windows: не актуально, во всяком случае, мне не встречалось
Linux: да
Для чего надо: например, для того, чтобы при установке/разрыве соединения, настроить маршрутизацию или iptables (фаерволл)

Решение:
1. Надо разрешить Openvpn выполнять пользовательские скрипты, добавив в конфиг следующую строку:

script-security 2

2. Прописать путь к скрипту в одном или нескольких нужных параметров конфига, например:

up '/home/kvakushka/scripts/ovpn-routes up'
down '/home/kvakushka/scripts/ovpn-routes down'

Вообще, таких параметров довольно много, почти на все случаи жизни:
down <command> — выполнить команду когда интерфейс TUN/TAP выключится.
up-restart <command> — выполнить команду после каждого реконнекта
route-up <command> — выполнить команду после установки сетевых маршрутов.
up-delay <seconds> — подождать установленное количество секунд перед запуском команды указанной в up. Пример: up-delay 120
down-pre <command> — выполнить команду перед тем, как интерфейс TUN/TAP выключится.
up <command>— выполнить команду после запуска устройства TUN/TAP.
ipchange <command> — выполнить команду, если ip сервера изменился.
client-connect <command> — выполнить команду, после того, как клиент подключился.
client-disconnect <command> — выполнить команду, после того, как клиент отключился.
learn-address <command> — выполнить указанную команду, если IP удаленной стороны стал другим.

Надо уточнить, что скриптам up и down Openvpn передает параметры командной строки, несущие информацию о соединении:

[1..N]: Параметры, указанные пользователем в конфигурационном файле, т.е. в вышеприведенном примере, скрипту ovpn-routes при вызове после того, как поднимется тоннель, будет передано первым параметром «up«, а при разрыве соединения — «down«.
Очень полезный горшочек, позволяющий в одном скрипте обрабатывать несколько событий.
[2]: Имя сетевого устройства (тоннеля). Например, tun0
[3]: MTU сетевого интерфейса
[4]: MTU соединения
Можно использовать для сложной маршрутизации между несколькими каналами и поиска более выгодного маршрута.
[5]: IP-адрес клиента
[6]: IP-адрес клиента на стороне сервера
[7]: init, если скрипт был вызван во время запуска/останова Openvpn или restart, если скрипт был вызван при перезапуске (обрыве соединения, например).

Пример скрипта

#!/bin/bash

#заводим переменные с понятными именами
MAIN_STAT=$1 #up/down
DEV_NAME=$2
TUN_MTU=$3
LINK_MTU=$4
LOCAL_IP=$5
REMOTE_IP=$6
ADD_STAT=$7 #init/restart

#директория с iptables и ip
ACPATH="/usr/sbin/"

# [...]

#скрипт вызван при поднятии тоннеля
if [ "$MAIN_STAT" = "up" ]; then
     #установка маршрута по умолчанию для VPN
    "$ACPATH"ip route del default
    "$ACPATH"ip route add default via $REMOTE_IP dev $DEV_NAME src $LOCAL_IP
     #настройка IPTABLES
     #разрешение транзитного трафика
    "$ACPATH"iptables -P FORWARD ACCEPT
    exit
fi

#скрипт вызван при отключении тоннеля
if [ "$MAIN_STAT" = "down" ]; then 
    #запрет транзитного трафика 
    "$ACPATH"iptables -P FORWARD DROP
   #установка маршрута по умолчанию без VPN
    "$ACPATH"ip route del default
    "$ACPATH"ip route add default via 10.10.1.1 dev eth1 src 10.10.20.55
fi

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

Пример модифицированного конфига соединения Openvpn
Скрипт ovpn-routes

Источники

1. Основные команды и параметры OpenVPN Копия
2. Установка и настройка клиента OpenVPN в Ubuntu Копия

Установка Windows 7 с жесткого диска

Бредистория

Или сраный интеловский чипсет. В общем, вызвали меня на заказ, поставили задачу — десятку убить, семерку вкрутить. Беру верную флешку с YUMI, на которой есть образ Acronis Disk Durector, всякого рода винды и линуксы, нужные для эникейной работы, и начинаю.

Снес я Windows 10, убил б-гмерзкое GPT, переделил диск, вставляю флешку с установщиком Win 7, но не выходит каменный цветок, посылает меня установщик Windows 7 за Cdrom drivers, иначе говоря, Windows 7 просит драйверы CD-ROM.

Непорядок, подумал я, ибо CD-ROM даже в проекте не было. Легкое гугление дало ответ, Windows 7 не поддерживает USB 3.0 искаробки. Гейц с ним, включаю в BIOS режим совместимости USB. Линуксы и флешку и hdd видят, акронис тоже, а вот инсталлятор Windows 7 — хрен.

В общем думал я, думал, и таки нашел способ поставить Win7 с жесткого диска, хотя кучу времени зря потратил на добавление драйверов USB, различную греблю с перетыканием флешек и прочей фигней, есть же способ гораздо проще…

Что надо

1. Две флешки. На одну кладем любимую «форматилку», он же менеджер дисков и Hiren’s Boot CD. Вообще весь HBCD нам тут нахрен не нужен, можно обойтись вырезкой из сабжа.
2. Чуть не забыл, нужен еще какой-нибудь легковесный Linux. Я в конкретном случае использовал Puppy Linux.
3. Флешка 2, на которой или образ установочного диска Win7, или уже подготовленный для загрузки с флешки установщик. В моем случае, был вариант 2, заранее подготовленный с помощью rufus
4. Достаточное дисковое пространство. В моем распоряжении был аж терабайтный винт, хотя описываемый ход котом можно повторить даже на 50-гигабайтном IDE-HDD, буде он в такой конфигурации железа окажется.

Что делаем

1. Делаем разделы диска, как нам угодно. Например, я сделал логический диск D: для файлов пользователя, на 700 Гб, в конце диска, и оставил область в 300 Гб в начале неразмеченной. Установщик Win 7 сам ее потом разметит, положит файлы ОС на будущий диск C: и создаст свой загрузчик на отдельном разделе 'Зарезервировано системой', размером 100 Мб

2. Делаем с помощью любимого менеджера дисков, логический раздел для установщика Windows 7, размер варьируется, от 5 до 8 Гб, но лучше сделать 8. Формат (файловая система) раздела NTFS или FAT32, последнее предпочтительнее.

3. Загружаемся в Linux, и если вы последовали совету использовать Puppy, то все будет «какввенде» — рабочий стол, ряд дисков ниже, флешка с виндой с иконкой флешки. Жаль, не могу заснять видео, машину уже унесли

4. Копируем файлы с флешки с установщиком Windows на созданный раздел. Файлы скопировать просто: открываем флешку, кликая по ней 1 раз, открываем нужный диск (аналогично), переключаемся в окно с открытой флешкой, нажимаем CTRL+A, выделяя все в окне, и мышкой перетаскиваем в соседнее окно, где открт нужный раздел

5. Осталось перезагрузиться с загрузочной флешки, и выбрать пункт меню Boot From Hard Drive (Windows Vista/7/2008 or Xp), если вы грузитесь через PXE или с установленного на YUMI HBCD, или последовательно выбрать Boot Windows (XP/2003/2008/Vista/7) From Local HDD а только потом Boot From Hard Drive (Windows Vista/7/2008 or Xp)

Если все сделано верно, то Grub4DOS найдет bootmgr, а тот запустит установщик Windows 7.

Останется установщику указать неразмеченную область диска для установки.

Потом раздел с установщиком можно снести и объединить его с диском C: или D:.

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

Утилита для PXE или загрузочной флешки, запускающая Windows с локального жесткого диска.

А нахрена он нам?

Спросит вдумчивый читатель. И будет прав.

Отвечу на это:
1. Да чтобы запустить локальную Windows, если, например, слетел к чертям собачьим MBR, оригинального диска с виндой под руками нет, а зайти смерть, как надо, и именно в локальную винду.
2. Чтобы запустить установку Windows 7 (а может быть и 8, а может быть и 10, а может быть ворона, я не проверял) с локального жесткого диска. А вот зачем это — расскажу позднее.

Как сделано

1. Использован образ DOS, взятый отсюда
2. Подправлен AUTOEXEC.BAT
3. Добавлен Grub4DOS, причем особо не заморачиваясь, утащен с мультизагрузочной флешки, созданной YUMI
4. Подправлен menu.lst также нагло спертый из Hiren’s boot CD
5. Создана ISO-версия этого безобразия, по вот этому рецепту

Скачать

Готовый образ
Готовый образ, сжатый gzip
ISO-образ

Примечание

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

AVP Z.E.S Linux, или исследование образа одной древней дискеты.

Чисто от нефиг делать…

Истерический экскурс

В состав древних версий Касперского антивируса входила утилита, для создания спасательной дискеты, включающая образ диска bootdisk.img и собственно утилиту, копировавшую этот образ на дискету №1, а на все остальные 2-3 штуки — антивирусные базы.
Дискеты с базами были самые обычные, они нас не интересуют, а вот на первой дискете был малюсенький Linux со встроенным антивирем. Linux автоматически монтировал локальные диски, причем поддерживал FAT, FAT32, NTFS, HPFS, EXT2, т.е. все самые популярные на 1999-2001 г. файловые системы.
После загрузки Касперского надо было вставить дискеты с базами, дождаться загрузки баз и далее шла проверка. Если же дискеты с базами не вставить, то выбрасывало в линуксовую консоль, в последней версии без всяких вопросов, а в более ранней надо было ввести имя пользователя root и аналогичный пароль. Далее, зная команды, можно было бродить по дискам, читать файлы с помощью cat, копировать их, и т.д.
Касперский линукс был неприхотлив, для работы ему хватало то ли 4, то ли 8 Мб оперативки, и нам с товарищем удавалось запустить его даже на 486 машине, а вот на 386 не получилось, памяти не хватило.
Сама же дискета не открывалась ни в 98 винде, ни в NT и 2000, ни в Линуксе. Линукс мы знали совсем мало-мало, винды ругались на то, что диск не форматирован, мануалов особо не было, интернета и подавно. В общем решили мы, что хитрый Касперский дискету зашифровал, чтоб чуть что ее вирусы не заразили ненароком, и решили, что тягаться с самим Валентинычем нам не под силу, да и забили на это дело.

Иногда они возвращаются.

Недавно товарищ вновь объявился на горизонте и принес тот самый bootdisk.img из дистрибутива AVP 5, правда, огорчил, что доступные ему виртуалки образом подавились. Microsoft Virtual PC свалилась вместе с виндовозом в синий экран, а Virtualbox и вовсе отказался принимать это за образ дискеты.
Я высказал предположение, что дискета в формате RAW и на ней просто последовательно без всякой файловой системы записаны загрузчик, ядро Линукса и что-нибудь типа initrd, откуда и запускается все остальное, скинул образ на флэшку, и опять забыл.

Дело было вечером, делать было нечего…

Точнее мне не хотелось слушать разговоры слесарей о машинах и футболе, мне они так же непонятны, как слесарям разговоры о Линуксе, и мне же о бабах, потому что про глючные девайсы я и в интернете могу почитать. Бухать тоже не перло, но на автобазе было тепло, а снаружи дул холодный ветер и сыпал мерзкий снег. К тому же обнаружился ЁЁЁ-писюк с модемом, а в кармане валялась та самая флешка с образом и Хрювером, он же HIEW. А пуркуа бы не па…

Обратный отсчет. Поехали!

Скачиваю QEMU, ставлю и скармливаю ей образ дискетки:

qemu-system-i386.exe -fda bootdisk.img -boot a

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

Тааак… Если загрузились, должен быть и загрузчик. Вот, кстати он работает:

Вспоминаем устройство загрузочных дисков. Сначала BIOS загружает первые 512 байт, которым передает управление. Можно попробовать эти 512 байт отрезать и посмотреть, что получится.
Устанавливаю dd
И делаю вот так:
dd bs=1 count=512 if=bootdisk.img of=512.img
bs=1
— размер блока 1 байт
count=512 — количество блоков
if=bootdisk.img — откуда читать
of=512.img — куда писать

Пробую скормить выходной файл QEMU:

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

Пространственное сжатие

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

Момент два, чуть погодя:

Ага! Uncompressing Linux! Compressed image found at block 454!

Похоже, моя гипотеза подтверждается: загрузчик, за ним сжатое ядро, в которое встроены необходимые модули, а за ним сжатый образ со всем остальным.
За следующую гипотезу приму то, что Касперский не изобретал крутых велосипедов, а ограничился стандартным gzip-сжатием.
Недолгое гугление дало, что gzip-архив начинается с сигнатуры 1F 8B 08 00, хорошо, что на флешке завалялся HIEW.
Загружаем в него оригинальный образ, переключаемся в HEX-режим (F4) и пробуем поискать сигнатуру архива.

Вот первое совпадение по смещению 4344h т.е. на 17221 байте от начала файла (HIEW ведет счет с 0).

А вот и второе по смещению 71800h, т.е. на 464897 байте от начала файла.
Больше сигнатур обнаружено не было. Пока с моими гипотезами все в порядке.

Мы режем, режем, режем…

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

Сначала оставлю один загрузчик, чтобы посмотреть, как он поведет себя без всего остального.
Копирую bootdisk.img под именем loader.img, открываю loader.img в HIEW. Далее надо переключиться в HEX-режим и провести поиск первого вхождения сигнатуры 1F 8B 08 00.
Теперь переключаемся в режим редактирования (F3) и обрезаем файл с этой позиции включительно (Trunc, F10)
Выходим из HIEW, получился файл размером ровно 17220 байт. Скармливаю его QEMU.

Точно загрузчик. Не обнаружил сигнатуры запакованного gzip’ом ядра, отругался и оставил нас.

Попробую теперь повторить операцию, оставив в файле загрузчик и предполагаемое ядро. Копирую оригинальный файл под именем ldrkrnl.img и делаю все то же самое, что и в первом случае, только ищу второе вхождение. В итоге получился файл размером 464896 байт. Пробую запустить.

Ага! Ядро! Вроде бы загрузка поначалу шла нормально, но потом RAMDISK не нашел образа диска на своем месте и драйвер VFS потребовал с нас дискету с корневой файловой системой. Естественно, т.к. у дискеты нестандартный формат, то смонтировать ее не удалось и получилась kernel panic. Хотя, забегая вперед, это дает возможность отвязаться от ограничений RAMDISK и модифицировать систему как угодно. Фактически это, конечно, не нужно, проще уж что-то свое собрать, чем идти таким странным способом.
Но ради развлечения я все-таки систему модифицирую, не зря же ковырялся.

Встаньте под образа!

Раз уж речь зашла о модификации, то нАчать надо с того, чтобы извлечь образ ramdisk’а.
Это последнее, что я сделал в теплом гараже и на винде. Для остального уже Линукс надобен.
Итак, имеем ldrkrnl.img размером 464 896 байт, и оригинальный bootdisk.img. Чтобы вырезать рамдиск, можно воспользоваться dd:
dd bs=1 if=bootdisk.img of=ramdisk.gz skip=464896
skip=464896
— количество блоков размером в 1 байт (bs=1), которые нужно пропустить с начала файла bootdisk.img

На выходе получился файл ramdisk.gz размером мегабайт с хвостиком, имеющий в начале вышеупомянутую сигнатуру gzip-архива. Файл успешно открылся в WinRar, и тест показал, что ошибок не обнаружено.

Начинался новый день…

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

Продолжение следует…

О gzip-архиве и сигнатуре ея
QEMU для Windows XP
dd для Windows

Линуксовая утилита dd для Windows

Не буду описывать для чего она нужна %) Заметка от дырявой памяти на всякий случай.

Скачать с официального сайта
Прямая ссылка на последнюю стабильную не бета-версию 0.5
Копия на всякий противопожарный

QEMU для Windows XP

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

1. Качаем последнюю версию, поддерживающую XP 2016-09-03 (2.7.0) или отсюда
2. Ставим стандартным для Windows образом
3. Поскольку QEMU, как и в линуксе, управляется с командной строки, а расположена установленная программа в Program Files, да и имена у виртуалок длинные и неудобные, типа qemu-system-i386.exe, то пишем батник, передающий программе параметры, примерно такой, как здесь

содержимое qemu386.bat:
@Echo Off
Setlocal EnableDelayedExpansion
Set P="C:\Program Files\qemu\qemu-system-i386.exe"
For %%A In (%*) Do SET P=!P! %%~A

start "QEMU"/B %P%

Команда start — чтоб после запуска из консоли, например из-под FAR’а, консоль не висела, ожидая завершения работы QEMU
Параметр "QEMU" — заголовок окна, создаваемого командой start. Без него start подумает, что заголовок окна это путь к исполняемому файлу и попытается безуспешно выполнить первый передаваемый QEMU параметр.
/B — указывает команде start не создавать это самое новое окно, если его не указать, то за окном QEMU будет висеть черное пустое окно новой консоли.
В переменной %P% будет путь к QEMU и передаваемые параметры, например:
qemu-system-i386.exe -fda bootdisk.img -boot a загрузка с образа дискеты bootdisk.img

4. Кладем батник в какой-нибудь каталог, имеющийся в PATH, например, в C:\Windows

Пример как раз таки загрузки с такого образа

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

Батник на PasteBin или скачать

BAT-файл, анализирующий и передающий все параметры его командной строки вызываемой программе

Использоваться, например, может, если программа где-то глубоко зарыта в недрах Program Files, имя самой программы длинное и некузявое, а добавлять ее каталог в PATH бессмысленно или лень.

В таком случае можно написать подобный BAT-файл:

@Echo Off
Setlocal EnableDelayedExpansion
Set P=
For %%A In (%*) Do SET P=!P! %%~A

"C:\Program Files\somesoftware\soft.exe" %P%

Пример

@Echo Off
Setlocal EnableDelayedExpansion
Set P=
For %%A In (%*) Do SET P=!P! %%~A

echo %P%

Как работает

При вызове, например с такими параметрами:
test1.bat 1 2 34 5 76 blablabla hutinpuilo
выдаст на экран строку
1 2 34 5 76 blablabla hutinpuilo

Выдержка из источника SET, справка по команде под катом

ССЫЛКИ

Копия BAT-файла на Pastebin
Источник 1 2
SET (справка по команде, копия)

Более сложный способ мониторинга состояния сервера на Linux в реальном времени.

Продолжаю тему, начатую в предыдущей заметке [КОПИЯ]. В ней описывал получение данных от определенных скриптов и процессов запущенных на сервере под управлением Linux с помощью SSH, псевдотерминала и отдельного пользователя, создаваемого специально для целей мониторинга.

Будем посмотреть другой способ, с одной стороны, более сложный и требующий владения каким-нибудь языком программирования, кроме Bash-скриптов. Хотя, можно обойтись и исключительно одним Bash’ем, если клиент и сервер под Linux, или Bash прикрутили к Windows (cygwin(?), не пробовал, не знаю). А с другой стороны, наоборот, способ простой безопасный, требующий минимум вмешательства в настройки сервера.

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

Примечание: Термины «клиент» и «сервер» могут по ходу статьи быть неоднозначно истолкованными.
Серверное приложение будет наоборот, работать на «клиентском», «операторском» рабочем месте, а «сервер», в смысле компьютер с Linux, на котором я запускаю свои скрипты, и который управляет нужной мне железякой, станет вполне себе клиентом.
В общем, чтобы не вносить путаницы я условлюсь называть рабочее место оператора «локальным компьютером», а тот, который «сервер в привычном понимании» — «удаленным».

Задача

Такая же, как и в предыдущей заметке. Имеется удаленный компьютер под управлением Linux, рулящий системой контроля температуры и давления.
На самом деле, рулить он может чем угодно: от домашнего FTP с котиками или соединения с Интернетом, до управления СКД, открытием ворот, дверей, врат в Ад, личным концлагерем и т.д.
Суть в том, что нужно, чтобы удаленная система сигнализировала оператору об изменении своего состояния (изменении температуры, разрыва соединения с Интернетом, пришествии Сатаны). Оператор, как обычно, сидит под Windows (как в большинстве организаций в СНГ).

Некоторые соглашения

Для простоты условимся, что локальный и удаленный компьютер находятся в одной локальной сети (и одной подсети) 10.10.0.0/24, IP-адрес локального компьютера 10.10.0.30, прием данных производится через сетевой порт 11000 локального компьютера. Локальный и удаленный компьютеры обмениваются данными по протоколу TCP, данные представляют собой Unicode-строки.

Как это организовано на локальном и удаленном компьютере

Код

Сервера приема сообщений:
Смотреть на PasteBin
Скачать с Mega.nz

Скрипта отправки сообщений:
Смотреть на PasteBin
Скачать с Mega.nz

Источники

1. Клиент-серверное приложение на потоковом сокете TCP [Копия]
2. Как открыть TCP-/UDP-сокет средствами командной оболочки bash [Копия]

Видеоиллюстрация

Прямая ссылка

Универсальный конвертер символов перевода строки (Windows\Mac\Linux)

Ух и задолбался же я с этими самыми переводами строк! Возникла тут задачка конвертировать кучу огромную текстовых файлов из DOS/Windows (перенос строки CR+LF, h0D, h0A), старого Mac-формата (CR, h0D), который, вопреки утверждениям Википедии и других авторитетных источников использует не только вышедшие из употребления Маки, в формат Linux (LF, h0A). Желательно иметь возможность еще и обратной/произвольной конвертации между всем этим зоопарком. Сначала я, конечно, попробовал написать универсальный скрипт с помощью sed, но никакой универсальности не получилось. На C++, ой, после C# это все равно, что пересесть с мерседеса на велосипед. На C# задача в строчки 4 кода решается, но тащить ради маленькой утилиты Mono, это уж слишком

В общем нашел готовую крохотную утилиту flip.
Плюсы:
+ Есть готовые версии почти под все платформы, кроме DOS, даже статически откомпилированный бинарник для Linux, так что можно задуть в роутер/initrd, если оно кому-то там надо.
+ Бесплатно
+ Есть исходники
+ Работает моментально
+ Поддерживает файлы с перепутанными концами строк (где есть и Windows, и UNIX и Mac варианты)

Минусов пока не нашел.
Использование простое: первый параметр, что конкретно делаем, остальные — имена файлов через пробел.
Делать можно следующее:
-t — отобразить используемый тип переноса строки
-d — конвертировать в DOS/Windows формат (CR+LF)
-m — конвертировать в Mac-формат (CR)
-u — конвертировать в UNIX/Linux формат (LF)

Скачать можно со странички автора или отсюда:
1. Исходник
2. Slackware-пакет
3. Версия для Windows (консольная)
4. Все остальное

Венденачало

Как выглядели первые версии Windows
Windows 1.03


Внезапно, так и не удалось заставить работать в ей мышь.
Windows 2.01

В этой мышь уже работала, но на эмуляторе оно криво, как-нибудь сделаю видео запуска сего раритета на «железе» или же на более лучшем эмуляторе/виртуалке, а пока поверьте на слово, что можно порисовать в Paint, поиграть в Reversi, или же набрать текст в Блокноте или Write.

Впрочем, можете сами скачать и поиграться:
Windows 1.03 (осторожно, венда хранится в рашке)
Windows 2.01 (осторожно, венда хранится в рашке)

Настройка X11-forwarding через ssh, с помощью PuTTY и Xming

Вообще в Linux, а особенно на сервере под Linux вполне можно обходиться голой консолью, ибо все инструменты обычно в консольном варианте есть. Но иногда хочется запустить и графическое приложение, например программу разметки диска, а иногда без графики вообще не обойтись, если обрабатываешь видео или работаешь с виртуальными машинами. На наше счастье возможность удаленно работать с графическими программами есть. Называется это дело X11-Forwarding и существует оно аж в двух вариациях:
XDMCP, нечто вроде RDP в винде — когда мы подключаемся к оконному менеджеру Linux, вводим свой логин/пароль и работаем с удаленным рабочим столом.
— И просто возможность запуска отдельных приложений (GIMP, GParted и т.д.)

К первому я еще может, когда-нибудь вернусь, а пока будем настраивать второе.

Настройка X11-forwarding в ssh на стороне Linux

Будем считать, что ssh у нас уже настроен. Правим конфиг демона ssh /etc/ssh/sshd_config
Раскомментируем или дописываем следующие строки:
X11Forwarding yes
X11DisplayOffset 10
X11UseLocalhost yes

Перезапускаем демон или рестартируем сервер.
Если надо, открываем порты на файерволе:
Для переопределения дисплея:
iptables -A INPUT -s x.x.x.x/xx -p tcp --dport 6000 -j ACCEPT
iptables -A OUTPUT -s x.x.x.x/xx -p tcp --sport 6000 -j ACCEPT

Вместо x.x.x.x/xx подставить нужную подсеть

Настройка PuTTY

Щелкаем по значку в лотке, открываем Конфигурация и в появившемся окне выбираем в дереве слева Соединение -> SSH -> X11
Выставляем все значения как на картинке и запоминаем число после localhost: (оно понадобится виндовому X-серверу).

Настройка виндового X-сервера

Их, наверное с десяток всякоразных наберется, но я особо не экспериментировал, все побежали и я побежал, взял самый популярный Xming
1. Качаем с официального сайта или напрямую с SourceForge
2. Устанавливаем
3. Настраиваем, запускаем Пуск -> Все программы -> Xming ->XLaunch

Выбираем Multiple windows и устанавливаем Display number таким же, как было настроено в PuTTY:

Нажимаем Далее и выбираем Start no client, тогда Xming «поселится» в трее и будет ждать, пока мы с консоли PuTTY запустим какое-нибудь графическое приложение.


В следующем окне я оставил все также, поскольку Font Server не настраивал.

Хотя глюк со шрифтами у меня был, но как оказалось, его исправление особого шаманства не требует.

Если нажать Готово в следующем окне, Xming сядет в лоток и будет ждать, пока мы запустим что-нибудь графическое из консоли. Например
gparted &

символ & — чтоб программа запустилась в фоновом режиме и не занимала консоль.

Чтобы каждый раз не лезть в XLaunch, можно в свойства ярлыка Xming дописать нужные параметры "C:\Program Files\Xming\Xming.exe" :0 -clipboard -multiwindow

Глюк с размером шрифтов и борьба с ним.

По умолчанию Xming почему-то выставляет ОЧЕНЬ маленький размер шрифта меню и диалоговых окон


Борьба проста. Дописываем в окне Additional Parameters XLaunch’а в строку Additional parameters for Xming параметр -dpi 96 или его же в свойства ярлыка. Число в параметре выбираем под свои глаза и монитор

Вот что получилось:

Другие опции можно узнать из официального мануала

Источники не помню, но УМВР. И у друга тоже.

Скачать заметку в формате PDF

Отключение/включение сетевой карты с помощью DEVCON.EXE

Я тут Devcon упоминал, и вот для чего. Задача такая, склепать батник для включения/выключения сетевой карты. Решаем:

Что потребуется:

Рабочий Devcon.exe
Поиск ID сетевой карты
Для начала надо найти ID сетевой карты, для чего выводим список PnP-устройств в текстовый файл:
devcon.exe rescan
devcon find PCI* > PNP.log
Сетевая карта (даже встроенная) обычно висит на шине PCI.
В файле PNP.log будет что-то типа этого:

А вот и наша сетевая карта (подчеркнута красным)

Выдираем ее ID, с помощью которого и будем ей рулить.
Открываем файл на редактирование, ищем название и то, что начинается от первого слэша с конца, до первого с конца двоеточия и будет искомым идентификатором:
PCIVEN_10EC&DEV_8168&SUBSYS_83A31043&REV_03
Этот ID для команды включения/отключения можно и сократить, например до ID производителя+ID оборудования, поставив в нужном месте звездочку (*), например так:
PCIVEN_10EC&DEV_8168*
Но если вдруг у вас 2 одинаковые сетевые карты (на серверах бывает) — вырубятся обе.
Отключение устройства

Выполняется одной простой командой:
devcon disable <device_id>
где вместо <device_id> подставляем ранее найденный ID устройства. Т.е. в случае моей тестовой машины, команда выглядит как:
devcon disable "PCIVEN_10EC&DEV_8168&SUBSYS_83A31043&REV_03"
Включение устройства
Не менее простая команда:
devcon enable <device_id>
т.е. в моем случае:
devcon enable "PCIVEN_10EC&DEV_8168&SUBSYS_83A31043&REV_03"
ВАЖНО!
device_id необходимо взять в кавычки!!! Иначе командный интерпретатор примет (из-за наличия в ID амперсанда — т.е. символа &) одну команду за последовательность команд, и тогда выполнится первая disable PCIVEN_10EC, т.е. отключатся все PCI-устройства данного производителя, а остальные завершатся с ошибкой типа такой: "DEV_8168" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
Готовые батники на pastebin

Включить сетевую карту
Отключить сетевую карту

Это перепост заметки из моего блога на LJ.ROSSIA.ORG
Оригинал находится здесь: http://lj.rossia.org/users/hex_laden/332413.html
Прокомментировать заметку можно по ссылке выше.

DEVCON.EXE Консольный аналог Диспетчера устройств (для XP)

К XP, во всяком случае к XP Professional SP3 подходит Devcon от Windows Server 2003
Взять можно здесь:
Прямая ссылка
Ссылка на страничку на сайте Microsoft
Скачиваем cab-архив, оттуда извлекаем devcon.exe
На всякий случай переложил себе (мало ли MS с сайта уберут)
support.cab
devcon (zip)

Это перепост заметки из моего блога на LJ.ROSSIA.ORG
Оригинал находится здесь: http://lj.rossia.org/users/hex_laden/331569.html
Прокомментировать заметку можно по ссылке выше.

Несколько конфигураций сетевого адаптера Windows.

Быстрый способ переключения настроек.

Бывает так, что нужно сохранить и переключать время от времени несколько конфигураций сетевого адаптера в Windows, например, вы ходите по разным организациям с ноутбуком, подключаетесь по кабелю (да-да, не везде есть Wi-Fi, от жадности или в целях безопасности). В одной организации выделение IP происходит автоматически, через DHCP, в другой — надо все вводить вручную, в третьей, тоже вручную, но IP другие. 8 и 10 вроде могут сохранять конфигурации для нескольких сетей, а вот 7 и XP такого не умеют. Вот способ сделать все штатно, через командную строку Windows, с помощью утилиты netsh
Пусть, для примера у нас будут 3 сети с разными настройками:
Для них мы создадим три командных (batch) файла. При соединении с конкретной сетью запускается соответствующий batch-файл.
Да, поскольку у меня на ноутбуке XP, то и команды будут именно для XP. В 7 и выше синтаксис команд netsh вроде немного отличается.
Внимание! Для корректной работы с сетевыми интерфейсами, имена которых содержат русские буквы, batch-файл должен быть сохранен в кодировке DOS (866)
Сеть 1. Все настройки получаются через DHCP


Самый простой случай. В batch-файле содержится единственная команда:
netsh interface ip set address "Подключение по локальной сети" dhcp
где:
interface ip - указание, что операция будет производиться с интерфейсом ip (v4).
set address — устанавливаем адреса
"Подключение по локальной сети" — имя подключения
dhcp — тип получаемого адреса, по DHCP
Сеть 2. Все настройки указываются вручную, все адреса статические.

Установка адресов:
netsh interface ip set address "Подключение по локальной сети" static X.X.X.X Y.Y.Y.Y Z.Z.Z.Z M
где (исключая упомянутое в предыдущем пункте):
static — тип получаемого адреса, статический
X.X.X.X — IP компьютера (точнее, его сетевого интерфейса)
Y.Y.Y.Y — маска подсети
Z.Z.Z.Z — адрес основного шлюза
M — Метрика шлюза. Если у вас всего 1 сетевая карта, то указываем 1:
Метрика — определяет оценочную метрику маршрута в целых числах (от 1 до 9999) и используется при выборе из нескольких маршрутов в таблице маршрутизации наиболее точно соответствующих адресу места назначения пересылаемого пакета. Выбирается маршрут с наименьшей метрикой. Метрика может отражать количество скачков, скорость передачи, надежность пути, его пропускную способность или административные настройки.
Т.е. в нашем случае команда выглядит так:
netsh interface ip set address "Подключение по локальной сети" static 192.168.1.11 255.255.255.0 192.168.1.1 1
Добавляем первичный DNS:
netsh interface ip set dns "Подключение по локальной сети" static 10.20.0.5
Добавляем вторичный DNS:
netsh interface ip add dns "Подключение по локальной сети" 10.20.0.4

Внимание!
Команда именно add а не set.Хотя командой add можно и первый добавить.
Сеть 3. Все адреса статические. Некоторые параметры не указаны.


Примечание:
Такую конфигурацию можно использовать для отключения компьютера от интернета, но сохранив доступ к локальной сети.
netsh interface ip set address "Подключение по локальной сети" static 192.168.0.6 255.255.255.0 none
Команда установки адресов отличается только словом none на месте адреса шлюза. Т.е. указывает, что шлюз не указан
Внимание! Всегда лучше явно указывать отсутствие шлюза. Почему? Да потому что, если до этого в настройках был указан IP шлюза, то без явного указания (словом none), того, что шлюз не нужен, netsh программа оставит этот параметр без изменений.
Удаляем DNS-адреса:
netsh interface ip delete dns "Подключение по локальной сети" all
(вместо all можно указать конкретный адрес, если нужно удалить только его).
Источники

1. Using Netsh (на буржуйском)
2. Netsh commands for Interface IP (на буржуйском)
3. Настройка нескольких шлюзов в сети

Это перепост заметки из моего блога на LJ.ROSSIA.ORG
Оригинал находится здесь: http://lj.rossia.org/users/hex_laden/329789.html
Прокомментировать заметку можно по ссылке выше.