Sieve: обработка почтыв момент доставки пользователю
Рашид Ачилов
# cd /usr/ports/mail/dovecot2-pigeonhole && make install clean
protocols = $protocols sieve
service managesieve-login {
inet_listener sieve {
port = 4190
}
service_count = 1
mail_max_userip_connections = 10
managesieve_implementation_string = Dovecot Pigeonhole
managesieve_implementation_string = Cyrus timsieved v2.2.13
sieve_dir = ~/sieve
protocol lda {
mail_plugins = $mail_plugins sieve
}
protocol lmtp {
mail_plugins = $mail_plugins sieve
}
protocols = imap pop3 lmtp sieve
require ["envelope", "fileinto", "reject", "vacation", "regex", "relational"];
keep;
require ["envelope", "fileinto", "reject", "vacation", "regex", "relational"];
if address :is "from" "spamer@spamera.net" {
fileinto "All junk/Spamer";
} elsif address :contains "from" "megaspam" {
fileinto :permissions "g=rw,o=r" "All junk/Megaspam";
} else { keep; }
if (условие) { действие} [elsif (условие) { действие }] else (условие) { действие }
address :<как сравнивать> :<какую часть> "заголовок" "значение"
fileinto [:permissions "права"] "папка"
require ["envelope", "fileinto", "reject", "vacation", "regex", "relational"];
if anyof ( address :count "gt" ["to"] ["5"],
header :value "ge" "X-Spam-Score" "17" )
{ fileinto "SPAM"; }
require ["envelope", "fileinto", "reject", "vacation", "regex", "relational"];
if header :contains "Content-Type" [ "GB2312", "big5" ]
{ discard; } elsif not header :matches "Cc" "?*"
{ fileinto "All Junk/NoCC"; }
elsif size :over 2048K { discard; } else { keep; }
header :<как сравнивать> "заголовок" "текст заголовка"
size :<условность> размер
require "envelope", "fileinto", "reject", "vacation", "regex", "relational"];
if envelope :is "from" "thespamer@spamera.net"
{ reject text:
You are spammer.
Go away.
Spammers must die!
.
; } elsif envelope :contains "to" "blabla"
{ reject "Blabla blabla" }
elsif not exists ["From", "Date"] { redirect "bigspam@spamera.net"; }
else { keep; }
envelope :<какую часть> :<как сравнивать> "заголовок" "текст"
exists "заголовок"
require ["envelope", "fileinto", "reject", "vacation", "regex", "relational"];
if allof
(
anyof
(
header :regex "Subject" "^=\\?(gb|GB)2312\\?",
header :regex "Subject" "^=\\?big5\\?",
header :contains "Content-Type" [ "GB2312", "big5" ]
),
not allof ( header :value "lt" : comparator "i;ascii-numeric" "X-Spam-Score" "3",
header :value "gt" :comparator "i; acsii-numeric" "X-Spam-Score" "0" )
)
{ discard; stop; }
-----------------------------------------------------------------------------------------------------------------
Система AIX. Установка Base Operating System
Антон Борисов
Листинг 1. Список сервисов, запускаемых с помощью inetd
# lssrc -ls inetd
# lslpp -l | grep ssh
smitty installp
Листинг 2. Клиентская и серверная части к OpenSSH установлены успешно
# lslpp -l | grep ssh
lssrc -a | grep ssh
# mount -v cdrfs -r /dev/cd0 /mnt
# smitty installp
rpm -ih ./bash-3.2-1.aix5.2.ppc.rpm
odmget -q "name=en0" CuAt
-----------------------------------------------------------------------------------------------------------------
Автоматическое управление FTP-соединениями в домене
Иван Коробко
ftp:\\Имя:Пароль@Адрес:Порт
explorer.exe ftp://Ivanov:Pa$$w0rd@ftp.site.ru
Листинг 1. Управление режимом работы FTP
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Microsoft\FTP]
"Use PASV"="no"
"Use Web Based FTP"="no"
Листинг 2. Командный файл для создания активного FTP-соединения
@echo=off
start /wait /b regedit.exe /s \\msk\netlogon\ftp\active.reg
explorer.exe ftp://Ivanov:Pa$$w0rd@ftp.site.ru
Листинг 3. Шаблон конфигурационного XML-файла
…
Листинг 4. Создание FTP-соединения с помощью PowerShell
# Чтение параметра, с которым запущен сценарий
$ftpObj=$args[0]
# Чтение данных из XML-файла
[XML]$xml = Get-Content -Path "\\ДОМЕН\NETLOGON\FTP\ftp.xml"
# Поиск нужного подраздела
$xmlObj = $xml.root.ftp | ?{$_.name -eq $ftpObj}
# Чтение параметров FTP-соединения
$value = $xmlObj.ActiveMode
$user=$xmlObj.User
$pwd=$xmlObj.Password
$url=$xmlObj.Address
# Определение режима работы FTP (активный/пассивный)
if ($value -eq 1) {$regValue="no"} else {$regValue="yes"}
Set-ItemProperty -Path HKCU:\Software\Microsoft\FTP -Name "Use PASV" -Value $regValue
Set-ItemProperty -Path HKCU:\Software\Microsoft\FTP -Name " Use Web Based FTP" -Value "Name"
# Создание FTP-соединения
Start-Process -FilePath explorer.exe -ArgumentList ("ftp://{0}:{1}@{2}" -f $user,$pwd,$url)
c:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -version 1.0 -windowstyle Hidden \\DOMAIN\NETLOGON\FTP\ftp.ps1 НАЗВАНИЕ_РАЗДЕЛА
-----------------------------------------------------------------------------------------------------------------
Установка lightsquid для squid на операционной системе CentOS 6.0
Григорий Антропов
[root@srv1 ~]# chkconfig --list | grep httpd
[root@srv1 ~]# chkconfig httpd on
[root@srv1 ~]# mkdir /opt/www-sites
[root@srv1 ~]# mkdir /opt/www-sites/default
[root@srv1 ~]# mkdir /opt/www-site/default_ssl
#NameVirtualHost *:80
Листинг 1. Файл /etc/httpd/conf.d/00_default.conf
# default web site
ServerName FQDN_of_host
ServerAlias host_short_name alias1 alias2 localhost
ServerAdmin root@localhost
DocumentRoot /opt/www-sites/default
Order allow,deny
Allow from all
[root@srv1 ~]# service httpd start
[root@srv1 ~]# yum install mod_ssl
[root@srv1 ~]# cp /etc/httpd/conf.d/ssl.conf /etc/httpd/conf.d/ssl.conf.ORIG
Листинг 2. Файл /etc/httpd/conf.d/ssl.conf
LoadModule ssl_module modules/mod_ssl.so
Listen 443
SSLSessionCache shmcb:/var/cache/mod_ssl/scache(512000)
SSLSessionCacheTimeout 600
Листинг 3. Файл /etc/httpd/conf.d/00_defaul_ssl.conf
# default ssl site
SSLEngine on
SSLCertificateFile /etc/pki/tls/certs/ca.crt
SSLCertificateKeyFile /etc/pki/tls/private/ca.key
ServerName FQDN_of_host
ServerAlias host_short_name alias1 alias2 localhost
ServerAdmin root@localhost
DocumentRoot /opt/www-sites/default_ssl
ErrorLog logs/ssl_error_log
TransferLog logs/ssl_access_log
LogLevel warn
Order allow,deny
Allow from all
[root@srv1 ~]# mkdir /opt/masters/cert
[root@srv1 ~]# cd /opt/masters/cert
[root@srv1 ~]# openssl genrsa -out ca.key 1024
[root@srv1 ~]# openssl req -new -key ca.key -out ca.csr -subj "/C=RU/O=YourOrg/L=Moscow/CN= FQDN_of_host/CN= host_short_name"
[root@srv1 ~]# chmod 0600 ca.key
[root@srv1 ~]# chmod 0600 ca.csr
[root@srv1 ~]# chmod 0644 ca.crt
[root@srv1 ~]# cp ca.key /etc/pki/tls/private/
[root@srv1 ~]# cp ca.csr /etc/pki/tls/private/
[root@srv1 ~]# cp ca.crt /etc/pki/tls/certs/
[root@srv1 ~]# service httpd restart
[root@srv1 ~]# yum install lightsquid lightsquid-apache
[root@srv1 ~]# mv /usr/share/lightsquid /opt/www-sites
require "/usr/share/lightsquid/common.pl"
require "/opt/www-sites/lightsquid/common.pl"
#path to additional `cfg` files
$cfgpath ="/etc/lightsquid";
#path to `tpl` folder
$tplpath ="/opt/www-sites/lightsquid/tpl";
#path to `lang` folder
$langpath ="/opt/www-sites/lightsquid/lang";
#path to `report` folder
$reportpath ="/opt/www-sites/lightsquid";
#path to access.log
$logpath ="/var/log/squid";
#path to `ip2name` folder
$ip2namepath ="/opt/www-sites/lightsquid/ip2name"
$lang ="ru";
$showgrouplink = 0;
$graphmaxuser=0.60*(1024*1024*1024);
[root@srv1 ~]# cp /opt/www-sites/lightsquid/lang/ru.lng /opt/www-sites/lightsquid/lang/ru.lng.ORIG
Листинг 4. Файл /etc/httpd/conf.d/00_defaul.conf
# lightsquid web site
ServerName FQDN_of_host
ServerAlias host_short_name alias1 alias2 localhost
ServerAdmin root@localhost
DocumentRoot /opt/www-sites/lightsquid/cgi
DirectoryIndex index.cgi
Options ExecCGI
AddHandler cgi-script.cgi
AllowOverride None
Order allow,deny
Allow from all
[root@srv1 ~]# cd /etc/lightsquid
[root@srv1 ~]# /opt/www-sites/lightsquid/check-setup.pl
[root@srv1 ~]# service httpd restart
require "/usr/share/lightsquid/common.pl";
require "/usr/share/lightsquid/ip2name/ip2name.$ip2name";
require "/opt/www-sites/lightsquid/common.pl";
require "/opt/www-sites/lightsquid/ip2name/ip2name.$ip2name";
[root@srv1 ~]# /usr/sbin/lightparser.pl
Листинг 5. Вспомогательный сценарий
#!/bin/bash
#
# Вспомогательный сценарий для lightsquid
# Служит для заполнения файла skipuser.cfg
# IP-адресами из локальных подсетей
#
if [ $# -lt 4 ]; then
echo "Применение:"
echo "ip-helper network start stop out_file_path"
echo "где network – подсеть (по границе байта)"
echo "в виде xxx.xxx.xxx (пример: 172.23.201)"
echo "start – начальный адрес в подсети (пример: 12)"
echo "stop – конечный адрес в подсети (пример: 243)"
echo "out_filepath – полный путь к создаваемому
echo "файлу, если полный путь не указан,"
echo "файл будет создан в текущем каталоге."
echo "Если файла нет, будет создан файл с содержимым:"
echo "xxx.xxx.xxx.start"
echo "........"
echo "xxx.xxx.xxx.stop"
echo "Если файл есть, в конец файла будет добавлено"
echo "указанное выше содержимое."
echo "Внимание! Задавайте корректные значения"
echo "подсети, начальный и конечные адреса,"
echo "сценарий достаточно глуп, чтобы контролировать"
echo "эти величины."
exit 1
fi
s=$(echo $2 | tr -d 0-9)
if [ ! -z "${s}" ]; then
echo "Ошибка:"
echo "start – начальный адрес в подсети –"
echo "должно быть число."
exit 1
fi
s=$(echo $3 | tr -d 0-9)
if [ ! -z "$s" ]; then
echo "Ошибка:"
echo "stop – конечный адрес в подсети –"
echo "должно быть число."
exit 1
fi
if [ $2 -gt 254 ]; then
echo "Ошибка:"
echo "start – начальный адрес в подсети"
echo "не может быть больше 254."
exit 1
fi
if [ $3 -gt 254 ]; then
echo "Ошибка:"
echo "stop – конечный адрес в подсети"
echo "не может быть больше 254."
exit 1
fi
if [ $2 -ge $3 ]; then
echo "Ошибка:"
echo "начальный адрес в подсети (пример: 12) должен"
echo "быть больше, чем конечный адрес в подсети"
echo "(пример: 243)"
exit 1
fi
if [ ! -f ${4} ]; then
echo "# network=${1}/24 startIP=${2} stopIP=${3}" > $4
else
echo "# network=${1}/24 startIP=${2} stopIP=${3}" >> $4
fi
if [ ! $? -eq 0 ]; then
echo "Не могу записать результат в файл ${4},"
echo "проверьте путь и права доступа"
exit 1
fi
for (( i=$2; i<=$3; i+=1 )); do
echo "${1}.${i}" >> $4
done
echo "Результат записан в файл ${4}"
example\buratinokd Деревяшкин Буратино Карлович
example\karabasbb Бродатый Карабас Барабас
wbinfo -i UserLogonName
Листинг 6. Файл сценария userrealname
#!/bin/bash
#
# Описание: этот сценарий служит для создания файла
# соответствия между logonName и DisplayName пользователей
# домена Windows для генерации отчетов с помощью lightsquid
#
# Замечания: все входные переменные, необходимые
# для сценария, должны располагаться в файле с именем
# .
# Этот файл должен находиться в том же каталоге,
# в котором находится сам сценарий .
#
PATH=$PATH:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr:/local/sbin
export PATH
# Получить имя сценария и полный путь к сценарию:
scriptname=`basename $0`
tmp=$(readlink -f $0)
scriptpath=`dirname $tmp`
# Прочитать переменные из конфигурационного файла:
. "${scriptpath}/${scriptname}.conf"
if [ ! $? -eq 0 ] ; then
errmsg="$(date)\n!!! Ошибка: Файл ${scriptpath}/${scriptname}.conf имеет ошибки синтаксиса или отсутствует\n. Проверьте файл и запустите сценарий снова\n---"
echo -e ${errmsg} >> "${scriptpath}/${scriptname}-configuration.error"
echo -e ${errmsg}
exit 1
fi
# Проверить наличие каталога lightsquid
if [ ! -d ${lightsquiddir} ]; then
errmsg="$(date)\n!!! Ошибка: Каталог lightsquid=${lightsquiddir} не найден\n. Проверьте правильность задания переменной lightsquiddir\n---"
echo -e ${errmsg} >> "${scriptpath}/${scriptname}-configuration.error"
echo -e ${errmsg}
exit 1
fi
# Создать каталог для log-файлов:
logdir="${scriptpath}/log"
if [ ! -d "${scriptpath}/log" ]; then
mkdir "${scriptpath}/log"
if [ "$?" -ne 0 ] ; then
errmsg="$(date)\n!!! Ошибка: Не могу создать каталог ${scriptpath}/log\n. Проверьте права доступа к каталогу ${scriptpath}\n---"
echo -e $errmsg >> "${scriptpath}/${scriptname}-configuration.error"
echo -e $errmsg
exit 1
fi
fi
# Начало процесса (для записи в logfile)
begintm=`date`
# Log-файл
filedate=`date +%Y%m%d`
report="${logdir}/${scriptname}-${filedate}.txt"
# Проверить наличие wbinfo
which wbinfo > /dev/null
if [ ! $? -eq 0 ] ; then
errmsg="$(date)\n!!! Ошибка: Отсутствует утилита wbinfo\n.Сценарий не может быть выполнен\n---"
echo -e ${errmsg} >> "${scriptpath}/${scriptname}-configuration.error"
echo -e ${errmsg}
exit 1
fi
# Получить свой Windows-домен
owndom=$(wbinfo --own-domain)
# Получить пользователей из своего домена
usersfile="${lightsquiddir}/${realname}"
if [ -f "${usersfile}" ]; then
$(rm -f "${usersfile}")
fi
i=0
domainpref=$(echo "${owndom}" | tr "[:upper:]" "[:lower:]")
for u in $(wbinfo -u --domain="${owndom}"); do
ui=$(echo "${u}" | sed 's/\\/\\\\/')
# LogonName для правильной работы lightsquid должно быть
# в нижнем регистре:
ul=$(echo "${u}" | tr "[:upper:]" "[:lower:]")
fullname=$(wbinfo -i "${ui}" | cut -d ':' -f 5)
echo "${domainpref}\\${ul} ${fullname}" >> "${usersfile}"
let i=i+1
done
# Удалить старые log-файлы:
$(find ${logdir} -maxdepth 1 -type f -mtime "+${logdays}" -exec rm {} \;)
# Записать результат работы в log- файл:
echo -e "Начало процесса: ${begintm}" >> "${report}"
echo -e "Домен windows ${owndom}" >> "${report}"
echo -e "Экспориторовано учетных записей: ${i}" >> "${report}"
echo -e "Окончание процесса: `date`" >> "${report}"
echo -e "---" >> "${report}"
Листинг 7. Файл userrealname.conf конфигурации сценария
# Конфигурационный файл входных переменных.
# Этот файл должен содержать только комментарии
# и переменные, необходимые для работы сценария,
# с использованием синтаксиса bash.
# Путь к каталогу размещения файла соответствия logonName CN.
# Пример: lightsquiddir="/etc/lightsquid"
lightsquiddir="/etc/lightsquid"
# Имя файла lightsquid, в котором находятся соответствия
# между logonName и CN.
# Пример: realname=realname.cfg
realname="realname.cfg"
# Время жизни файлов журнала в днях.
# Файлы журналов создаются в каталоге log.
# Файлы старше logdays будут удалены.
# Пример: logdays=30
logdays=7
[root@srv1 ~]# yum install mod_authz_ldap
Листинг 8. Ограничение доступа к сайту отчетов
# lightsquid web site
ServerName FQDN_of_host
ServerAlias host_short_name alias1 alias2 localhost
ServerAdmin root@localhost
DocumentRoot /opt/www-sites/lightsquid/cgi
AuthBasicProvider ldap
AuthType Basic
AuthName "Squid reports"
AuthLDAPURL "ldap://dc01_FQDN:3268 dc02_FQDN:3268/dc=example,dc=local?sAMAccountName?sub?(ObjectClass=user)"
AuthLDAPBindDN AD-reader@example.local
AuthLDAPBindPassword ↵
"password_of_AD-Reader"
DirectoryIndex index.cgi
Options ExecCGI
AddHandler cgi-script .cgi
AllowOverride None
Require ldap-group cn=allow_squid_reports,ou=squid,ou=Test Container,dc=example,dc=local
Order allow,deny
Allow from 127.0.0.1
Allow from ::1
Satisfy any
AuthLDAPURL "ldap://dc01_FQDN:3268 hq- dc02_FQDN:3268/dc=example,dc=local?sAMAccountName?sub?(ObjectClass=user)"
Require ldap-group cn=allow_squid_reports,ou=squid,ou=Test Container,dc=example,dc=local
Allow from 127.0.0.1,
Allow from ::1
Satisfy any
Require ldap-group cn=....( distinguishedName группы Active Directory)
Листинг 9. Конфигурационный файл apache, перенаправляющий соединение HTTP на HTTPS
# default web site
ServerName FQDN_of_host
ServerAlias host_short_name alias1 alias2 localhost
ServerAdmin root@localhost
RewriteEngine on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
Листинг 10. Конфигурационный файл etc/httpd/conf.d/00_default_ssl.conf для соединения по протоколу HTTPS
# default ssl lightsquid site
SSLEngine on
SSLCertificateFile /etc/pki/tls/certs/ca.crt
SSLCertificateKeyFile /etc/pki/tls/private/ca.key
ServerName FQDN_of_host
ServerAlias host_short_name alias1 alias2 localhost
ServerAdmin root@localhost
ErrorLog logs/ssl_error_log
TransferLog logs/ssl_access_log
LogLevel warn
DocumentRoot /opt/www-sites/lightsquid/cgi
AuthBasicProvider ldap
AuthType Basic
AuthName "Squid reports"
AuthLDAPURL "ldap://dc01_FQDN:3268:3268 hq- dc02_FQDN:3268/dc=example,dc=local?sAMAccountName?sub?(ObjectClass=user)"
AuthLDAPBindDN AD-reader@example.local
AuthLDAPBindPassword "password_of_AD-Reader"
DirectoryIndex index.cgi
Options ExecCGI
AddHandler cgi-script .cgi
AllowOverride None
Require ldap-group cn=allow_squid_reports,ou=squid,ou=Test Container,dc=example,dc=local
Order allow,deny
Allow from 127.0.0.1
Allow from ::1
Satisfy any
[root@srv1 ~]# mkdir /opt/www-sites/proxyautoconfig
Листинг 11. Сценарий proxy autoconfiguration
// SQUID-сервер
var ProxyAddress="172.24.131.10:3128";
// Внутренние сайты, ходить без SQUID
function MakeNames() {
this[0]="*internal_domain_1*";
this[1]="*internal_domain_2*";
}
DirectNames=new MakeNames();
var cDirectNames=2;
// Внутренние подсети, ходить без SQUID
function MakeIPs() {
this[0]="127.0.0.0";
this[1]="255.255.255.0";
this[2]="172.0.0.0";
this[3]="255.0.0.0";
}
DirectIPs=new MakeIPs();
var cDirectIPs=4;
function FindProxyForURL(url, host) {
if(isPlainHostName(host))
return "DIRECT";
for(i=0; i
ServerName FQDN_of_host
ServerAlias host_short_name alias1 alias2 localhost
ServerAdmin root@localhost
RewriteEngine on
RewriteCond %{REQUEST_URI} !^/wpad\.dat
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
DocumentRoot /opt/www-sites/proxyautoconfig
AddType application/x-ns-proxy-autoconfig .dat
Order allow,deny
Allow from all
DocumentRoot /opt/www-sites/proxyautoconfig
AddType application/x-ns-proxy-autoconfig .dat
Order allow,deny
Allow from all
RewriteCond %{REQUEST_URI} !^/wpad\.dat
-----------------------------------------------------------------------------------------------------------------
Мультиуправление с единой клавиатурой и мышью
Антон Борисов
Листинг 1. Пример конфигурации для серверной части Synergy
section: screens
a-bs-mac-mini.local:
halfDuplexCapsLock = false
halfDuplexNumLock = false
halfDuplexScrollLock = false
xtestIsXineramaUnaware = false
switchCorners = none +top-left +bottom-left
switchCornerSize = 0
laptop:
halfDuplexCapsLock = false
halfDuplexNumLock = false
halfDuplexScrollLock = false
xtestIsXineramaUnaware = false
switchCorners = none
switchCornerSize = 0
trimslice:
halfDuplexCapsLock = false
halfDuplexNumLock = false
halfDuplexScrollLock = false
xtestIsXineramaUnaware = false
switchCorners = none +top-right +bottom-right
switchCornerSize = 0
end
section: aliases
end
section: links
a-bs-mac-mini.local:
right = laptop
laptop:
right = trimslice
left = a-bs-mac-mini.local
trimslice:
left = laptop
end
section: options
heartbeat = 5000
relativeMouseMoves = false
screenSaverSync = true
win32KeepForeground = false
switchDelay = 250
switchCorners = none
switchCornerSize = 0
keystroke(Control+Shift+1) = switchToScreen(a-bs-mac-mini.local)
keystroke(Control+Shift+2) = switchToScreen(laptop)
keystroke(Control+Shift+3) = switchToScreen(trimslice)
end
-----------------------------------------------------------------------------------------------------------------
Файловый сервер для Windows-сети
Игорь Орещенков
FRAMEBUFFER = Y
sudo update-initramfs -u
UTC=yes
UTC=no
#!/bin/sh
ntpdate firmnet.localdomain
$ sudo chmod 0755 /etc/cron.daily/ntpdate
$ sudo /etc/cron.daily/ntpdate
start on (local-filesystems and net-device-up)
start on (local-filesystems and net-device-up and started cups)
samba-interop-install --check-version
$ sudo service winbind stop
$ sudo service smbd stop
$ sudo service nmbd stop
$ sudo mv /etc/samba/smb.conf /etc/samba/smb.conf.0
$ sudo nano /etc/samba/smb.conf
[global]
workgroup = FIRMNET
realm = FIRMNET.LOCALDOMAIN
security = ADS
idmap config * : range = 10000-19999
idmap config * : backend = tdb
[dbase]
comment = 1C Database
path = /srv/fileserver/dbase
valid users = @FIRMNET\sale-grdbase
read only = No
[office]
comment = Common files
path = /srv/fileserver/office
valid users = @FIRMNET\sale-groffice
read only = No
...
password: files winbind
group: files winbind
hosts: files dns winbind
...
$ sudo net ads join -U Administrator%password
$ sudo service nmbd start
$ sudo service smbd start
$ sudo service winbind start
$ wbinfo -u
$ wbinfo -g
$ getent passwd FIRMNET\\sale-chef
$ sudo wbinfo -a FIRMNET\\sale-chef%password
C:\> net view \\salesrv
$ sudo mount -v -o remount /srv/fileserver/dbase
$ sudo mount -v -o remount /srv/fileserver/office
$ sudo setfacl -m g:FIRMNET\\sales-grdbase:rwx /srv/fileserver/dbase
$ sudo setfacl -m g:FIRMNET\\sales-groffice:rwx /srv/fileserver/office
$ sudo setfacl -m -d g:FIRMNET\\sales-grdbase:rwx /srv/fileserver/dbase
$ sudo setfacl -m -d g:FIRMNET\\sales-groffice:rwx /srv/fileserver/office
-----------------------------------------------------------------------------------------------------------------
Что в имени тебе моем, или Удаленный анализ сети. Часть 3. Идентификация
Андрей Бирюков
> tracert 100.1.1.2 -d
Nmap -sS 192.168.10.2 -n
Nmap -sT 192.168.10.2 -n
Nmap -sU 192.168.10.2 -n
Nmap -O <сканируемый узел> -vv –n
> telnet 192.168.1.2 5000
> telnet smtp.ru 25
-----------------------------------------------------------------------------------------------------------------
Безопасность протокола OSPF
Андрей Бирюков
метрика = reference bandwidth / link bandwidth
interface eth0
description DMZ_Network
ip ospf authentication message-digest
ip ospf message-digest-key 1 md5 secret_key
interface eth1
interface 10
interface tun10
router ospf
ospf router-id 192.168.20.111
redistribute kernel
redistribute connected
network 192.168.20.0/24 area 0.0.0.0
area 0.0.0.0 authentication message-digest
line vty
exec-timeout 30 0
router# show ip ospf
router # ip route add 64.100.0.0/14 dev eth0
router # ip route add 128.107.0.0/16 dev eth0
router # sh ip ospf route
backtrack / # ./nemesis-ospf
backtrack / # ./nemesis-ospf –v –pH –N 128.107.0.1
backtrack / # ./nemesis-ospf –v –pR LSA 128.107.0.1
ip ospf priority 255
bt / # perl IOStack.pl -d 192.168.66.202 -p ****** -e ****** -r stackdump
bt / # ./OoopSPF
./OoopSPF -s 192.168.1.0 -n 255.255.255.0 -d 192.168.1.1 -f fakeconfig -t -vv
interface ethernet 0
ospf database-filter all out
router ospf 109
neighbor 1.2.3.4 database-filter all out
-----------------------------------------------------------------------------------------------------------------
РНР-демоны
Александр Календарев
umask(0); // Пункт 1
$pid = pcntl_fork(); // Пункт 2
if ($pid < 0) {
print('fork failed');
exit 1;
}
if ($pid > 0) // Родительский процесс
echo “daemon process started\n”;
exit; // Заканчиваем
}
// (pid > 0) дочерний процесс
$sid = posix_setsid();// Пункт 3
if ($sid < 0) exit 2;
chdir(‘/’); // Пункт 4
file_put_contents($pidFilename, getmypid() ); // Пункт 6
run_process(); // Запуск цикла обработки данных
// Устанавливаем лог-файл
ini_set('error_log',$logDir.'/error.log');
// $logDir – обычно /var/log/mydaemon
// Закрываем открытые системой файловые дескрипторы
// stdin,stdout,stderr
fclose(STDIN);
fclose(STDOUT);
fclose(STDERR);
// Перенаправляем stdin в /dev/null
$STDIN = fopen('/dev/null', 'r');
// Перенаправляем stdout в лог-файл
$STDOUT = fopen($logDir.'/application.log', 'ab');
// Перенаправляем stderr в лог-файл
$STDERR = fopen($logDir.'/application.error.log', 'ab');
ob_start(); // Немного измененный пункт 5
var_dump($some_object); // Некоторый вывод
$content = ob_get_clean(); // Берет часть выходного буфера и очищает его
fwrite($fd_log, $content); // Сохраняет часть данных вывода в лог
// Обработчик сигнала
function sig_handler($signo)
{
global $fd_log;
switch ($signo) {
case SIGTERM:
// Действия по обработке сигнала SIGTERM
fclose($fd_log); // Закрываем log-файл
unlink($pidfile); // Уничтожаем pid-файл
exit;
break;
case SIGHUP:
// Действия по обработке сигнала SIGHUP
// Перечитываем файл конфигурации и инициализируем данные заново
init_data();
break;
default:
// Прочие сигналы, информация об ошибке
}
}
// Установка обработчика сигнала
pcntl_signal(SIGTERM, "sig_handler");
pcntl_signal(SIGHUP, "sig_handler")
// Создаем контекст мониторинга базовых событий
$base = event_base_new();
// Создаем контекст текущего события, по одному контексту на каждый вид событий
$event = event_new();
$errno = 0;
$errstr = '';
// Наблюдаемый объект (дескриптор)
$socket = stream_socket_server("tcp://$IP:$port", $errno, $errstr);
// Устанавливаем в неблокируемый режим
stream_set_blocking($socket, 0);
// Устанавливаем обработчик на дескриптор
event_set($event, $socket, EV_READ | EV_PERSIST, 'onAccept', $base);
// Привязываем событие к базовому контексту
event_base_set($event, $base);
// Добавляем/активируем событие к мониторингу
event_add($event);
// Функция-обработчик на появление нового соединения
function onAccept($socket, $flag, $base) {
global $id,$buffers,$ctx_connections;
$id++;
$connection = stream_socket_accept($socket);
stream_set_blocking($connection, 0);
// Создаем новый буфер и привязываем обработчики на чтение/запись в буфер или ошибку обработки
$buffer = event_buffer_new($connection, 'onRead', NULL, 'onError', $id);
// Присоединяем буфер к базовому контексту
event_buffer_base_set($buffer, $base);
// Выставляем тайм-аут, если не будет сигнала от источника
event_buffer_timeout_set($buffer, 30, 30);
// Устанавливаем флаги
event_buffer_watermark_set($buffer, EV_READ, 0, 0xffffff);
// Устанавливаем приоритет
event_buffer_priority_set($buffer, 10);
// Устанавливаем флаги
event_buffer_enable($buffer, EV_READ | EV_PERSIST);
$ctx_connections[$id] = $connection;
$buffers[$id] = $buffer;
}
function onRead($buffer, $id) {
// Чтение из буфера 256 символов или EOF
while($read = event_buffer_read($buffer, 256)) {
var_dump($read);
}
}
function onError($buffer, $error, $id) {
// Объявляем глобальные переменные, как вариант – переменные класса
global $id,$buffers,$ctx_connections;
// Деактивируем буфер
event_buffer_disable($buffers[$id], EV_READ | EV_WRITE);
// Освобождаем контекст буфера
event_buffer_free($buffers[$id]);
// Закрываем необходимые файловые/сокетные десткрипторы
fclose($ctx_connections[$id]);
// Освобождаем память, занятую под буферы
unset($buffers[$id], $ctx_connections[$id]);
}
$event2 = event_new();
// Используем в качестве события файловый дескриптор произвольного временного файла
$tmpfile = tmpfile();
event_set($event2, $tmpfile, 0, 'onTimer', $interval);
$res = event_base_set($event2, $ base);
event_add($event2, 1000000 * $interval);
Function onTimer( $tmpfile, $flag ,$interval) {
$global $base,$event2;
if ($event2) {
event_delete($event2);
event_free($event2);
}
call_user_function(‘process_data’,$args);
$event2 = event_new();
event_set($event2, $tmpfile, 0, 'onTimer', $interval);
$res = event_base_set($event2, $ base);
event_add($event2, 1000000 * $interval);
}
$socket=socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_nonblock($socket);
socket_connect($socket,$host,$port);
$event2 = event_new();
event_set($event2, $socket, EV_READ | EV_PERSIST, 'onStatus', $base);
event_base_set($event2, $base);
event_add($event2);
// Удаляем контекст конкретного события из базы мониторинга, выполняется для каждого события
event_delete($event);
// Освобождаем контекст конкретного события, выполняется для каждого события
event_free($event)
// Освобождаем контекст базовых событий мониторинга
event_base_free($base);
nohup php mydaemon.php –master >>/var/log/daemon.log 2>> /var/log/daemon.error.log &
service myapp start
service myapp start
chmod +x /etc/init.d/myapp
chown root:root /etc/init.d/myapp
#! /bin/sh
#
appdir = “/usr/share/myapp/app.php”
parms = “--master –proc=8 –daemon”
if [ ! -x appdir ]; then
exit 1
fi
if [ -x /etc/rc.d/init.d/functions ]; then
. /etc/rc.d/init.d/functions
fi
RETVAL=0
start () {
echo "Starting app"
daemon /usr/bin/php $appdir $parms
RETVAL=$?
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/mydaemon
echo
return $RETVAL
}
stop () {
echo -n "Stopping $prog: "
daemon killproc /usr/bin/fetchmail
RETVAL=$?
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/mydaemon
echo
return $RETVAL
}
case $1 in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
status /usr/bin/mydaemon
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
;;
RETVAL=$?
exit $RETVAL
if(is_file('app.phar')){ // Уничтожаем предыдущую версию сборки
unlink('app.phar');
}
// Cоздаем phar-архив
$phar = new Phar('app.phar', 0, 'app.phar');
// Используем компрессию gzip
$phar->compressFiles(Phar::GZ);
// Используем подпись
$phar->setSignatureAlgorithm (Phar::SHA1);
$files = array();
// Назначаем первым файлом файл из корневой директории проекта
$files['bootstrap.php'] = './bootstrap.php';
// Далее включаем все файлы, исключая директории /log и /script и собственно сам файл создания
$rd = new RecursiveIteratorIterator(new RecursiveDirectoryIterator('.'));
foreach($rd as $file){
if ($file->getFilename() != '..' && $file->getFilename() != '.' && $file->getFilename() != __FILE__)
{
if ( $file->getPath() != './log'&& $file->getPath() != './script'&& $file->getPath() != '.')
// Включаем все остальные файлы, включая файлы конфигураций
$files[substr($file->getPath().DIRECTORY_SEPARATOR.$file->getFilename(),2)]=$file->getPath().DIRECTORY_SEPARATOR.$file->getFilename();
}
}
// Если задана версия сборки в качестве параметра, то определяем константу VER
if(isset($opt['version'])) {
// Далее это может понадобиться для мониторинга или передачи клиентскому скрипту
$version = $opt['version'];
$file = "buildFromIterator(new ArrayIterator($files));
// Объявляем файл запуска (аналог функции main())
$phar->setStub($phar->createDefaultStub('bootstrap.php'));
$phar = null;
#php app.phar
-----------------------------------------------------------------------------------------------------------------
От Google до Goldman Sachs. Ищем работу своей мечты за рубежом. Часть 3
Игорь Савчук
struct foo {
char a;
char* b;
};
-----------------------------------------------------------------------------------------------------------------
Работа с протоколами TCP/IP в Linux
Игорь Штомпель
$ sudo apt-get install iproute-doc
$ sudo apt-get install traceroute
$ sudo apt-get install iptraf
$ ip link
ip [OPTIONS] OBJECT {COMMAND | help}
$ ip l
ip link show dev eth0
ip l sh dev eth0
ip link show eth0
ip l sh eth0
$ sudo ip link set eth0 up
$ sudo ip l s up eth0
$ sudo ip link set eth0 down
$ sudo ip l s down eth0
$ ip link set address 00:12:34:56:78:90 eth0
$ ip l s adderess 00:12:34:56:78:90 eth0
$ sudo ip link set mtu 1400 eth0
$ sudo ip l s mtu 1400 eth0
$ ifconfig
$ ifconfig eth0
$ sudo ifconfig eth0 down
$ sudo ifconfig eth0 up
$ ifconfig eth0 hw ether 00:12:34:56:78:90
$ ip address show
$ ip addr sh
$ ip address show eth0
$ ip addr sh eth0
$ sudo ip address add 192.168.0.2/24 dev eth0
$ sudo ip addr add 192.168.0.2/24 dev eth0
$ sudo ip address del 192.168.0.2/24 dev eth0
$ ifconfig
$ ifconfig eth0
$ sudo ifconfig eth0 inet up 192.168.0.2 netmask 255.255.255.0
//отключаем сетевой интерфейс
$ sudo ifconfig eth0 down
//удаляем ip-адрес и маску подсети
$ sudo ifconfig eth0 del 192.168.0.2 255.255.255.0
//включаем сетевой интерфейс
$ sudo ifconfig eth0 up
$ ip neigh show
$ ip n sh
$ ip neigh show dev eth0
$ ip n sh dev eth0
$ sudo ip neigh add 192.168.0.2 lladdr 00:12:34:56:78:90 dev eth0
$ sudo ip n add 192.168.0.2 lladdr 00:12:34:56:78:90 dev eth0
$ sudo ip neigh del 192.168.0.2 dev eth0
$ sudo ip n sh del 192.168.0.2 dev eth0
$ arp
$ arp -i eth0
$ sudo arp -s 192.168.0.2 00:12:34:56:78:90
$ sudo arp -d 192.168.0.2
$ ip route show
$ ip r sh
$ sudo ip route add default via 192.168.0.1
$ sudo ip r add default via 192.168.0.1
$ sudo ip route add 192.168.0.2/24 via 192.168.0.1
$ sudo ip r add 192.168.0.2/24 via 192.168.0.1
$ sudo ip route del 192.168.0.2/24
$ sudo ip r del 192.168.0.2/24
$ route
$ route add default gw 192.168.0.1
$ sudo route add -net 192.168.0.2 netmask 255.255.255.0 gw 192.168.0.1
$ route del -net 192.168.0.2 netmask 255.255.255.0
$ ping -c 10 www.samag.ru
$ ping -s 1000 www.samag.ru
$ traceroute www.samag.ru
$ tracepath www.samag.ru
$ tracepath www.samag.ru/21
$ less /etc/services
$ ss -4antu
$ netstat -4antu
$ ss -4antul
$ ss -p
$ netstat -a
$ netstat -s
$ netstat -i
$ netstat -P
$ sudo iptraf
-----------------------------------------------------------------------------------------------------------------
Представление чисел в памяти ЭВМ. Часть 2. Числа с плавающей точкой/запятой по стандарту IEEE754. Продолжение
Павел Закляков
$ cat next_float.c
#include
#include
// Этот код будет работать только на архитектуре с 32-битным int.
int main (int argc, char *argv[])
{
float a;
if (argc>=2)
{
a=strtof(argv[1],NULL);
printf("Исходное число: %f=%e\n",a,a);
int n = *((int*) &a);
float b = *((float*)&(++n));
double diff=(double)b-(double)a;
printf("После %e следующее число: %e, разница (%e)\n", a, b, diff);
return 0;
} else
{ printf ("Передайте число через параметр командной строки.\n");
return 1;
}
}
$ g++ next_float.c &&./a.out 0.5
$ cat bits_to_float.c
#include
#include
#include
void PrintHexNByte(const void * pnt, int n) {
unsigned short int i;
char *a;
for (i=0;i> 24,
(a & 0x00ff0000) >> 16,
(a & 0x0000ff00) >> 8,
(a & 0x000000ff));
printf("В памяти ЭВМ\n");
PrintHexNByte(&a,sizeof(int));
float f = *((float*)&(a));
printf("Число float= %e\n", f);
printf("Число float= %e\n", a);
return 0;
}
}
$ g++ bits_to_float.c && ./a.out 1 00000000 00000000000000000000001
$ g++ bits_to_float.c && ./a.out 0 11111110 11111111111111111111111
yum install gcc
aptitude install gcc
$ cat float_max.c
#include
#include
// ISO C Standard: 5.2.4.2.2 Characteristics of floating types
void main (void)
{
printf("max float: %f\n",FLT_MAX);
//printf("max double: %f\n",DBL_MAX);
//printf("max long double: %f\n",LDBL_MAX);
}
$ gcc float_max.c &&./a.out
$ cat float_inf.c
#include
#include
void main (int argc, char *argv[])
{
float a;
if (argc>=2)
{
a=strtof(argv[1],NULL);
a=1/(2-a);
printf("Число: %f\n",a);
} else
{ printf ("Введите число вторым параметром.\n"); }
}
[sapsan@linux4 ieee754]$ gcc float_inf.c && ./a.out 1.35
-----------------------------------------------------------------------------------------------------------------