идеальный htaccess

Попытка номер раз создать почти идеальный htaccess

  • Tutorial
    - Google выше ранжирует сайты, которые загружаются быстрее.
    - Если на eBay или Amazone увеличить время загрузки страниц на 9% они теряют 1% прибыли.
    - Сделать свой сайт быстрее, чтобы сэкономить на клиентском трафике и на числе обращений к серверу.

.htaccess — наш герой

Профессионалы знают, что такое htaccess.
Тем кто собираются уйти с народ.ру на php-хостинг только предстоит узнать, что это такое.
Те кто только что установил свои первые jooml’у или wordpress срочно должны узнать о нашем герое — htaccess

Зачем нам .htaccess ?

Представьте, что вы купили себе хостинг и кажется, почти обрели счастье. Но однажды (а может быть дважды, а может и трижды) ваш сайт перестает отвечать на запросы. Начинает медленно грузиться и вообще вести себя странно. А виртуальный хостинг это такая хитрая штука, что помимо вашего сайта на этом сервере находится ещё два десятка других сайтов. Все они разные по мощности, организованности и трафику. И когда ваш сосед по случайности, а может и умыслу запускает на своем хостинге сложные или избыточные в алгоритмах скрипты, это отзывается и на вас.

Или другой пример. Скажем ваш ресурс начинает набирать популярность, но переезжать на выделенный сервер ещё рано, а мощностей VPS уже не хватает. Вас очень может выручить htaccess.

А ещё htaccess может решить некоторые вопросы с безопасностью вашего сайта.

А ещё…

Хочу идеальный .htaccess !

Оказывается в интернете много различной противоречивой информации относительно того как использовать .htaccess. Пришлось долго и нудно экспериментировать, чтобы понять что истинно, а что ложно. В большинстве случаев авторы советов в своих блогах забывают упомянуть, что для работы определенных условий нужен тот или иной модуль Апача.
Впрочем хватит слов, пора к делу. Попробуем создать почти идеальный .htaccess

1. Первой строкой задаем основные опции:

Options All -ExecCGI -Indexes -Includes +FollowSymLinks

Использовать опции очень удобно, когда у вас нет доступа к конфигурированию Апача или нужны разные настройки Апача для разных сайтов на одном сервере.

Опция -ExecCGI запрещает запуск CGI скриптов. Лучше разрешить только для конкретных папок. Повысит безопасность.
Опция -Indexes запрещает показывать содержимое каталогов, если в них нет индексного файла. На виртуальном хостинге обычно включена по умолчанию. Изменив минус на плюс +Indexes можете наоборот разрешить просмотр содержимого каталога (или каталогов).
Опция -Includes запрещает SSI. Если не знаете, что это — запрещайте (Можно поЯндексировать(!) по запросу Server Side Include если хотите узнать об этом побольше). Можно использовать опцию IncludesNOEXEC, которая разрешит использовать SSI без запуска скриптов.
Опция +FollowSymLinks позволяет использовать символические ссылки на файлы или каталоги, не находящиеся в пределах корня вашего сайта.

Примечание
Пример

2. Немного SEO (куда же без него)

<IfModule mod_rewrite.c>
	RewriteEngine on
	RewriteBase /
	RewriteCond %{HTTP_HOST} ^black-web
	RewriteRule (.*) http://www.black-web.ru/$1 [R=301,L]
	RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/
	RewriteRule ^index\.php$ http://www.black-web.ru/ [R=301,L]
</IfModule>

Обязательно не забыть про условие <IfModule mod_rewrite.c>. Не окажись у хостера данного модуля и ваш сайт станет выдавать 500-ую ошибку. Данный конкретный модуль входить в сборку Апача по-умолчанию. Ну а вдруг… Хостеры и их админы бывают всякие.

В данной части пользы больше для SEO. Модуль rewrite как следует из его названия занимается перенаправлениями (привет Кэпу).

В этой части файла мы указали две склейки: мы склеили ваш_сайт и www.ваш_сайт Даже если пользователь наберет ваш сайт без WWW его перебросить 301 редериктом на www.ваш_сайт.
А также мы избавились /index.php в строке запроса. Если пользователь наберет www.ваш_сайт/index.phpего перебросит (снова 301 редериктом) на www.ваш_сайт.
Теперь поисковики не будут путаться между www и не будут дублировать главную страницу в результатах индексирования вашего сайта. Гуглим СЕО склейки домена, если не понимаете зачем это нужно.

3. Кто в папке главный?

Если у вас папке есть файлы index.html и index.php (не знаю, зачем и кому такое было нужно, но не раз видел такое) то как указать серверу кто их них более индексный?

DirectoryIndex index.php

А ещё можно там указать скажем roosso.php и тогда набрав в строке запроса адрес сайт.бла/бла/бла/ вы увидете не index, а roosso

4. Ещё настройки…

<IfModule mod_setenvif.c>
	SetEnv TZ Europe/Moscow
</IfModule>
ServerSignature Off
AddDefaultCharset UTF-8

Первая строчка устанавливает часовой пояс. Например в Apache 2.22.22 был баг связанный с этой опцией. Функции времени в php не работали, пока не установишь часовой пояс.

Вторая строка это подпись сервера. Вы их не раз видели на всяких системных страницах типа 500ой ошибки или 403ей. Обычно там какая-нибудь техническая информация и почта вебмастера. Я предпочитаю даже в таких мелочах скрывать данные о софте на сервере. Коллеги параноики меня поддержат.

Угадайте, что делает третья строка?

5. Когда нет доступа к php.ini

С помощью .htaccess мы также можем управлять рядом настроек PHP. На виртуальном хостинге, как правило, нет возможности изменять настройки php.ini. Чаще всего этого и не требуется. Но все же есть ряд опций контроль над которыми может нам быть полезен. Например, увеличить лимит на загрузку файлов, или лимит передачи данным методом POST.

<ifModule mod_php.c>
  php_value	upload_max_filesize	32M
  php_value	post_max_size		10M
  php_value	default_charset utf-8
  php_value	max_execution_time 200
</ifModule>

Первая строчка разрешить загружать файлы размером до 32 Мегабайт. По умолчанию в php обычно это значение 8 или 16 мегабайт.
Второй строкой разрешаем постинг объемом до 10 мегабайт. По умолчанию это значение обычно 2 Мегабайта.
Третья строка устанавливает кодировку по используемую вашими скриптами. По своей сути она дублирует строку: «AddDefaultCharset UTF-8». Но я чаще прибегаю к установке кодировки именно через php.
Четвертой строкой изменяем лимит времени выделенный на выполнение скрипта. По умолчанию он обычно равен 30 секундам. Но иногда для выполнения каких нибудь сложных обработок требуется больше времени.

6. Типы файлов. Ловкость рук и ни какого мошенничества.

В моей практике случалось пару раз, что после какого либо обновления провайдером софта, слетали типы файлов. Хотя такое редко. За 10 лет, всего два случая. Но иногда мне нужно было заставить html работать как php. А иногда требуется научить апач различать типы файлов, которые ему неизвестно. (Как оказалось Апачу вообще мало что известно из редких типов файлов.) В такой ситуации нас спасет следующий код:

AddHandler application/x-httpd-php .html
AddHandler cgi-script .pl .py .jsp .asp .htm .shtml .sh .cgi
AddType application/x-javascript .js
AddType text/css .css
AddType text/xml .xml
AddType application/octet-stream .doc .mov .avi .pdf .xls 
# ForceType application/x-httpd-php

Первая строчка позволит нашим php файлам иметь расширение html, но выполняться как php. Полезно бывает во многих случаях. А в старые добрые когда поисковики индексировали ЧПУ лучше, такая строчка всегда приходила на выручку.
Мы можем переназначить, добавить или подменить любые типы файлов под удобные нам разрешения.

Интересный трюк

Второй строкой указано, какие расширения файлов должны выполняться как cgi скрипты.

Третья, четвертая и пятая строки, на всякий случай уточняют мим-тип файлов с разрешением css, js, xml. Не путайте с присвоением заголовка в ответе сервера на запрос, как это сделано в первых двух строках.

Шестая строчка это участка, нужна если на вашем сайте есть скачиваемый для пользователей контент. Если добавить эту строку, то при обращении к данным файлам им будет предлагаться скачать их на компьютер, а не как это сейчас в современным браузерах куча плагинов, которые даже word открывают в браузере.

Седьмую строку я закомментировал. Это строчка в принудительно-добровольном порядке, будет все файлы с вашего сервера запустить как php. Её лучше использовать лишь в отдельных папках, при необходимости.

7. Знают взрослые и дети, что архивы меньше весят…

Полезно, когда ваши страницы загружаются быстрее. Поэтому люди и придумали архивировать файлы. А потом они ещё подумали и решили, что архивировать можно и страницы на сайтах и картинки. Причем делать это незаметно для пользователя, но существенно снижать трафик и ускорять загрузку страниц. Волшебные слова прозвучали, теперь обсудим, как это можно сделать.

У Апача есть два модуля сжатия. Оба не являются модулями по умолчанию, поэтому необязательно могут присутствовать у вашего провайдера. Но как показала практика у 99% провайдеров один из них стоит. Наиболее распространен mod_deflate. Чтобы его с помощью сжимать весь контент на вашем сайте добавьте в .htaccess следующие строки:

<ifModule mod_deflate.c>
	AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml application/xhtml+xml text/css text/javascript application/javascript application/x-javascript
</ifModule>

Как видите мы должны перечислить mime type файлов, которые следует подвергать сжатию. Сюда можно добавить и видео и картинки, но толку это даст мало. Потому что jpeg или gif уже сами по себе являются сжатыми форматами. Также как avi или flv. Вы фактически нечего не выиграете указав их.

Второй менее популярный модуль это mod_gzip, Чтобы включить сжатие с его помощью добавьте вот такие строчки:

<IfModule mod_gzip.c>
	mod_gzip_on         Yes
	mod_gzip_dechunk    Yes
	mod_gzip_item_include file		\.(html?|txt|css|js|php|pl)$
	mod_gzip_item_include mime		^text\.*
	mod_gzip_item_include mime		^application/x-javascript.*
	mod_gzip_item_exclude mime		^image\.*
	mod_gzip_item_exclude rspheader	^Content-Encoding:.*gzip.*
</IfModule>

Данный модуль умеет работать с масками, что несомненно большой плюс. Да и синтаксис у него куда более гибкий чем у предыдущего. Но используют его реже. А по сжатию я даже не берусь судить, который из модулей лучше. Я сильной разницы не заметил при тестах.

8. А ещё быстрее можно?

Можно. Если применить кеширование страниц. У кеширования есть и плюсы и минусы, поэтому подходить к этому вопросу надо подготовившись. Для динамически обновляющегося сайт каждый 2-3 минуты, например популярного форума, нужно учесть, что пользователь должен видеть актуальную информацию. Но у любого сайт есть контент, который более или менее статичен. Например те же картинки, или файлы стилей. Поэтому нам потребуется по разному использовать кеширование различного содержимого на сайте. В html разметки мы всегда можем использовать meta теги. И через php мы может устанавливать заголовки ответа сервера. Остается вопрос, как быть с css, js, image и т.д. и т.п.

Помочь нам в этом могут два модуля: mod_headers и mod_expires которые могут установить заголовки в ответ сервера и подсказать вашему браузеру, что и как нужно кешировать. Один из модулей обычно стоит у провайдера, но как и в случае с любым модулем, который не входит в стандартную сборку Апача, 100% гарантии никто вам не даст. Поэтому снова во избежание 500й ошибки указывает условия для каждого из модулей.

<ifModule mod_headers.c>
	#кэшировать html и htm файлы на один день
	<FilesMatch "\.(html|htm)$">
		Header set Cache-Control "max-age=43200"
	</FilesMatch>
	#кэшировать css, javascript и текстовые файлы на одну неделю
	<FilesMatch "\.(js|css|txt)$">
		Header set Cache-Control "max-age=604800"
	</FilesMatch>
	#кэшировать флэш и изображения на месяц
	<FilesMatch "\.(flv|swf|ico|gif|jpg|jpeg|png)$">
		Header set Cache-Control "max-age=2592000"
	</FilesMatch>
	#отключить кэширование
	<FilesMatch "\.(pl|php|cgi|spl|scgi|fcgi)$">
		Header unset Cache-Control
	</FilesMatch>
</IfModule>

Вот такой синтаксис у mod_headers. Думаю по комментариям ясно что к чему.
В данной секции я отключил кеширование php файлов. Хотя по моему мнению небольшой временной интервал кеширования им не повредит. 5-30 секунд, это интервал времени, за который мало что меняется. А многие пользователи любят пользоваться клавишей back (вернуться назад). Чтобы не загружать им страницу второй раз, а подхватить её из кеша, разумный интервал кеширования все же уместен.

Во второй секции где идут условия для mod_expires я именно так и делаю — для php ставлю небольшой интервал кеширования.

<ifModule mod_expires.c>
	ExpiresActive On
	#по умолчанию кеш в 5 секунд
	ExpiresDefault "access plus 5 seconds"
	#кэшировать флэш и изображения на месяц
	ExpiresByType image/x-icon "access plus 2592000 seconds"
	ExpiresByType image/jpeg "access plus 2592000 seconds"
	ExpiresByType image/png "access plus 2592000 seconds"
	ExpiresByType image/gif "access plus 2592000 seconds"
	ExpiresByType application/x-shockwave-flash "access plus 2592000 seconds"
	#кэшировать css, javascript и текстовые файлы на одну неделю
	ExpiresByType text/css "access plus 604800 seconds"
	ExpiresByType text/javascript "access plus 604800 seconds"
	ExpiresByType application/javascript "access plus 604800 seconds"
	ExpiresByType application/x-javascript "access plus 604800 seconds"
	#кэшировать html и htm файлы на один день
	ExpiresByType text/html "access plus 43200 seconds"
	#кэшировать xml файлы на десять минут
	ExpiresByType application/xhtml+xml "access plus 600 seconds"
</ifModule>

9. Правила вежливого тона…

В процессе модернизации своего сайта, мы часто оставляем хвосты ввиде ссылок, которые ведут на страницы, которые мы удалили. Иногда такие ссылки идут с других сайтов или из поисковых систем. Чтобы не терять пользователей вежливым тоном считается иметь собственные страницы для различного типа ошибок. Включая даже ошибки сервера. Например стандартное сообщение о 500й ошибки очень скучное и мрачное, и вряд ли вызовет у пользователя желание посетить вашу страницу ещё раз. Но в htaccess есть приемы, которые могут сделать даже эту страницу приветливей.

# Bad Rquest
ErrorDocument 400 /400.html
# Authorization Required
ErrorDocument 401 /401.html
# Forbidden
ErrorDocument 403 /403.html
# Not found
ErrorDocument 404 /404.html
# Method Not Allowed
ErrorDocument 405 /405.html
# Request Timed Out
ErrorDocument 408 /408.html
# Request URI Too Long
ErrorDocument 414 /414.html
# Internal Server Error
ErrorDocument 500 /500.html
# Not Implemented
ErrorDocument 501 /501.html
# Bad Gateway 
ErrorDocument 502 /502.html
# Service Unavailable 
ErrorDocument 503 /503.html
# Gateway Timeout
ErrorDocument 504 /504.html

Для 400-х ошибок можно использовать и динамические страницы на php. А вот для 500 лучше сделать на html и js. Это часть ошибок обычно связана с ошибками сервера (в большинстве случаев) и php или cgi как правило в такой ситуации не работают.

Если вам лень делать столько страниц устанавливайте страницей ошибок главную страницу своего сайта или карту сайта.

Все это вы делаете исключительно для людей. Поисковым роботам плевать на то есть у вас страницы ошибок или нет. Они видят ответ сервера с кодом ошибки и блокируют вашу страницу в поиск. Так что имейте ввиду, это не панацея. Это лишь вежливость к вашей аудитории и имидж вашего сайта.

10. Подведем итог

Знатоки понимают, что в этой статье описано далеко не все. Я коснулся здесь лишь поверхности «айсберга». На самом деле возможности .htaccess куда много обширней, чем описано в статье. Но я и не преследовал целью перевести манаул по htaccess на русский язык. Всего чего я хотел это создать небольшой костяк файла .htaccess для тех, кто только приступил к изучению данного вопроса, чтобы сэкономить их время на поисках информации по сети.

В результате всех манипуляций у нас должен был получить файл следующего содержания:

Options All -ExecCGI -Indexes -Includes +FollowSymLinks

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteBase /
    RewriteCond %{HTTP_HOST} ^black-web
    RewriteRule (.*) http://www.black-web.ru/$1 [R=301,L]
    RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/
    RewriteRule ^index\.php$ http://www.black-web.ru/ [R=301,L]
</IfModule>

DirectoryIndex index.php

<IfModule mod_setenvif.c>
	SetEnv TZ Europe/Moscow
</IfModule>
ServerSignature Off
#AddDefaultCharset UTF-8
<ifModule mod_php.c>
	php_value	upload_max_filesize	32M
	php_value	post_max_size		10M
	php_value	default_charset utf-8
	php_value	max_execution_time 200
</ifModule>
AddHandler application/x-httpd-php .html
AddHandler cgi-script .pl .py .jsp .asp .htm .shtml .sh .cgi
AddType application/x-javascript .js
AddType text/css .css
AddType text/xml .xml
AddType application/octet-stream .doc .mov .avi .pdf .xls 
# ForceType application/x-httpd-php

<ifModule mod_deflate.c>
    AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml application/xhtml+xml text/css text/javascript application/javascript application/x-javascript
</ifModule>

<IfModule mod_gzip.c>
    mod_gzip_on         Yes
    mod_gzip_dechunk    Yes
    mod_gzip_item_include file		\.(html?|txt|css|js|php|pl)$
    mod_gzip_item_include mime		^text\.*
    mod_gzip_item_include mime		^application/x-javascript.*
    mod_gzip_item_exclude mime		^image\.*
    mod_gzip_item_exclude rspheader	^Content-Encoding:.*gzip.*
</IfModule>

<ifModule mod_headers.c>
    #кэшировать html и htm файлы на один день
    <FilesMatch "\.(html|htm)$">
        Header set Cache-Control "max-age=43200"
    </FilesMatch>
    #кэшировать css, javascript и текстовые файлы на одну неделю
    <FilesMatch "\.(js|css|txt)$">
        Header set Cache-Control "max-age=604800"
    </FilesMatch>
    #кэшировать флэш и изображения на месяц
    <FilesMatch "\.(flv|swf|ico|gif|jpg|jpeg|png)$">
        Header set Cache-Control "max-age=2592000"
    </FilesMatch>
    #отключить кэширование
    <FilesMatch "\.(pl|php|cgi|spl|scgi|fcgi)$">
        Header unset Cache-Control
    </FilesMatch>
</IfModule>

<ifModule mod_expires.c>
    ExpiresActive On
    #по умолчанию кеш в 5 секунд
    ExpiresDefault "access plus 5 seconds"
    #кэшировать флэш и изображения на месяц
    ExpiresByType image/x-icon "access plus 2592000 seconds"
    ExpiresByType image/jpeg "access plus 2592000 seconds"
    ExpiresByType image/png "access plus 2592000 seconds"
    ExpiresByType image/gif "access plus 2592000 seconds"
    ExpiresByType application/x-shockwave-flash "access plus 2592000 seconds"
    #кэшировать css, javascript и текстовые файлы на одну неделю
    ExpiresByType text/css "access plus 604800 seconds"
    ExpiresByType text/javascript "access plus 604800 seconds"
    ExpiresByType application/javascript "access plus 604800 seconds"
    ExpiresByType application/x-javascript "access plus 604800 seconds"
    #кэшировать html и htm файлы на один день
    ExpiresByType text/html "access plus 43200 seconds"
    #кэшировать xml файлы на десять минут
    ExpiresByType application/xhtml+xml "access plus 600 seconds"
</ifModule>

# Bad Rquest
ErrorDocument 400 /400.html
# Authorization Required
ErrorDocument 401 /401.html
# Forbidden
ErrorDocument 403 /403.html
# Not found
ErrorDocument 404 /404.html
# Method Not Allowed
ErrorDocument 405 /405.html
# Request Timed Out
ErrorDocument 408 /408.html
# Request URI Too Long
ErrorDocument 414 /414.html
# Internal Server Error
ErrorDocument 500 /500.html
# Not Implemented
ErrorDocument 501 /501.html
# Bad Gateway 
ErrorDocument 502 /502.html
# Service Unavailable 
ErrorDocument 503 /503.html
# Gateway Timeout
ErrorDocument 504 /504.html

11. Послесловие.

Я старался не спешить в написании статьи и на это ушли почти сутки. Но все же где то я мог допустить ошибки в орфографии или пунктуации. Прошу не казнить, а миловать. А лучше писать в личку, чтобы я поправил ошибки.

И напоследок для любителей экспериментов несколько строк .htaccess. Сужу по своему опыту — на практике знания усваиваются лучше чем в теории.

Разные интересные примеры

# SECURE ____________________
<IfModule mod_ssl.c>
	SSLOptions +StrictRequire
	SSLRequireSSL
	SSLRequire %{HTTP_HOST} eq "black-web.ru"
</IfModule>
<IfModule mod_rewrite.c>
	RewriteCond %{HTTPS} !on
	RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
</IfModule>

# HOTLINKING ________________
<IfModule mod_rewrite.c>
	RewriteCond %{HTTP_REFERER} !^$
	RewriteCond %{HTTP_REFERER} !^http://([ -a-z0-9]  \.)?black-web\.ru [NC]
	RewriteRule \.(gif|jpe?g|png)$ - [F,NC,L]
</IfModule>

# REDIRICT __________________
Redirect 301 /index.html /index.php
<IfModule mod_rewrite.c>
	RewriteRule ^news/([^/\.]+)/?$ news.php?news=$1 [L]
	RewriteRule ^(.*\.((js)|(css)))$ plugin/GzipFile.php?file=$1
	RewriteRule \.css$ plugin/GzipFile.php?file=$1
	RewriteRule \.js$ plugin/GzipFile.php?file=$1
</IfModule>
RedirectMatch 301 /blog(.*) http://www.black-web.ru/$1

Настройка .htaccess

Настройка .htaccess. Полное руководство

08.06.2011

настройка htaccess

Сегодня я хочу рассказать о htaccess, файле, который позволяет настраивать веб-сервер Apache. Директивы, которые прописываются в этом файле напрямую влияют на выдачу, которую формирует веб-сервер. Инструмент этот достаточно мощный, использовать его нужно с умом. Статья эта написана больше полугода назад, теперь я снова к ней возвращаюсь, чтобы сделать самым подробным мануалом на эту тему.

Сразу напомню, прежде чем что либо менять в htaccess — сделайте копию вашего рабочего файла в укромное место. Мало ли, резервное копирование вообще хорошая вещь, не забывайте об этом. Я разделю статью на несколько подразделов — перенаправление страниц, запрет доступа к определенным файлам, ускорение сайта и прочие штуки, которые так или иначе могут пригодиться в работе ресурса.

Для начала — пару слов, что такое htaccess? Процитирую официальный сайт веб-сервера Apache:

.htaccess файлы (или «распределенные конфигурационные файлы») позволяют задавать большое количество дополнительных параметров и разрешений для работы веб-сервера в отдельных каталогах (папках), таких как управляемый доступ к каталогам, переназначение типов файлов и т. д, без изменения главного конфигурационного файла.

То есть, мы можем управлять поведением сервера в каждой, отдельно взятой папке, что очень удобно.


Директивы htaccess. Перенаправление

Блокируем хотлинки с других сайтов

Есть нехорошие товарищи, которые могут использовать картинки с вашего ресурса для использования в своих проектах. Они используют ваши изображения на своих сайтах, другими словами, используют вашу пропускную способность в своих целях, по аналогии с перемещением изображений на поддомен. Будем с ними бороться… Заменим любую картинку, на которую ведет хотлинк с другого сайта, на какое-нибудь предупреждающее изображение или на что хватит фантазии. В коде не забывайте менять адреса на ваши URL.

1
2
3
4
5
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?ваш-урл\.com/ [NC]
RewriteCond %{HTTP_REFERER} !^$
#Замените путь к картинке
RewriteRule .*\.(jpe?g|gif|bmp|png)$ /images/noHL.jpg [L]

Перенаправим RSS фиды WordPress на Feedburner

Я не думаю, что кто-то пользуется чем-то другим, отличным от Feedburner. Удобно для пользователя, удобно для владельца блога, статистика, опять же. Если вы еще не используете — крайне рекомендую. Код ниже перенаправит все ваши RSS потоки на ваш аккаунт, не забывайте только вставить нужный адрес.

1
2
RedirectMatch 301 /feed/(atom|rdf|rss|rss2)/?$
RedirectMatch 301 /comments/feed/(atom|rdf|rss|rss2)/?$ http://feedburner.com/yourfeed/

В этом примере идет перенаправление двух потоков: основного RSS и обновление комментариев, если посетитель подписан на обновления.

Изменим страницы ошибок

С хостингом и сайтом случается всякое, поэтому заранее нужно быть готовым к проблемам и сделать свои страницы ошибок. А пользователи в случае проблем будут перенаправлены на соответствующую страницу. На этих страницах можно дать краткую информацию для пользователя, почему такое случилось. Контакты свои оставить, в крайнем случае.

1
2
3
4
5
6
ErrorDocument 400 /errors/badrequest.html
ErrorDocument 401 /errors/authreqd.html
ErrorDocument 403 /errors/forbid.html
ErrorDocument 404 /errors/404.html
ErrorDocument 500 /errors/serverr.html
#Замените /errors/*.html на путь к вашим страницам ошибок

В этом примере идет перенаправление в случае основных ошибок. 404 я тоже добавил, хотя CMS обычно отрабатывают такие моменты, но бывали случаи.

301 и 302 редирект или перенаправление

301 редирект или, так называемое постоянное перенаправление — говорит о том, что страница поменяла адрес или URL и перенаправляет на новую страницу. Если у вас на сайте была проиндексированная ПС страница, а вы поменяли ее адрес — в обязательном порядке сделайте 301 редирект на новую страницу. При 301 редиректе старая страница не индексируется, а вместо нее «подставляется» новая.

1
2
RewriteEngine on
Redirect 301 /old-page http://ваш-урл.ру/new-page

Собственно, похожий пример внимательный читатель увидит выше, в случае перенаправления RSS. Да, технология та же.
Бывает так, что сайт переезжает на новый домен, нужно сохранить структуру ссылок, а их могут быть сотни и тысячи, на каждую установить перенаправление нереально. Код ниже поможет разобраться с такой ситуацией:

1
2
3
Options +FollowSymLinks
RewriteEngine on
RewriteRule (.*)  [R=301,L]

Есть интересная методика «скрытия» внешних ссылок путем 301 редиректа. Допустим, у вас есть «сквозная» ссылка в сайдбаре, которая ведет на ваш профиль в Google+, она внешняя, то есть ведет на внешний ресурс. Для SEO очень хорошо, когда таких ссылок как можно меньше. Можно спрятать их и сделать внутренними.

Технология производства внутренних ссылок из внешних:

  • ставим ссылку на мнимую страницу, допустим gering111.com/google-plus
  • настраиваем 301 редирект в htaccess с этой страницы на реальную страницу вашего профиля
  • посетитель ничего не чувствует, ПС довольны

Подобным образом можно ставить любые другие условно постоянные ссылки.
302 редирект или временное перенаправление говорит ПС, что страница перемещена временно, поэтому индексировать нужно обе страницы, старую и новую.

1
2
RewriteEngine on
Redirect 302 /old-page http://ваш-урл.ру/new-page

Код абсолютно такой же, как в случае с постоянным перенаправлением.
302 редирект удобно использовать, когда проводятся какие-либо долгосрочные работы на сайте и не нужно показывать посетителям «поломанные» страницы. В таком случае вам поможет этот код:

1
2
3
4
RewriteEngine on
RewriteCond %{REQUEST_URI} !/inside.html$
RewriteCond %{REMOTE_ADDR} !^123.123.123.123
RewriteRule $ /inside.html [R=302,L]

Склеиваем сайты с www и без него

Очень плохо, когда сайт доступен по двум адресам, ПС это очень не любят. Склеить это в один адрес поможет код ниже:

1
2
3
4
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.ваш-урл\.com$ [NC]
RewriteRule ^(.*)$ http://ваш-урл.com/$1 [R=301,L]

В этом примере — главное зеркало это адрес без www. Если необходимо сделать наоборот — поменяйте www местами, сверху уберите, внизу добавьте.

Показ страниц в зависимости от IP

1
2
3
SetEnvIf REMOTE_ADDR 192.168.0.1 REDIR=&amp;quot;redir&amp;quot;
RewriteCond %{REDIR} redir
RewriteRule ^/$ /about.html

Добавлять адреса можно дублированием первой строки, в последней — меняется страница для перенаправления.

Перенаправляем на главную

Перенаправление со страниц site.com/index.php и site.com/index.html на страницу site.com/. За код спасибо Василию Красноженову.

1
2
3
4
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.html\ HTTP/
RewriteRule ^index\.html$ http://site.com [R=301,L]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/
RewriteRule ^index\.php$ http://site.com [R=301,L]

Директивы htaccess. Разделяем доступы

Запрет доступа к сайту

Бывает такое, что необходимо запретить доступ посетителям с определенного IP, спамерам или еще кому нехорошему.

1
2
3
Order Allow,Deny
Allow from all
Deny from 192.168.0.1

Добавлять IP в список можно просто добавляя последнюю строку и меняя там адрес на нужный.
Противоположная ситуация, когда всем нужно запретить, кроме некоторых IP, тогда используем такой код:

1
2
3
Order Deny,Allow
Deny from all
Allow from 192.168.0.1

Добавлять адреса аналогично предыдущему примеру.

Запрещаем просмотр нежелательным User-Agent

Каждый браузер или приложение, которое запрашивает страницу, так или иначе имеет идентификатор — User-Agent. Можно запретить просмотр нежелательным товарищам. Это могут быть как программы, сканирующие сайты, так и старые браузеры, от поддержки которых вы целиком отказались. Ситуации бывают разные.

1
2
3
4
5
6
7
SetEnvIfNoCase user-Agent ^FrontPage [NC,OR]
SetEnvIfNoCase user-Agent ^Java.* [NC,OR]
SetEnvIfNoCase user-Agent ^Microsoft.URL [NC,OR]
SetEnvIfNoCase user-Agent ^MSFrontPage [NC,OR]
Order Allow,Deny
Allow from all
Deny from env=bad_bot

Полный список известных User-Agent вы можете найти на сайте http://www.user-agents.org/

Запрещаем доступ к определенному файлу

В примере стоит запрет на доступ к файлам wp-config и htaccess, тем самым повышается уровень общей защиты. Очень нужная директива, рекомендую добавить в свои файлы

01
02
03
04
05
06
07
08
09
10
# защищаем wpconfig.php
&amp;lt;Files wp-config.php&amp;gt;
order allow,deny
deny from all
&amp;lt;/Files&amp;gt;
#защищаем htaccess
&amp;lt;Files .htaccess&amp;gt;
order allow,deny
deny from all
&amp;lt;/Files&amp;gt;

Аналогично можно защитить css и js файлы, которые используются плагинами:

1
2
3
4
&amp;lt;Files ~ &amp;quot;\.(js|css)$&amp;quot;&amp;gt;
order allow,deny
allow from all
&amp;lt;/Files&amp;gt;

Скачивание определенных типов файлов

Современные браузеры такие умные, что иногда становится страшно. Мой Хром иногда пытается внутри себя открывать для просмотра PDF файлы, иногда вешаясь насмерть. С помощью htaccess можно принудительно сказать браузеру, что делать с тем или иным типом файлов, не оставляя этот момент на его усмотрение. В данном случае это скачивание. Дополнительные типы файлов можно добавить по аналогии.

1
2
3
AddType application/octet-stream .pdf
AddType application/octet-stream .zip
AddType application/octet-stream .avi

Ограничение на доступ к админке WordPress

Если у вас постоянный IP адрес, можно только ему давать доступ к админ-панели WordPress

1
2
3
4
5
6
7
8
9
AuthUserFile /dev/null
AuthGroupFile /dev/null
AuthName &amp;quot;Example Access Control&amp;quot;
AuthType Basic
&amp;lt;LIMIT GET&amp;gt;
order allow, deny
deny from all
allow from Ваш IP
&amp;lt;/LIMIT&amp;gt;

Директивы htaccess. Техническая оптимизация и ускорение

Запрещаем автоматическое индексирование файлов

В каждой папке на сайте Apache создает, по умолчанию, индексные файлы, в которых перечисляется, какие файлы в папке находятся. Если вы не хотите давать дополнительную лазейку для злоумышленников — запретите индексирование.

1
Options -Indexes

Включаем gzip сжатие

Вы знаете о том, что данные на сервере можно сжать, а клиент их распакует у себя? Код ниже как раз включает такую штуку. Нужно только убедиться, что gzip разрешен на вашем хостинге, но обычно он есть.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
&amp;lt;FilesMatch &amp;quot;\.js.gz$&amp;quot;&amp;gt;
ForceType text/javascript
Header set Content-Encoding: gzip
&amp;lt;/FilesMatch&amp;gt;
&amp;lt;FilesMatch &amp;quot;\.css.gz$&amp;quot;&amp;gt;
ForceType text/css
Header set Content-Encoding: gzip
&amp;lt;/FilesMatch&amp;gt;
&amp;lt;FilesMatch &amp;quot;\.js$&amp;quot;&amp;gt;
ForceType text/javascript
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} !&amp;quot;.*Safari.*&amp;quot;
RewriteCond %{HTTP:Accept-Encoding} gzip
RewriteCond %{REQUEST_FILENAME}.gz -f
RewriteRule (.*)\.js$ $1\.js.gz [L]
ForceType text/javascript
&amp;lt;/FilesMatch&amp;gt;
&amp;lt;FilesMatch &amp;quot;\.css$&amp;quot;&amp;gt;
ForceType text/css
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} !&amp;quot;.*Safari.*&amp;quot;
RewriteCond %{HTTP:Accept-Encoding} gzip
RewriteCond %{REQUEST_FILENAME}.gz -f
RewriteRule (.*)\.css$ $1\.css.gz [L]
ForceType text/css
&amp;lt;/FilesMatch&amp;gt;

Код не работает для изображений, но к ним применять gzip не рекомендуется. Именно такой код установлен у меня.

Сжатие с применением mod_deflate

Ходят слухи, что с помощью этого мода сжимать данные лучше и сайт работает быстрее. Я не могу протестировать, да и не встречал в Интернете подобных тестов. Если у кого есть такая информация — буду благодарен. А код выложу, мало ли

1
2
3
4
5
&amp;lt;ifmodule mod_deflate.c=&amp;quot;&amp;quot;&amp;gt;
&amp;lt;filesmatch &amp;quot;.(js|css)$&amp;quot;=&amp;quot;&amp;quot;&amp;gt;
SetOutputFilter DEFLATE
&amp;lt;/filesmatch&amp;gt;
&amp;lt;/ifmodule&amp;gt;

Включаем кэширование браузера клиента

Интересная директива, которая позволяет использовать кэширование браузера. Указанные типы файлов записываются в кэш браузера и при повторном вызове будут грузиться оттуда, что существенно ускоряет общую скорость загрузки сайта и дает меньшую нагрузку на ваш хостинг.

01
02
03
04
05
06
07
08
09
10
11
12
Header append Cache-Control &amp;quot;private&amp;quot;
FileETag MTime Size
ExpiresActive On
ExpiresDefault &amp;quot;access plus 0 minutes&amp;quot;
ExpiresByType image/ico &amp;quot;access plus 1 years&amp;quot;
ExpiresByType text/css &amp;quot;access plus 1 years&amp;quot;
ExpiresByType text/javascript &amp;quot;access plus 1 years&amp;quot;
ExpiresByType image/gif &amp;quot;access plus 1 years&amp;quot;
ExpiresByType image/jpg &amp;quot;access plus 1 years&amp;quot;
ExpiresByType image/jpeg &amp;quot;access plus 1 years&amp;quot;
ExpiresByType image/bmp &amp;quot;access plus 1 years&amp;quot;
ExpiresByType image/png &amp;quot;access plus 1 years&amp;quot;

Указываем кодировку по умолчанию

WordPress работает с кодировкой UTF8 и делает это хорошо, но чтобы гарантированно избежать проблем с кодировкой — укажите ее принудительно, хуже не будет точно.

1
AddDefaultCharset UTF-8

Ограничиваем число подключений к сайту

Современные браузеры умеют создавать несколько одновременных подключений к серверу, отдающему сайт. Если же у вас маловато ресурсов, можно ограничить число подключений.

1
MaxClients &amp;lt;количество подключений&amp;gt;

При размещении в корневом каталоге, директива работает на весь сайт, если же положить ее в папку с файлами, которые вы отдаете на скачивание — можно ограничить скачивание в несколько потоков.

Разрешаем выполнение php внутри JavaScript

Иногда необходимо выполнить некоторый код внутри скрипта. Этот код поможет включить эту функцию

1
2
3
4
5
AddType application/x-httpd-php .js
AddHandler x-httpd-php5 .js
&amp;lt;filesmatch &amp;quot;\.(js|php)$&amp;quot;&amp;gt;
SetHandler application/x-httpd-php
&amp;lt;/filesmatch&amp;gt;

Вот и все, что касается htaccess и его стандартного использования. Я не стал упоминать о защите папок паролями, потому что не считаю это правильным, о «защите» от спама, путем блокировки запросов запросов без передачи Referer, потому что все современные спам-машины давно умеют это делать. Ну и прочие вещи, которые не считаю грамотно реализованными.

Напоследок хочу представить вам сервис тестирования вашего htaccess файла — http://htaccess.madewithlove.be/. Там все просто, удачного дня

Настойка DNS сервера BIND 9

Bog BOS: DNS сервер BIND

Требуется предварительное знакомство с материалом по архитектуре DNS.

BIND является самой распространенной реализацией сервера DNS. Разработка ведется Internet Software Consortium (ISC). Текущие версии (на 28 марта 2007) — BIND 9.4.0, BIND 9.3.4 (FC6 — 9.3.2/9.3.4), BIND 9.2.8 (поддержка до 1 августа 2007, RHEL4 — 9.2.4), BIND 8.4.7, BIND 4.9.11. Лицензия собственная, позволяет использовать продукт бесплатно или за плату (контракт на поддержку).

В комплекте с сервером BIND 9 поставляются утилиты DNS, клиентская библиотека DNS resolver, облегченная клиентская библиотека lightweight resolver и соответствующий ей демон lwresd, UDP/921 (по-моему, это очень вредная идея консорциума ISC, нарушающая принцип совместимости ПО).

В статье описываются:
Формат файла настройки

Файл настройки BIND 9 обычно называется /etc/named.conf (можно изменить при установке). Формат файла зоны стандартен и приведен в описании архитектуры DNS. Утилита named-checkzone проверяет синтаксис файла зоны. В качестве параметра указываются имя зоны и имя файла. Утилита named-checkconf проверяет синтаксис файла настройки. В качестве параметра можно указать имя файла.

Комментарии в файле настройки могут записываться в стиле C, C++ или sh. Строки и идентификаторы, не являющиеся доменными именами, например, имена файлов, обязательно заключать в кавычки.

Во многих местах файла настройки используется такая синтаксическая конструкция, как список-шаблонов-адресов: список через точку с запятой шаблонов адресов, завершающийся точкой с запятой. Шаблон адреса — это либо IP-адрес, либо IP-адрес с указанием числа бит в маске адреса (например, 192.168.0.0/28), либо имя ACL (т.е. ссылка на ранее определенный утверждением acl список-шаблонов-адресов, либо список-шаблонов-адресов в фигурных скобках, либо ключевое слово key с последующим именем ключа (определяется утверждением key). Имена рекомендуется заключать в кавычки. Перед шаблоном адреса может стоять символ отрицания (восклицательный знак). Ключи попали в эту конструкцию, потому что они тоже определяют права доступа, хотя и не имеют отношения к адресам хостов. Исходный адрес сравнивается последовательно с элементами списка до первого успешного соответствия. Если перед этим элементом списка стоит символ отрицания, то процесс завершается и сравнение со всем списком-шаблонов-адресов считается неудачным. Предопределены следующие имена ACL:

any (соответствует любой хост)
none (не соответствует никакой хост)
localhost (соответствует IPv4 адрес любого интерфейса хоста)
localnets (соответствует любой IPv4 адрес сети, к которой принадлежит любой интерфейс хоста)
Список-ключей — это список ключей через точку с запятой, завершающийся точкой с запятой.

Файл настройки состоит из утверждений, завершающихся точкой с запятой. Утверждение начинается с ключевого слова и может содержать блок предложений, заключенный в фигурные скобки. Предложение в блоке также завершается точкой с запятой, начинается с ключевого слова и может содержать блок. Утверждения обрабатываются последовательно. Предусматриваются следующие типы утверждений:

acl имя-acl { список-шаблонов-адресов }; (определяет именованный список-шаблонов-адресов)
controls { inet ip-адрес [port порт-TCP ] allow { список-шаблонов-адресов } keys { список-ключей }; … }; (каждое предложение inet определяет права доступа (адреса и ключи) к управляющему каналу rndc, открываемому по указанному адресу и номеру порта; номер порта по умолчанию — 953; вместо адреса можно указать символ «*» — IPv4 адрес любого интерфейса хоста)
include имя-файла; (содержимое указанного файла включается в текст файла настройки; очень удобно для включения текста ключей из файла, защищенного от чтения посторонними; может использоваться внутри view)
key идентификатор-ключа { algorithm hmac-md5; secret «секретная-строка-в-base-64»; }; (определяет ключ для аутентификации и авторизации: rndc и TSIG; определение ключа для TSIG можно описывать внутри утверждения view; использовать ключ можно в утверждениях server, controls и в списке-шаблонов-адресов)
logging (настройка журнализации; возможно только одно утверждение данного типа)
lwres (настройка сервера для выполнения функций демона lwresd)
options (глобальные опции и опции по умолчанию; возможно только одно утверждение данного типа)
server ip-адрес-удаленного-сервера { опция; … }; (позволяет конкретизировать значения некоторых опций для конкретного сервера)
trusted-keys — определение ключей DNSSEC
view — описание вида (точки зрения) на доменное пространство, различным клиентам может быть представлено различное видение на пространство доменных имен
zone — описание зоны
Утверждение options может содержать следующие предложения (не пугайтесь их количеству — большинство либо уже устарело, либо еще не реализовано :):

version «строка»; (по умолчанию — реальный номер версии; для отключения обработки надо использовать строку none, а лучше закрыть класс CHAOS из вида совсем, т.к. неизвестно о чем он ябедничает еще; сервер позволяет узнать номер версии с помощью запроса к встроенной псевдозоне bind класса CHAOS:
host -t txt -c CHAOS version.bind адрес-сервера
hostname hostname_string; (по умолчанию — gethostname(); для отключения обработки надо использовать строку none, а лучше закрыть класс CHAOS из вида совсем, т.к. неизвестно о чем он ябедничает еще; сервер позволяет узнать имя конкретного хоста из группы anycast с помощью запроса к встроенной псевдозоне bind класса CHAOS (на моем сервере не заработало, попытка указать hostname приводит к сообщению о неизвестной опции):
host -t txt -c CHAOS hostname.bind адрес-сервера
directory имя-каталога; (абсолютное имя рабочего каталога, все упоминаемые относительные имена файлов лежат в нем)
key-directory имя-каталога; (абсолютное имя каталога, в котором лежат публичные и частные ключи для безопасного изменения зон; отдельный каталог может потребоваться для увеличения безопасности)
named-xfer имя-файла; (устарело)
tkey-domain доменное-имя;
tkey-dhkey имя-ключа этикетка-ключа;
dump-file имя-файла; (named_dump.db; имя файла, в который сбрасывается текущее состояние кеша доменных имен по команде rndc dumpdb)
memstatistics-file path_name; (не реализовано)
pid-file имя-файла; (/var/run/named.pid; в этот файл записывается номер процесса; можно указать none)
statistics-file имя-файла; (named.stats; к этому файлу добавляется статистика по команде rndc stats)
zone-statistics yes_or_no; (no; собирать статистику отдельно для каждой «своей» зоны)
auth-nxdomain yes_or_no; (no; всегда устанавливать бит AA в ответах NXDOMAIN, даже если сервер не является уполномоченным для данного домена; может потребоваться для совместимости)
deallocate-on-exit yes_or_no; (устарело)
dialup dialup_option; (позволяет уменьшить число дозвонов, если сервер находится на клиентском конце dialup-on-demand линии)
fake-iquery yes_or_no; (устарело)
fetch-glue yes_or_no; (устарело)
has-old-clients yes_or_no; (устарело; используйте auth-nxdomain yes и rfc2308-type1 no)
host-statistics yes_or_no; (не реализовано)
minimal-responses yes_or_no; (no; заполнять дополнительные секции в ответах только при крайней необходимости — отрицательный результат, делегирование; уменьшает нагрузку на сервер)
multiple-cnames yes_or_no; (устарело; позволял использовать множественные CNAME в нарушение стандарта)
notify yes_or_no_or_explicit; (yes; посылать DNS NOTIFY при изменении зоны, для которой сервер уполномочен, серверам из NS и also-notify; explicit — посылать только серверам из списка also-notify)
recursion yes_or_no; (yes; обслуживать рекурсивные запросы)
rfc2308-type1 yes_or_no; (не реализовано)
use-id-pool yes_or_no; (устарело)
maintain-ixfr-base yes_or_no; (устарело)
forward ( only | first ) ; (first; действует только при непустом списке forwarders; перенаправлять запросы, не имеющие ответов в кеше или своих зонах, серверам, указанным в списке forwarders; позволяет организовать общий кеш для нескольких серверов или доступ в Интернет через прокси; first — сначала делается запрос к серверам из списка, при неудаче производится собственный поиск; only — собственный поиск не производится; можно настраивать отдельно для каждой зоны — см. утверждение zone)
forwarders { ip_addr [port ip_port] ; … }; (пусто; список IP-адресов и, возможно, номера портов серверов, которые будут обслуживать перенаправленные запросы; смотри forward)
check-names ( master | slave | response )( warn | fail | ignore ); (не реализовано, т.е. ignore?)
allow-notify { список-шаблонов-адресов }; (первичный сервер зоны; от кого наш сервер как вторичный уполномоченный сервер будет принимать извещения об изменениях зоны; можно настраивать отдельно для каждой зоны — см. утверждение zone)
allow-query { список-шаблонов-адресов }; (any; от кого принимать обычные запросы; можно настраивать отдельно для каждой зоны — см. утверждение zone)
allow-transfer { список-шаблонов-адресов };(any; от кого принимать запросы на передачу зоны; можно настраивать отдельно для каждой зоны — см. утверждение zone)
allow-recursion { список-шаблонов-адресов }; (any; от кого принимать рекурсивные запросы; данные из кеша под запрет не попадают)
allow-update-forwarding { список-шаблонов-адресов }; (none; от каких хостов вторичный сервер будет принимать динамические изменения зоны для передачи их первичному уполномоченному серверу; авторы не советуют)
allow-v6-synthesis { список-шаблонов-адресов }; (none; заморочки со «старыми» реализациями IPv6)
blackhole { список-шаблонов-адресов }; (none; с этих адресов запросы не принимаются и к ним запросы не посылаются)
listen-on [ port ip_port ] { список-шаблонов-адресов }; (по умолчанию — все интерфейсы, порт 53; адрес и порт для приема запросов; может быть несколько таких предложений)
listen-on-v6 [ port ip_port ] { список-шаблонов-адресов }; (none; для IPv6)
query-source [ address ( ip_addr | * ) ] [ port ( ip_port | * ) ]; (обратный адрес и номер порта для запросов к другим серверам; по умолчанию или * в качестве адреса — INADDR_ANY; по умолчанию или * в качестве номера порта — случайный непривилегированный порт; в TCP запросах всегда используется случайный непривилегированный порт)
query-source-v6 … (для IPv6)
also-notify { ip_addr [port ip_port] ; … ] }; (по умолчанию — пустая строка; список адресов серверов, которым посылается DNS NOTIFY при изменении зоны, для которой сервер уполномочен, в дополнение к серверам из списка NS; см. предложение notify и утверждение zone)
max-transfer-time-in число-минут; (120; максимальное время приема зоны)
max-transfer-time-out число-минут; (120; максимальное время передачи зоны)
max-transfer-idle-in число-минут; (60; максимальное время отсутствия прогресса при приеме зоны)
max-transfer-idle-out число-минут; (60; максимальное время отсутствия прогресса при передаче зоны)
serial-query-rate раз-в-секунду; (20; максимальное число запросов SOA в секунду со стороны нашего сервера как вторичного уполномоченного сервера к соответствующим первичным серверам для определения необходимости приема зоны)
serial-queries number; (устарело)
transfer-format ( one-answer | many-answers ); (many-answers; при выборе формата one-answer при передаче зоны используется отдельный пакет для каждой RR, many-answers — в каждый пакет упаковывается столько RR, сколько в него может поместиться; many-answers эффективнее, но не поддерживается BIND 4; см. утверждение server)
transfers-in число; (10; максимальное число одновременно принимаемых зон)
transfers-out число; (10; максимальное число одновременно передаваемых зон)
transfers-per-ns число; (2; максимальное число одновременно принимаемых зон с одного сервера; см. утверждение server)
transfer-source ( ip4_addr | * ) [port ip_port] ; (по умолчанию — адрес интерфейса, «ближайшего» по мнению ОС к удаленному серверу; определяет локальный адрес при запросе передачи зоны от удаленного сервера; также определяет адрес и UDP порт для перенаправляемых динамических изменений и проверок изменения зоны на первичном сервере (запрос SOA); именно этот адрес должен быть разрешен для передачи на удаленном сервере, так что рекомендуется задавать его явно; см. утверждения server и view)
transfer-source-v6 … (передача зоны осуществляется с помощью IPv6)
notify-source ( ip4_addr | * ) [port ip_port] ; (?; определяет локальный адрес и UDP порт при посылке DNS NOTIFY вторичным серверам; именно этот адрес должен быть указан при настройке вторичного сервера в предложении master или allow-notify; см. утверждения zone и view)
notify-source-v6 … (посылка DNS NOTIFY осуществляется с помощью IPv6)
max-ixfr-log-size number; (устарело)
max-journal-size размер; (unlimited; максимальный размер журнального файла — хранит динамические изменения (RFC 2136, RFC 3007) описания зоны на первичном сервере или результат обновлений зоны в формате IXFR (RFC 1995) на вторичном сервере; имя файла образуется из имени зоны добавлением суффикса .jnl; файл имеет двоичный формат; изменения отображаются на файл зоны с некоторым интервалом с целью уменьшения нагрузки на компьютер, поэтому файл зоны нельзя редактировать вручную; используется для восстановлении файла зоны при перезапуске)
coresize размер; (default, т.е. значение заданное при запуске процесса, см. setrlimit(2) и ulimit -c; размер coredump; можно использовать масштабирующие коэффициенты K, M и G)
datasize размер; (default, т.е. значение заданное при запуске процесса, см. setrlimit(2) и ulimit -d; максимальный размер сегмента данных, который ОС выделит процессу; рекомендуется использовать только для увеличения недостаточного значения по умолчанию; можно использовать масштабирующие коэффициенты K, M и G)
files число; (unlimited; максимальное число одновременно открытых файлов)
stacksize размер; (default, т.е. значение заданное при запуске процесса, см. setrlimit(2) и ulimit -s; максимальный размер сегмента стека, который ОС выделит процессу; можно использовать масштабирующие коэффициенты K, M и G
cleaning-interval число-минут; (60; период очистки кеша от RR с истекшим TTL)
heartbeat-interval number; (для dialup-ных зон)
interface-interval число-минут; (60; интервал сканирования списка активных интерфейсов; 0 — сканировать только при запуске; сервер перестает прослушивать опущенные интерфейсы и начинает прослушивать вновь появившиеся при условии, что они подходят под шаблон listen-on)
statistics-interval number; (не реализовано)
topology { список-шаблонов-адресов }; (не реализовано)
sortlist { список-шаблонов-адресов }; (предложение позволяет организовать сортировку RR по адресу в ответе клиенту в зависимости от адреса клиента; правильно настроенный клиент должен делать это сам, настраивать это на сервере — утомительно)
rrset-order { [ class класс-записи ] [ type тип-записи ] [ name «доменное-имя» ] order ( fixed | random | cyclic ) ; … }; (по умолчанию: class — ANY, type — ANY, name — *; предложение позволяет отсортировать RR в ответе клиенту в зависимости от класса, типа и значения доменного имени; fixed — не менять порядок записей; random — перемешивать записи в случайном порядке; cyclic — при каждом запросе первой ставится очередная запись; действует только последнее предложение rrset-order в списке; не реализовано; сервер возвращает RR в случайном порядке?)
lame-ttl число-секунд; (600; кешировать информацию о неверном делегировании зон (lame-server), чтобы уменьшить нагрузку на журнал; не более 1800; похоже, что кеширование не реализовано?)
max-ncache-ttl число-секунд; (10800; максимальное время хранения в кеше отрицательных ответов; не более 7 дней — 604800 секунд)
max-cache-ttl число-секунд; (604800; максимальное время хранения в кеше положительных ответов)
sig-validity-interval число-дней; (30; время окончания действия цифровых подписей, автоматически генерируемых при динамическом обновлении DNSSEC зоны; время начала действия подписи — за час до текущего времени; не более 3660 дней)
min-roots number; (не реализовано)
use-ixfr yes_or_no; (устарело)
provide-ixfr yes_or_no; (yes; отвечает как первичный сервер на запросы на передачу обновленной зоны в формате изменений — IXFR; данная опция нужна только для борьбы с ошибочной реализацией IXFR на удаленном сервере; см. утверждение server)
request-ixfr yes_or_no; (yes; запрашивает как вторичный сервер передачу обновлений зоны в формате изменений — IXFR; если удаленный сервер не поддерживает IXFR, то автоматически происходит откат к протоколу AXFR, данная опция нужна только для борьбы с ошибочной реализацией IXFR на удаленном сервере; см. утверждение server)
ixfr-from-differences yes_or_no; (no; вычисление и запись в журнал разницы между старым и новым содержимым зоны для последующей передачи ее в формате IXFR)
treat-cr-as-space yes_or_no; (устарело; NL и CRLF обрабатываются всегда)
min-refresh-time число-секунд; (ограничивает интервал обновления зоны, указанный в SOA; см. утверждения view и zone)
max-refresh-time число-секунд; (ограничивает интервал обновления зоны, указанный в SOA; см. утверждения view и zone)
min-retry-time число-секунд; (ограничивает интервал повтора попыток обновления зоны, указанный в SOA; см. утверждения view и zone)
max-retry-time число-секунд; (ограничивает интервал повтора попыток обновления зоны, указанный в SOA; см. утверждения view и zone)
port ip_port; (53; номер TCP и UDP портов, который сервер будет использовать для приема и передачи пакетов; применимо только для отладки)
additional-from-auth yes_or_no; (yes; можно отключать только при отключении обслуживания рекурсивных запросов; заполнять дополнительную секцию ответа, если эта информация есть в «своих» зонах)
additional-from-cache yes_or_no; (yes; можно отключать только при отключении обслуживания рекурсивных запросов; заполнять дополнительную секцию ответа, если эта информация есть кеше)
random-device path_name; (/dev/random; устройство или файл в качестве источника случайных чисел)
max-cache-size размер; (unlimited; максимальный размер памяти, выделяемой под кеш; можно использовать масштабирующие коэффициенты K, M и G)
tcp-clients число; (100; максимальное число одновременно обслуживаемых TCP соединений)
recursive-clients число; (1000; максимальное число одновременно обслуживаемых запросов; каждый запрос требует 20 КБ памяти)
match-mapped-addresses yes_or_no; (для IPv6)
root-delegation-only [exclude { «имя»; … } ]; (корневые зоны и зоны первого уровня, кроме списка исключений («DE», «LV», «US», «MUSEUM»), должны только делегировать подзоны)
Утверждение server может использоваться на верхнем уровне файла настройки или быть вложено в утверждение view. Если утверждение view содержит хотя бы одно утвержение server, то для данного вида используются только они (глобальные утверждения server игнорируются), иначе глобальные утверждения server действуют и на данный вид. Утвержение server может содержать следующие предложения:

bogus yes_or_no; (no; не отправлять запросы данному серверу)
provide-ixfr yes_or_no; (позволяет изменить значение опции, заданной глобально или для данного вида)
request-ixfr yes_or_no; (позволяет изменить значение опции, заданной глобально или для данного вида)
edns yes_or_no; (yes; пытаться ли использовать EDNS; ?)
transfers число; (позволяет изменить значение опции transfers-per-ns, заданной глобально)
transfer-format ( one-answer | many-answers ) ; (позволяет изменить значение опции, заданной глобально)
keys { string; … } ; (задает идентификатор ключа для подписи сообщения TSIG для данного сервера; ответ не обязан быть подписан этим ключом; реализован только один ключ на сервер)
Утверждение zone устанавливает опции, специфические для указанной зоны. Формат утверждения следующий:

zone имя-зоны [ класс ] {
type тип-зоны;
[ опция; … ]
};
Имя зоны — это доменное имя корневого узла зоны. Тип зоны определяет роль, которую сервер будет исполнять для этой зоны:

master — сервер является первичным уполномоченным сервером для данной зоны, т.е. загружает содержимое зоны из файла зоны, указанного опцией file
slave — сервер является вторичным уполномоченным сервером для данной зоны; содержимое зоны считывается от одного из серверов, указанных в опции masters; указание имени файла в опции file позволяет сохранять резервную копию зоны в файле
hint — позволяет задать с помощью опции file имя файла, содержащего описание корневой зоны; этот файл можно взять в Internic; сервер при загрузке обращается к одному из корневых серверов, перечисленных в этом файле, для получения текущего списка корневых серверов; полученный список используется в течении указанного TTL; для класса IN имеется встроенный список предполагаемых корневых серверов
stub — использовался в предыдущих версиях BIND для упрощения настройки; использовать не рекомендуется
forward — позволяет задавать список серверов, к которым будут перенаправляться запросы, не имеющие ответа в кеше, отдельно для данной зоны (см. предложения forward и forwarders в утверждении options)
delegation-only — эта зона может содержать только записи о делегировании подзон
Опции зоны (большинство опций позволяют заменить глобальные значения, заданные в утверждении options или взятые по умолчанию; они имеют тот же самый синтаксис и семантику):

masters [port ip_port] { ip_addr [port ip_port] [key ключ]; […] }; (адреса и номера портов серверов, с которых брать содержимое зоны; порт 53 по умолчанию; номер порта перед списком задает общий номер порта для всех серверов; если указано несколько серверов, то они опрашиваются все, а зона запрашивается с того из них, у кого она имеет наибольший серийный номер; указание ключа позволяет проверять правильность передачи с помощью цифровой подписи TSIG)
file «имя-файла»; (имя файла, в котором хранится содержимое зоны)
allow-update { список-шаблонов-адресов }; (none; каким хостам разрешено посылать динамические изменения зоны первичному серверу; права доступа на основе IP адресов опасны! используйте только списки шаблонов на основе ключей)
update-policy { update_policy_rule […] } ; (позволяет задать правила доступа на изменение отдельных записей при динамическом изменении зоны на основе авторства (identity) сообщений; имя автора извлекается из подписи TSIG или SIG(0); применим только для первичного сервера; несовместим с allow-update; правила рассматриваются по очереди до первого совпадения автора, имени и типа; каждое правило состоит из ключевого слова grant или deny, имени автора, способа сравнения имен, полного доменного имени и списка типов (м.б. опущен); в качестве автора можно указывать имя ключа, используемого для создания TSIG или SIG(0) или разделяемого секрета TKEY, а также шаблон (?); опущенный список типов соответствует любому типу, кроме SIG, NS, SOA и NXT; тип ANY соответствует любому типу, кроме NXT); допустимы следующие способы сравнения:
name (посимвольное сравнение)
subdomain (изменяемое имя должно быть поддоменом или совпадать с указанным в правиле)
wildcard (?)
self (изменяемое имя должно соответствовать имени автора, имеет смысл если для каждого изменяемого доменного имени создается ключ с таким же именем, а в качестве имени автора указывается шаблон *)
database «string»; (тип БД для хранения содержимого зоны во время работы; по умолчанию — «rbt»; другие типы БД необходимо явно указывать при сборке)
delegation-only yes_or_no (эта зона может содержать только записи о делегировании подзон; только для зон типа stub или hint)
allow-notify — описание см. в утверждении options
allow-query — описание см. в утверждении options
allow-transfer — описание см. в утверждении options
allow-update-forwarding — описание см. в утверждении options
also-notify — описание см. в утверждении options
check-names (warn|fail|ignore); (не реализовано)
dialup — описание см. в утверждении options
forward — описание см. в утверждении options
forwarders — описание см. в утверждении options, только для зоны типа forward
ixfr-base — устарело
ixfr-tmp-file — устарело
max-ixfr-log-size — устарело
max-transfer-idle-in — описание см. в утверждении options
max-transfer-idle-out — описание см. в утверждении options
max-transfer-time-in — описание см. в утверждении options
max-transfer-time-out — описание см. в утверждении options
notify — описание см. в утверждении options
pubkey number number number string ; (не реализовано)
transfer-source — описание см. в утверждении options
transfer-source-v6 — описание см. в утверждении options
notify-source — описание см. в утверждении options
notify-source-v6 — описание см. в утверждении options
zone-statistics — описание см. в утверждении options
sig-validity-interval — описание см. в утверждении options
min-refresh-time — описание см. в утверждении options
max-refresh-time — описание см. в утверждении options
min-retry-time — описание см. в утверждении options
max-retry-time — описание см. в утверждении options
ixfr-from-differences — описание см. в утверждении options
key-directory — описание см. в утверждении options

Сброс пароля в mysql

Если Вы забыли пароль Mysql (сброс пароля)

В случае каких-либо затруднений по настройке сервера Вы можете расчитывать на квалифицированную помощь сотрудников технической поддержки.

Для смены пароля на БД MySQL Вам необходимо выполнить следующие действия:

1) Соединяемся с сервером по протоколу ssh. (Инструкция по соединению)

2) Останавливаем MySQL:

/etc/init.d/mysqld stop

3) Запускаем MySQL с особыми параметрами:

/usr/bin/mysqld_safe —skip-grant-tables —user=root &

4) Запускаем клиента MySQL:

mysql -u root

5) Выполняем запрос SQL:

UPDATE mysql.user SET Password=PASSWORD(`newpassword`) WHERE User=`root`;

где newpassword — новый пароль

6) Применяем изменения:

FLUSH PRIVILEGES;

7) Выходим из клиента MySQL:

exit

8) Перезапускаем MySQL сервер:

/etc/init.d/mysqld restart

На этом всё — пароль MySQL изменён на newpassword.

Более мягкий способ

Ищем файл

configuration.php

»

$mosConfig_host = ‘xyz’; // сервер базы данных, в большинстве случаев ‘localhost’

$mosConfig_user = ‘adminsql’; // пользователь БД

$mosConfig_password = ‘xyz’; // пароль БД

$mosConfig_db = ‘xyzdb’; // название БД

$mosConfig_absolute_path = ‘/xyz’; // абсолютный путь к сайту без слеша (/) в конце

$mosConfig_live_site = ‘http://www.domain.ru’; // URL сайта без слеша в конце

$mosConfig_cachepath = ‘/xyz/cache’; // абсолютный путь к каталогу cache без слеша в концеharhр

»

Далее заходим по ssh

mysql -uadminsql -p

вводим пароль

show databases;

use xyzdb;

show tables;

ищем таблицу

*****_users

смотрим структуру базы

DESCRIBE *****_users;

Изменяем пароль админа

UPDATE `jos_users`

SET `password` = MD5(‘new_password’)

WHERE `username` = ‘admin’

Изучаем команды linux: awk

Изучаем команды linux: awk

Оригинал: Learning Linux Commands: awk
Автор: Rares Aioanei
Дата публикации: 24 ноября 2011 года
Перевод: А. Кривошей
Дата перевода: 22 сентября 2012 г.

  1. Введение

В данном случае название статьи слегка вводит нас в заблуждение, потому что awk — это больше, чем команда. Это язык программирования со своими собственными правилами. Вы можете писать на нем скрипты для выполнения сложных операций, либо можете просто использовать из командной строки. Его название составлено из заглавных букв Aho, Weinberger и Kernighan (да, тот самый Brian Kernighan), авторов языка, история которого началась в 1977 году. Если вы учитесь или учились программированию на C, то увидите многие похожие концепции в awk. Вам понадобятся определенные знания командной оболочки Linux и, возможно, базовые навыки написания скриптов, что, впрочем, необязательно, так как мы постараемся изложить материал как можно проще. Большое спасибо Arnold Robbins за его работу над awk.

  1. Для чего нужен awk?

awk — это утилита/язык для извлечения данных. Именно awk являлся источником вдохновения для Larry Wall, когда он создавал Perl. Для выполнения различных практических задач по обработке текста awk часто используется совместно с sed. В зависимости от поставленной задачи вы можете использовать либо awk, либо Perl, хотя это в большей степени зависит от личных предпочтений. Как и sed, awk читает за один раз одну строку, выполняет определенные действия в зависимости от заданных опций, и выводит результат. Одним из самых простых и популярных способов использования awk является выбор столбца из текстового файла или из вывода другой команды. Когда я устанавливал Debian на свою вторую рабочую станцию, я использовал awk для того, чтобы получить список установленных на первой машине, и скормить его aptitude. Я делал это с помощью команды вида:

$ dpkg -l | awk ‘ {print $2} ‘ > installed

В настоящее время большинство менеджеров пакетов предоставляют такую возможность, например это можно сделать с помощью команды rpm’s -qa, но вывод содержит больше информации, чем мне нужно. Я вижу, что второй столбец вывода dpkg -l содержит названия установленных пакетов, поэтому я использовал вышеприведенную команду, чтобы извлечь только второй столбец.

  1. Базовые концепции

Как уже говорилось, действия, выполняемые awk, заключаются в фигурные скобки, а вся команда — в одинарные кавычки: awk ‘condition { action }‘. В нашем примере условий нет, но если мы захотим, например, выбрать только установленные пакеты, относящиеся к vim, (да, есть grep, но ведь это пример, кроме того, зачем использовать две утилиты, если можно использовать одну), мы могли мы набрать:

$ dpkg -l | awk ‘ /’vim’/ {print $2} ‘

Эта команда выведет все установленные пакеты, содержащие «vim» в названиях. Одна из причин, по которой рекомендуется использовать awk — он быстр. Если заменить «vim» на «lib», в моей системе получится список из более чем 1300 пакетов. Встречаются ситуации, где данных намного больше, и в этих случаях awk показывает все свои преимущества. В любом случае, давайте рассмотрим примеры, которые помогут понять многие аспекты использования программы. Но перед этим будет полезно узнать, что существует несколько диалектов и реализаций awk. Примеры, приведенные в данной статье, относятся к GNU awk (так к реализации, так и к диалекту). Из-за различий в интерпретации кавычек, мы можем использовать bash, ksh или sh, но не можем использовать (t)csh.

  1. Примеры
Синтаксис команды Описание
awk ‘ {print $1,$3} ‘ Печатает только первый и третий столбцы, используя stdin
awk ‘ {print $0} ‘ Печатает все столбцы, используя stdin
awk ‘ /’pattern’/ {print $2} ‘ Печатает только элементы второго столбца, соответствующие шаблону «pattern», используя stdin
awk -f script.awk inputfile Как и sed, awk использует ключ -f для получения инструкций из файла, что полезно, когда их большое количество и вводить их вручную в терминале непрактично.
awk ‘ program ‘ inputfile Исполняет program, используя данные из inputfile
awk «BEGIN { print \»Hello, world!!\» }» Классическое «Hello, world» на awk
awk ‘{ print }’ Печатает все, что вводится из командной строки, пока не встретится EOF
#! /bin/awk -f

BEGIN { print «Hello, world!» }

Скрипт awk для классического «Hello, world!» (сделайте его исполняемым с помощью chmod и запустите)
# This is a program that prints \

«Hello, world!»

# and exits

Комментарии в скриптах awk
awk -F «» ‘program’ files Определяет разделитель полей как null, в отличие от пробела по умолчанию
awk -F «regex» ‘program’ files Разделитель полей также может быть регулярным выражением
awk ‘{ if (length($0) > max) max = \

length($0) }

END { print max }’ inputfile

Печатает длину самой длинной строки
awk ‘length($0) > 80’ inputfile Печатает все строки длиннее 80 символов
awk ‘NF > 0’ data Печатает каждую строку, содержащую хотя бы одно поле (NF означает Number of Fields)
awk ‘BEGIN { for (i = 1; i <= 7; i++)

print int(101 * rand()) }’

Печатает семь случайных чисел в диапазоне от 0 до 100
ls -l . | awk ‘{ x += $5 } ; END \

{ print «total bytes: » x }’

total bytes: 7449362

Печатает общее количество байтов, используемое файлами в текущей директории
ls -l . | awk ‘{ x += $5 } ; END \

{ print «total kilobytes: » (x + \

1023)/1024 }’

total kilobytes: 7275.85

Печатает общее количество килобайтов, используемое файлами в текущей директории
awk -F: ‘{ print $1 }’ /etc/passwd | sort Печатает отсортированный список имен пользователей
awk ‘END { print NR }’ inputfile Печатает количество строк в файле, NR означает Number of Rows
awk ‘NR % 2 == 0’ data Печатает четные строки файла.
ls -l | awk ‘$6 == «Nov» { sum += $5 }

END { print sum }’

Печатает общее количество байтов файла, который последний раз редактировался в ноябре.
awk ‘$1 ~/J/’ inputfile Регулярное выражение для всех записей в первом поле, которые начинаются с большой буквы j.
awk ‘$1 ~!/J/’ inputfile Регулярное выражение для всех записей в первом поле, которые не начинаются с большой буквы j.
awk ‘BEGIN { print «He said \»hi!\» \to her.» }’ Экранирование двойных кавычек в awk.
echo aaaabcd | awk ‘{ sub(/a+/, \»<A>»); print }’ Печатает «<A>bcd»
awk ‘{ $2 = $2 — 10; print $0 }’ inventory Модифицирует inventory и печатает его с той разницей, что значение второго поля будет уменьшено на 10.
awk ‘{ $6 = ($5 + $4 + $3 + $2); print \ $6’ inventory Даже если поле шесть не существует в inventory, вы можете создать его и присвоить значение, затем вывести его.
echo a b c d | awk ‘{ OFS = «:»; $2 = «»

> print $0; print NF }’

OFS — это Output Field Separator (разделитель выходных полей) и команда выведет «a::c:d» и «4», так как хотя второе поле аннулировано, оно все еще существует, поэтому может быть подсчитано.
echo a b c d | awk ‘{ OFS = «:»; \

$2 = «»; $6 = «new»

> print $0; print NF }’

Еще один пример создания поля; как вы можете видеть, поле между $4 (существующее) и $6 (создаваемое) также будет создано (как пустое $5), поэтому вывод будет выглядеть как «a::c:d::new» «6».
echo a b c d e f | awk ‘\

{ print «NF =», NF;

> NF = 3; print $0 }’

Отбрасывание трех полей (последних) путем изменения количества полей.
FS=[ ] Это регулярное выражения для установки пробела в качестве разделителя полей.
echo ‘ a b c d ‘ | awk ‘BEGIN { FS = \

«[ \t\n]+» }

> { print $2 }’

Печатает только «a».
awk -n ‘/RE/{p;q;}’ file.txt Печатает только первое совпадение с регулярным выражением.
awk -F\\\\ ‘…’ inputfiles … Устанавливает в качестве разделителя полей \\
BEGIN { RS = «» ; FS = «\n» }

{

print «Name is:», $1

print «Address is:», $2

print «City and State are:», $3

print «»

}

Если у нас есть запись вида
«John Doe
1234 Unknown Ave.
Doeville, MA»,
этот скрипт устанавливает в качестве разделителя полей новую строку, так что он легко может работать со строками.
awk ‘BEGIN { OFS = «;»; ORS = «\n\n» }

> { print $1, $2 }’ inputfile

Если файл содержит два поля, записи будут напечатаны в виде:

«field1:field2
field3;field4

…;…»
так как разделитель выходных полей — две новые строки, а разделитель полей — «;».

awk ‘BEGIN {

> OFMT = «%.0f» # print numbers as \

integers (rounds)

> print 17.23, 17.54 }’

Будет напечатано 17 и 18 , так как в качестве выходного формата (Output ForMaT) указано округление чисел с плавающей точкой до ближайших целых значений.
awk ‘BEGIN {

> msg = «Dont Panic!»

> printf «%s\n», msg

>} ‘

Вы можете использовать printf практически так же, как и в C.
awk ‘{ printf «%-10s %s\n», $1, \

$2 }’ inputfile

Печатает первое поле в виде строки длиной 10 символов, выровненной по левому краю, а затем второе поле в обычном виде.
awk ‘{ print $2 > «phone-list» }’ \inputfile Простой пример извлечения данных, где второе поле записывается под именем «phone-list».
awk ‘{ print $1 > «names.unsorted»

command = «sort -r > names.sorted»

print $1 | command }’ inputfile

Записывает имена, содержащиеся в $1, в файл, затем сортируем и выводим результат в другой файл.
awk ‘BEGIN { printf «%d, %d, %d\n», 011, 11, \

0x11 }’

Will print 9, 11, 17

if (/foo/ || /bar/)

print «Found!»

Простой поиск для foo или bar.
awk ‘{ sum = $2 + $3 + $4 ; avg = sum / 3

> print $1, avg }’ grades

Простые арифметические операции (в большинстве похожи на C)
awk ‘{ print «The square root of», \

$1, «is», sqrt($1) }’

2

The square root of 2 is 1.41421

7

The square root of 7 is 2.64575

Простой расширяемый калькулятор
awk ‘$1 == «start», $1 == «stop»‘ inputfile Печатает каждую запись между start и stop.
awk ‘

> BEGIN { print «Analysis of \»foo\»» }

> /foo/ { ++n }

> END { print «\»foo\» appears», n,\

«times.» }’ inputfile

Правила BEGIN и END исполняются только один раз, до и после каждой обработки записи.
echo -n «Enter search pattern: »

read pattern

awk «/$pattern/ «‘{ nmatches++ }

END { print nmatches, «found» }’ inputfile

Search using shell

if (x % 2 == 0)

print «x is even»

else

print «x is odd»

Простое условие. awk, как и C, также поддерживает операторы ?:.
awk ‘{ i = 1

while (i <= 3) {

print $i

i++

}

}’ inputfile

Печатает первые три поля каждой записи, по одной в строке.
awk ‘{ for (i = 1; i <= 3; i++)

print $i

}’

Печатает первые три поля каждой записи, по одной в строке.
BEGIN {

if ((«date» | getline date_now) <= 0) {

print «Can’t get system date» > \

«/dev/stderr»

exit 1

}

print «current date is», date_now

close(«date»)

}

Выход с кодом ошибки, отличным от 0, означает, что что-то идет не так. Пример:
awk ‘BEGIN {

> for (i = 0; i < ARGC; i++)

> print ARGV[i]

> }’ file1 file2

Печатает awk file1 file2
for (i in frequencies)

delete frequencies[i]

Удаляет элементы в массиве
foo[4] = «»

if (4 in foo)

print «This is printed, even though foo[4] \

is empty»

Проверяют элементы массива
function ctime(ts, format)

{

format = «%a %b %d %H:%M:%S %Z %Y»

if (ts == 0)

ts = systime()

# use current time as default

return strftime(format, ts)

}

awk-вариант функции ctime() в C. Так вы можете определять свои собственные функции в awk.
BEGIN { _cliff_seed = 0.1 }

function cliff_rand()

{

_cliff_seed = (100 * log(_cliff_seed)) % 1

if (_cliff_seed < 0)

_cliff_seed = — _cliff_seed

return _cliff_seed

}

Генератор случайных чисел Cliff.
cat apache-anon-noadmin.log | \

awk ‘function ri(n) \

{ return int(n*rand()); } \

BEGIN { srand(); } { if (! \

($1 in randip)) { \

randip[$1] = sprintf(«%d.%d.%d.%d», \

ri(255), ri(255)\

, ri(255), ri(255)); } \

$1 = randip[$1]; print $0 }’

Анонимный лог Apache (IP случайные)
  1. Заключение

Как вы можете видеть, с помощью awk вы можете выполнять большое количество операций по обработке текста и множество других полезных вещей. Мы не вдавались в более сложные предметы, такие как предопределенные функции awk, но мы показали достаточно (как мы надеемся), чтобы вы запомнили, каким мощным инструментом является awk.

Средняя оценка 2 при 1 голосовавших

Вы сможете оценить статью и оставить комментарий, если войдете или зарегистрируетесь.
Только зарегистрированные пользователи могут оценивать и комментировать статьи.

Шпаргалка по firewall-cmd

Шпаргалка по параметрам fierwalld-cmd или опять настройка firewalld

Вот достаточно полное, хоть и краткое описание параметров утилиты firewalld-cmd которые позволяют управлять межсетевым экраном firewalld. По традиции большинство опций начинаются с символов —.

Получение справки:

  • -h, —help — Возвращает описание опций firewall-cmd.
  • -V, —version — Возвращает версию firewalld.

Проверка статуса:

  • —state Проверяет активен ли демон firewalld. Возвращает код 0 если демон активен или NOT_RUNNING если демон не запущен. Так же выводит информацию в стандартный поток STDOUT

Перезагрузка:

  • —reload — Перезагружает правила межсетевого экрана с сохранением информации о состоянии.
  • —complete-reload — Полностью перезагружает межсетевой экран, в том числе перезагружает модули ядра (netfilter)/ Очевидно что все соединения будут сброшены и временные правила потеряны. Эта перезагрузка для особо неприятных случаев.

Паника (внештатный режим):

  • —panic-on — Включае режим паники. Все входящие и исходящие пакеты без исключения отбрасываются, все соединения со временем разрываются. Идеально подходит на случай обнаружения взлома или иных серьёзных проблем.
  • —panic-off — Отключить режим паники. Брэндмауер начинает работать в штатном режиме, некоторые соединения могут быть восстановлены, если режим паники длился меньше время смерти для этих соединений.
  • —query-panic — Возвращает 0 если режим паники включен и 1 если выключен.

Опции обработки зон:

  • —get-default-zone — Возвращает зону по умолчанию для соединений и интерфейсов (Изначально по умолчанию public).
  • —set-default-zone=<zone> — Устанавливает зону по умолчанию для соединений и интерфейсов (Для которых зона не была установлена). Это постоянные изменения.
  • —get-zones — Возвращает предопределенных зон служб используя пробелы в качестве разделителя.
  • —get-services — Возвращает список стандартных служб используя пробелы в качестве разделителя.
  • —get-icmptypes — Возвращает список предопределенных типов ICMP используя пробелы в качестве разделителя
  • —get-active-zones — Возвращает список активных в настоящее время зон вместе с интерфейсами в этих зонах в формате:
    <zone1>: <interface1> <interface2> ..
    <zone2>: <interface3> ..
  • —get-zone-of-interface=<interface> — Возвращает зону которой пренадлежит интерфейс <interface> или ничего, если интерфейсу не назначена зона.
  • —list-all-zones — Возвращает список всех действий во всех зонах в формате:
    <zone>
    interfaces: <interface1> ..
    services: <service1> ..
    ports: <port1> ..
    forward-ports: <forward port1> ..
    icmp-blocks: <icmp type1> ..

Опции обработки интерфейсов:

Эти опции относятся только к одной конкретной зоне. Если используется —zone=<zone>, то они влияют на зону <zone>. Если —zone=<zone> опущен, то опции влияют на зону «по умолчанию» (смотрите —get-default-zone). Получить список предопределенных зон можно используя —get-zones. Имя интерфейса это строка длинной не более 16 символов, оно не может содержать », ‘/’, ‘!’ и ‘*’. [—zone=<zone>]

  • -list-interfaces — Возвращает список интерфейсов которые пренадлежат к зоне <zone>. Если параметр —zone опущен, то используется зона «по умолчанию». [—zone=<zone>]
  • —add-interface=<interface> — Добавляет интерфейс <interface> в зону <zone>. Если параметр —zone опущен, то используется зона «по умолчанию».
  • [—zone=<zone>] { —change-interface=<interface> | —change —zone=<interface> } — Изменить зону интерфейса<interface> принадлежащего зоне <zone>. Если параметр —zone опущен, то используется зона «по умолчанию». Если старая и новая зона совпадают то команда ничего не делает и не возвращает ошибки. Если интерфейс не принадлежал ранее к этой зоне то он будет в неё добавлен, как при использовании параметра —add-interface.
  • [—zone=<zone>]—query-interface=<interface> — Возвращает 0 если интерфейс <interface> принадлежит к зоне <zone> и 1 если не пренадлежит.
  • [—zone=<zone>]—remove-interface=<interface> — Удаляет интерфейс<interface> из зоны <zone>.Если параметр —zone опущен, то используется зона «по умолчанию»

.Опции настройки и запроса зон:

Чтобы использовать эти параметры следует знать какие действия и когда можно использовать. Об этом написано ниже.

  • [—zone=<zone>] —add-ACTION [—timeout=<seconds>] — Добавить действиеACTION для зоны <zone>. Эта опция может быть указана несколько раз. Если параметр —zone опущен, то используется зона «по умолчанию».Чтобы получить зону по умолчанию используется —get-default-zone. Если указан тайм-аут то действие ACTION будет активно указанное количество секунд и затем удалено.
  • [—zone=<zone>] —remove-ACTION — Удалить действие ACTION из зоны<zone>. Эта опция может быть указан несколько раз. Если параметр —zone опущен, то используется зона «по умолчанию». Если действие было добавлено с указанием тайм-аута, оно всё равно будет удалено.
  • [—zone=<zone>] —query-ACTION — Возвращает 0 если действие ACTION было добавлено для зоны <zone> и 1 в противном случае. Если параметр —zone опущен, то используется зона «по умолчанию».
  • [—zone=<zone>] —add-masquerade [—timeout=<seconds>] — Включить маскарад для зоны<zone>. Если параметр —zone опущен, то используется зона «по умолчанию». Если указан тайм-аут, маскарадинг будет активным в течение указанного количества секунд.
  • [—zone=<zone>] —remove-masquerade — Отключить маскарад для зоны <zone>. Если параметр —zone опущен, то используется зона «по умолчанию». Если маскарадинг был включен с тайм-аут, он всё равно будет отключен.
  • [—zone=<zone>] —query-masquerade — Возвращает 0 если маскарадинг включен для зоны <zone> и 1 в противном случае.Если параметр —zone опущен, то используется зона «по умолчанию».
  • [—zone=<zone>] —list-services — Возвращает список сервисов добавлены в зону <zone> разделенный пробелами. Если параметр —zone опущен, то используется зона «по умолчанию». Чтобы получить список всех предустановленных сервисов используйте —get-services.
  • [—zone=<zone>] —list-ports— Возвращает список портов добавленных в зону <zone> разделённый пробелами.Списрок имеет формат: <port>[-<port>]/<protocol>, где в качестве порта может быть указан диапазон портов.Если параметр —zone опущен, то используется зона «по умолчанию».
  • [—zone=<zone>]—list-icmp-blocks — Список типов ICMP пакетов добавлнных в зону <zone> разделенный пробелами. Если параметр —zone опущен, то используется зона «по умолчанию». Для получения списка всех предопределенных типов ICMP используйте —get-icmptypes.
  • [—zone=<zone>] —list-forward-ports — Возвращает список всех «проброшенных» портов добавленных в зону<zone>.Если параметр —zone опущен, то используется зона «по умолчанию».
  • [—zone=<zone>] —list-all — Возвращает список всех действий добавленных или включенных в зону <zone>. Если параметр —zone опущен, то используется зона «по умолчанию».

Варианты действий для использования с опциями настройки и запроса зон:

Эти действия (ACTION) используются в —add-ACTION, —remove-ACTION и —query-ACTION предыдущего раздела.

  • service=<service> — Использовать одну из стандартных служб. Для получения списка всех стандартных служб используйте —get-services.
  • port=<port>[-<port>]/<protocol> — Использовать порт <port> или диапазон портов <port>-<port> для работы протоколы. Порт — это номер порта от 1 до 65535. Протокол может быть TCP или UDP.
  • icmp-block=<icmptype> — .Использовать предопределенные типы ICMP пакетов. Для получения списка всех предопределенных типов ICMP используйте —get-icmptypes.
  • forward-port=port=<port>[-<port>]:proto=<protocol>:toport=<port>[-<port>] — Использовать порт при переадресации пакетов. Указываются исходный и целевой порты или диапазоны портов для протокола. Протоколом может быть UDP или TCP. Проброс осуществляется с локального порта port на локальный toport.
  • forward-port=port=<port>[-<port>]:proto=<protocol>:toaddr=<address> — Проброс локального порта port в тот же порт на хосте toaddr.
  • forward-port=port=<port>[-<port>]:proto=<protocol>:toport=<port>[-<port>]:toaddr=<address> — Проброс локального порта port в порт toport на хосте

Постоянные параметры:

Постоянные параметры будут хранится в настройках и не исчезнут после перезагрузки. Так же их изменение вступят в силу только после перезагрузки или перезапуска системы.(Ключевое слово тут —permanent) Можно использовать:

  • —permanent { —get-zones | —get-services | —get-icmptypes }
  • —permanent [—zone=<zone>] { —list-services | —list-ports | —list-icmp-blocks | —list-forward-ports }
  • —permanent [—zone=<zone>] { —add-ACTION | —remove-ACTION | —query-ACTION }
  • —permanent [—zone=<zone>] { —add-masquerade | —remove-masquerade |—query-masquerade }

Результат такой же как и при использовании временных параметров, только постоянный. 🙂

Ещё опции:

Эти опции служат для управления правилами на более низком уровне.

  • —direct—passthrough { ipv4 | ipv6 | eb } <args> — Передача команд через фаервол. Аргументом <args> могут быть любые агрументы командной строки допрустимые в iptables, ip6tables и ebtables.
  • —direct—add-chain { ipv4 | ipv6 | eb } <table> <chain> — Добавить новую цепочку <chain> в таблицу <table>.
  • —direct—remove-chain { ipv4 | ipv6 | eb } <table> <chain> — Удалить цепочку <chain> из таблицы <table>.
  • —direct—query-chain { ipv4 | ipv6 | eb } <table> <chain> — Возвращает 0 если цепочка с именем <chain> присутствует в таблице <table> и 1 в противном случае.
  • —direct—get-chains { ipv4 | ipv6 | eb } <table> — Возвращает все цепочки содержащиеся в таблице <table> в виде списка разделенного пробелами.
  • —direct—add-rule { ipv4 | ipv6 | eb } <table> <chain> <priority> <args> — Добавить правило <args> в цепочку <chain> таблицы <table>.Приоритет используется для задания позиции правила в цепи. Правило с приоритетом 0 добавляется на самый верх цепи. Чем больше приоритет, тем ниже правило расположено в цепочке. Порядок расположения правил с одинаковым приоритетом может менятся и поэтому не предсказуем. Не стоит назначать одинаковый приоритет правилам.
  • —direct—remove-rule { ipv4 | ipv6 | eb } <table> <chain> <args> -Удалить правило <args> из цепочки <chain> в таблице <table>.
  • —direct—query-rule { ipv4 | ipv6 | eb } <table> <chain> <args> — Возвращает 0 если правило <args> существует в цепочке <chain> таблицы <table> и 1 в противном случае.
  • —direct—get-rules { ipv4 | ipv6 | eb } <table> <chain> — Возвращает все правила цепочки <chain> в таблице <table> в виде строк.

Шпаргалка по Asterisk

Остановка и перезапуск Asterisk
Asterisk
Для остановки и перезагрузки Asterisk, есть несколько команд:
 core stop now — Эта команда останавливает Asterisk немедленно, заканчивая все текущие вызовы.
 core stop gracefully — Эта команда предотвращает новые вызовы, но позволяет закончить текущие звонки. Когда все звонки закончились, Asterisk останавливается.
 core stop when convenient — Эта команда ждет, пока в Asterisk будет вызовов, а затем останавливает службу. Это не мешает новым вызовам.

Для перезапуска аналогично:

 core restart now, — Эта команда перегружает Asterisk немедленно, заканчивая все текущие вызовы.
 core restart gracefully — Эта команда предотвращает новые вызовы, но позволяет закончить текущие звонки. Когда все звонки закончились, Asterisk перегружается.
 core restart when convenient — Эта команда ждет, пока в Asterisk будет вызовов, а затем перегружает службу. Это не мешает новым вызовам.

Существует также команда, если вы измените свое мнение.
core abort shutdown — Эта команда отменяет выключения или перезагрузки, которые вы ранее запустили

MYSQLDUMP — и работа с ним

Дамп и восстановление базы данных MySQL

Дамп и восстановление базы данных MySQL довольно просто и удобно делать удаленно через SSH или прямо через консоль сервера. Удаленно, это можно делать используя программы Putty/Kitty. Также указанные ниже примеры Вы можете выполнять и на Windows запустив командную строку ‘cmd‘. Ниже приведены примеры о том, как создавать дампы базы данных MySQL и затем восстанавливать их при необходимости, например для Вашего сайта, интернет-магазина или какого либо другого проекта.

Создание дампа базы данных MySQL

Для того, чтоб выполнять данные команды, подключитесь удаленно к Вашему серверу через SSH используя одну из перечисленных выше программ. После подключения и авторизации к серверу/хостингу, Вы можете вводить приведенные ниже команды.

# Бекап одной базы данных в файл dump_file.sql
mysqldump -uroot -p your_base > dump_file.sql
 
 

# На windows дамп лучше всего создавать немного другой командой, которая предотвращает

# случайное затирание строк дампа из за конвертации символов перевода строки ‘\r\n’ в ‘\n’
mysqldump -uroot -p your_base -r dump_file_utf8.sql
 
 

# Если Вам нужен бекап только отдельных таблиц, а не всей базы данных

# (указываем наименования таблиц через пробел после названия базы данных)
mysqldump -uroot -p your_base TABLE1 TABLE2 TABLE3 > dump_file.sql
 
 

# Если нужно создать бекап только структуры базы данных без самих данных

mysqldump -uroot -p —no-data your_base > dump_file.sql
 
 

# Бекап всех баз данных в файл текущая_дата.gz

mysqldump -uroot -p —all_databases | gzip -c > ‘date «+%Y-%m-%d»‘.gz
 
 

# Бекап, где для каждой записи создается отдельный INSERT

# и с явным указанием кодировки базы данных UTF-8
mysqldump -uroot -p —default-character-set=utf8 your_base —extended-insert=FAL

 

 

В приведенном выше примере, для создания бекапа используется утилита mysqldump, которая входит в состав mysql. Далее указываются параметры для создания бекапа базы данных, которые разберем подробнее:

  • -u– параметр указывает логин, который будет использоваться для подключения к базе данных. В примере мы используем логин root, который нужно указать в этом параметре без пробела! В результате у нас это выглядит как -uroot
  • -p– параметр указывает что нужно ввести пароль для указанного логина. Мы его оставили пустым, в результате чего пароль нужно будет ввести после нажатия “Enter” при выполнении команды. Тем не менее, можно указать пароль сразу же здесь, как и в параметре логина, без пробела после -p, однако этот способ не является безопасным, так как консоль сохраняет Ваши команды в лог файл и если Вы его регулярно не очищаете, то он может быть просмотрен злоумышленником.
  • your_base– вместо этой строки в примере, вам необходимо указать реальное имя Вашей базы данных, для которой Вы создаете бекап.
  • >– оператор который показывает направление действия, т.е. как бы указывает, что вы собираетесь сделать запись из базы в файл.
  • sql– это название Вашего файла .slq в которую нужно сохранить Вашу базу данных. Он указывается через пробел после оператора ‘>’. Вы можете задать любое другое имя. Например, чтобы в имени система автоматически вставила текущее время, достаточно указать строку вида:
1  

 

‘date «+%Y-%m-%d»‘

 

 

после этой строки в примере указывается расширение файла ‘.gz‘. В результате будет создан файл вида ‘2014-11-15.gz‘.

 

  • Во втором примере, вместо оператора ‘>‘ используется оператор ‘|‘, который указывает на необходимость выполнения дополнительной команды gzip c параметром ‘-c‘ которая позволяет сразу же запаковать дамп в архив, а только затем сохранить его в файл вида ‘2014-11-15.gz‘, о чем сообщает оператор ‘>‘.
  • Параметр –no-dataпозволяет создать дамп только структуры базы данных без самих данных. В некоторых случаях довольно полезно, когда данные не нужны.
  • Параметры–default-character-set=utf8 и –extended-insert=FALSE. Первый позволяет Вам явно указать кодировку, которая используется этой базой данных, тем самым избежать сохранение базы в неверной кодировке Вместо utf8 можно указать любую другую кодировку, например cp1251. Второй параметр позволяет указать, что при экспорте для каждой записи необходимо создать отдельную команду INSERT. В некоторых случаях это может потребоваться при частичном восстановлении данных из дампа.

Восстановление базы данных из файла дампа MySQL

Теперь рассмотрим с Вами обратный процесс восстановления базы данных из файла дампа. Данное действие выполняется при помощи программы mysql. Рассмотрим сразу же пример.

1

2

 

 

# Восстанавливаем базу данных your_base из файла дампа dump_file

 

 

 

mysql -uroot -p your_base < dump_file.sql

 

 

Здесь также используются параметры ‘-u‘ и ‘-p‘, которые указывают на логин и пароль для подключения к базе данных аналогично утилите mysqldump, рассмотренной в предыдущем примере. После этого идет название базы данных, а также файла, из которого необходимо восстановить данные. Между ними ставится оператор ‘<‘ который указывает направление, что мы хотим импортировать данные в базу из файла.

Шпаргалка по Cenos 7

Шпаргалка по управлению сервисами CentOS 7 с systemd

Блог компании Infobox

Systemd – менеджер системы и сервисов в операционной системе Linux. При разработке eго стремились спроектировать обратно совместимым со скриптами инициализации SysV init и предоставить полезные функции, такие, как параллельный запуск системных сервисов во время загрузки, активацию демонов по требованию, поддержку снепшотов состояния системы и логику управления сервисами, основанную на зависимостях. В CentOS 7 systemd заменяет Upstart как систему инициализации по умолчанию.

В этой статье мы рассмотрим процесс управления сервисами в systemd для пользователя CentOS 7. Эти знания будут полезны и в других дистрибутивах, ведь systemd уже давно используется в Fedora и планируется в Ubuntu 14.10 и Debian 8. Хорошо это или нет — оставим за кадром.

В процессе чтения статьи вы можете попробовать systemd на классических VPS и облачных VPS от Infobox. Мы стремимся своевременно добавлять поддержку современных ОС, чтобы вы могли использовать последние технологии для более эффективной работы. Сама идея написания статьи родилась после очередного вопроса пользователей об использовании сервисов в CentOS 7.

Введение
Systemd приносит концепцию юнитов systemd. Юниты представлены конфигурационными файлами, размещенными в одной из директорий:

  • /usr/lib/systemd/system/– юниты из установленных пакетов RPM.
  • /run/systemd/system/— юниты, созданные в рантайме. Этот каталог приоритетнее каталога с установленными юнитами из пакетов.
  • /etc/systemd/system/— юниты, созданные и управляемые системным администратором. Этот каталог приоритетнее каталога юнитов, созданных в рантайме.

Юниты содержат информацию о системных сервисах, прослушиваемых сокетах, сохраненных снапшотах состояний системы и других обьектах, относящихся к системе инициализации.

Типы юнитов systemd:

  • .service– системный сервис
  • .target— группа юнитов systemd
  • .automount – точка автомонтирования файловой системы
  • .device– файл устройства, распознанного ядром
  • .mount– точка монтирования файловой системы
  • .path– файл или директория в файловой системе
  • .scope– процесс, созданный извне
  • .slice– группа иерархически организованных юнитов, управляющая системными процессами
  • .snapshot– сохраненное состояние менеджера systemd
  • .socket– сокет межпроцессного взаимодействия
  • .swap– Свап-устройство или свап-файл (файл подкачки)
  • .timer– таймер systemd

 

Основные функции systemd в CentOS 7

 

  • Активация, основанная на сокетах. Во время загрузки systemd прослушивает сокеты для всех системных сервисов, поддерживает этот тип активации и передает сокеты этим сервисам сразу после старта сервисов. Это позволяет systemd не только запускать сервисы параллельно, но также дает возможность перезапускать сервисы без потери любых отправленных им сообщений, пока сервисы были недоступны. Соответствующий сокет остается доступным и все сообщения выстраиваются в очередь.
  • Активация, основанная на D-Bus. Системные сервисы, использующие D–Bus для межпроцессного взаимодействия, могут быть запущены по требованию, когда клиентское приложение пытается связаться с ними.
  • Активация, основанная на девайсах. Системные сервисы, поддерживающие активацию, основанную на девайсах, могут быть запущены, когда определенный тип оборудования подключается или становится доступным.
  • Активация, основанная на путях. Системные сервисы могут поддерживать этот вид активации, если изменяется состояние папки или директории.
  • Снепшоты системных состояний. Система может сохранять состояние всех юнитов и восстанавливать предыдущее состояние системы.
  • Управление точками монтирования и автомонтирования. Systemd отслеживает и управляет точками монтирования и автомонтирования.
  • Агрессивная параллелизацияSystemd запускает системные сервисы параллельно из-за использования активации, основанной на сокетах. В комбинации с сервисами, поддерживающими активацию по требованию, параллельная активация значительно уменьшает время загрузки системы.
  • Транзакционная логика активации юнитов. До активации и деактивации юнитов systemd вычисляет их зависимости, создает временную транзакцию и проверяет целостность этой транзакции. Если транзакция нецелостная, systemd автоматически пытается исправить ее и удалить не требующиеся задания из нее до формирования сообщения об ошибке.
  • Обратная совместимость с инициализацией SysV. SystemD полностью поддерживает скрипты инициализации SysV, как описано в спецификации Linux Standard Base (LSB), что упрощает переход на systemd.

 

Управление сервисами
В предыдущих версиях CentOS использовалась SysV или Upstart. Скрипты инициализации располагались в директории /etc/rc.d/init.d/. Такие скрипты обычно писались на Bash и позволяли администратору управлять состоянием сервисов и демонов. В CentOS 7 скрипты инициализации были заменены сервисными юнитами.

По способу использования сервисные юниты .service напоминают скрипты инициализации. Для просмотра, старта, остановки, перезагрузки, включения или выключения системных сервисов используется команда systemctl. Команды service и chkconfig по-прежнему включены в систему, но только по соображениям совместимости.

При использовании systemctl указывать расширение файла не обязательно.

Ниже представлены основные команды systemctl:

  • systemctl start name.service– запуск сервиса.
  • systemctl stop name.service— остановка сервиса
  • systemctl restart name.service— перезапуск сервиса
  • systemctl try-restart name.service— перезапуск сервиса только, если он запущен
  • systemctl reload name.service— перезагрузка конфигурации сервиса
  • systemctl status name.service— проверка, запущен ли сервис с детальным выводом состояния сервиса
  • systemctl is-active name.service— проверка, запущен ли сервис с простым ответом: active или inactive
  • systemctl list-units —type service —all– отображение статуса всех сервисов
  • systemctl enable name.service– активирует сервис (позволяет стартовать во время запуска системы)
  • systemctl disable name.service– деактивирует сервис
  • systemctl reenable name.service– деактивирует сервис и сразу активирует его
  • systemctl is–enabled name.service– проверяет, активирован ли сервис
  • systemctl list-unit-files —type service– отображает все сервисы и проверяет, какие из них активированы
  • systemctl mask name.service– заменяет файл сервиса симлинком на /dev/null, делая юнит недоступным для systemd
  • systemctl unmask name.service– возвращает файл сервиса, делая юнит доступным для systemd

 

Работаем с целями (targets) Systemd
Предыдущие версии CentOS с SysV init или Upstart включали предопределенный набор уровней запуска (runlevels), которые представляли специфичные режимы для операций, пронумерованные от 0 до 6. В CentOS 7 концепция уровней запуска была заменена целями systemd.

Файлы целей systemd .target предназначены для группировки вместе других юнитов systemd через цепочку зависимостей. Например юнит graphical.target, использующийся для старта графической сессии, запускает системные сервисы GNOME Display Manager (gdm.service) и Accounts Service (accounts–daemon.service) и активирует multi–user.target. В свою очередь multi–user.target запускает другие системные сервисы, такие как Network Manager (NetworkManager.service) или D-Bus (dbus.service) и активирует другие целевые юниты basic.target.

В CentOS 7 присутствуют предопределенные цели, похожие на стандартный набор уровней запуска. По соображениям совместимости они также имеют алиасы на эти цели, которые напрямую отображаются в уровнях запуска SysV.

  • target (runlevel0.target)– завершение работы и отключение системы
  • target (runlevel1.target)– настройка оболочки восстановления
  • multi–user.target (runlevel2.target, runlevel3.target, runlevel4.target)– настройка неграфической многопользовательской системы
  • target (runlevel5.target)– настройка графической многопользовательской системы
  • target (runlevel6.target)– выключение и перезагрузка системы

Команды runlevel и telinit по-прежнему доступны, но оставлены в системе по соображениям совместимости. Рекомендуется использовать systemctl для изменения или настройки системных целей.

Для определения, какой целевой юнит используется по умолчанию, полезна следующая команда: systemctl get–default.

Для просмотра всех загруженных целевых юнитов воспользуйтесь командой systemctl list-units —type target, а для просмотра вообще всех целевых юнитов командой: systemctl list-units —type target —all.

Для изменения цели по умолчанию поможет команда systemctl set-default name.target.

Для изменения текущей цели: systemctl isolate name.target. Команда запустит целевой юнит и все его зависимости и немедленно остановит все остальные.
Выключение и перезагрузка системы
В CentOS 7 systemctl заменяет значительное количество команд управления питанием. Прежние команды сохранены для совместимости, но рекомандуется использовать systemctl:
systemctl halt – останавливает систему
systemctl poweroff – выключает систему
systemctl reboot – перезагружает систему
Управление systemd на удаленной машине
Systemd позволяет управлять удаленной машиной по SSH. Для управления используйте команду:
systemctl —host user_name@host_name command, где user_name – имя пользователя, host_name – имя хоста, которым осуществляется удаленное управление, а command – выполняемая команда systemd.
Типичный systemd .service
Этот раздел поможет вам, если вам необходимо быстро сделать поддержку управления сервисом из systemd. Подробная информация о всех параметрах файла .service есть в соответствующем разделе документации по systemd.
[Unit]

Description=Daemon to detect crashing apps

After=syslog.target

 

[Service]

ExecStart=/usr/sbin/abrtd

Type=forking

 

[Install]

WantedBy=multi-user.target
Давайте посмотрим на секцию [Unit]. Она содержит общую информацию о сервисе. Такая секция есть не только в сервис-юнитах, но и в других юнитах (например при управлении устройствами, точками монтирования и т.д.). В нашем примере мы даем описание сервиса и указываем на то, что демон должен быть запущен после Syslog.

В следующей секции [Service] непосредственно содержится информация о нашем сервисе. Используемый параметр ExecStart указывает на исполняемый файл нашего сервиса. В Type мы указываем, как сервис уведомляет systemd об окончании запуска.

Финальная секция [Install] содержит информацию о цели, в которой сервис должен стартовать. В данном случае мы говорим, что сервис должен быть запущен, когда будет активирована цель multi–user.target.

Это минимальный работающий файл сервиса systemd. Написав свой, для тестирования скопируйте его в /etc/systemd/system/имя_сервиса.service. Выполните команды systemctl daemon-reload. Systemd узнает о сервисе и вы сможете его запустить.
Дополнительная информация
Отличное руководство по systemd от RedHat, положенное в основу этой статьи.
Документация по написанию своего сервис-юнита systemd.
«Systemd для администраторов» от разработчика systemd на русском языке.
Заключение
В этой статье мы научились управлять сервисами CentOS 7. Конечно, это далеко не единственная функция systemd и другие ее стороны будут рассмотрены в будущем. Сама ОС практически со времени релиза доступна на классических VPS и облачных VPS от Infobox. Попробуйте systemd прямо сейчас. Эти знания будут полезны в связи с переходом многих дистрибутивов на systemd.

Если вы обнаружили ошибку в статье, автор ее с удовольствием исправит. Пожалуйста напишите в ЛС или на почту о ней.
В случае, если вы не можете оставлять комментарии на Хабре, можно написать их в блоге Сообщества InfoboxCloud или в нашей группе в Facebook.

Успешного использования CentOS 7!

Установка и конфигурация Samba на CentOS 7

Установка и конфигурация Samba на CentOS 7

Автор  Владимир Драч

 

Пятница, 26 Сентябрь 2014 00:00

 

 

Разберёмся, как сконфигурировать samba на CentOS 7 с анонимными и защищёнными samba-серверами. Samba является пакетом программ с открытым исходным кодом, который позволяет уверенно обращаться к файлам и принтерам на ОС, работающих по протоколу SMB/CIFS. Samba находится в свободном доступе, в отличие от других программ SMB/CIFS, и совместим, допускает возможность взаимодействия сетей, включающих сервера под управлением Linux/Unix, так и клиентов, работающими на Windows.

1 Предварительные замечания

В нашем случае установка сервера samba будет производиться на специально установленном сервере CentOS версии 7.0. Также нам понадобится ПК с установленным Windows для проверки доступности samba. В данном случае сервер под CentОS будет иметь имя хоста в виде linux.example.com и 192.168.0.100 в качестве IP-адреса.

Внимание: В Windows домен рабочей станции должен совпадать с доменом в CentOS.

Для проверки значения в Windows введите в командной строке следующее:

net config workstation

В нашем случае домен рабочей станции имеет значение HOME.

Убедитесь, что рабочая группа будет иметь одинаковое имя как под Linux, так и под Windows.

Для того, чтобы сделать доступным компьютер под Windows, необходимо добавить IP-адрес вашего сервера в hosts.

блокнот C:\Windows\System32\drivers\etc\hosts

В нашем случае введем следующее:

[…]

 

192.168.0.100 linux.example.com centos

Затем просто сохраним данное изменение.

2 Анонимный доступ средствами samba

Сначала установим samba с возможностью анонимного доступа. Для установки samba выполните следующую команду:

yum install samba samba-client samba-common

Таким образом вы установите samba актуальной версии.

Для того, чтобы сконфигурировать samba потребуется отредактировать файл /etc/samba/smb.conf, перед редактированием следует сделать резервное копирование оригинального файла /etc/samba/smb.conf.bak

cp /etc/samba/smb.conf /etc/samba/smb.conf.bak

Открываем для редактирования файл:

mcedit /etc/samba/smb.conf

Вносим изменения:

[global]

 

workgroup = HOME

 

server string = Samba Server %v

 

netbios name = centos

 

security = user

 

map to guest = bad user

 

dns proxy = no

 

#===Share Definitions

 

[Anonymous]

 

path = /samba/anonymous

 

browsable =yes

 

writable = yes

 

guest ok = yes

 

read only = no

Почти всё готово, перезапускаемся:

mkdir -p /samba/anonymous

 

systemctl enable smb.service

 

systemctl enable nmb.service

 

systemctl restart smb.service

 

systemctl restart nmb.service

На данном этапе сетевой экран CentOS 7.0 заблокирует доступ службы samba, чтобы решить эту проблему, выполним следующее:

firewall-cmd —permanent —zone=public —add-service=samba

 

firewall-cmd —reload

Настроить сетевой экран по всем правилам поможет специальная статья.

Теперь вы можете обмениваться файлами Centos 7.0 с windows, для этого в командной строке Win+R необходимо выполнить  \\centos:

Далее в windows откройте папку и попытайтесь создать текстовый документ, но при попытке создания документа появится сообщение об ошибке прав доступа.

Далее необходимо проверить права доступа для общего документа.

ls -l

 

drwxr-xr-x.

2 root root anonymous

Для получения прав доступа для анонимного пользователя введите следующее:

cd /samba

 

chmod -R 755 anonymous/

 

chown -R nobody:nobody anonymous/

 

ls -l anonymous/

 

total 0

 

drwxr-xr-x.

2 nobody nobody anonymous

Далее нам потребуется разрешение selinux для конфигурации samba:

chcon -t samba_share_t anonymous/

Теперь анонимный пользователь может создавать и просматривать cодержимое.

Можно выполнить встречную проверку следующим образом:

ls -l anonymous/

 

total 0

 

-rwxr—r—. 1 nobody nobody 0 anonymous.txt

 

[root samba]#

  1. Защищённый samba-сервер

Создадим группу smbgrp и пользователя dve для доступа к samba-серверу с необходимой аутентификацией:

groupadd smbgrp

 

useradd dve -G smbgrp

 

smbpasswd -a dve

 

[root samba]# smbpasswd -a dve

 

New SMB password:<-вашsambaпароль

 

Retype new SMB password:<—вашsambaпароль

 

Added user dve.

 

[root samba]#

Создадим папку secured в /samba и предоставим соответствующие права доступа:

mkdir -p /samba/secured

 

cd /samba && chmod -R 777 secured/

Теперь нам снова понадобится разрешение Selinux:

cd /samba

 

chcon -t samba_share_t secured/

Снова редактируем файл конфигурации /etc/samba/smb.conf:

[…]

 

[secured]

 

path = /samba/secured

 

valid users = @smbgrp

 

guest ok = no

 

writable = yes

 

browsable = yes

Далее потребуется перезапуск

systemctl restart smb.service

 

systemctl restart nmb.service

Теперь проверяем настройки хитрой командой testparm

[root]# testparm

 

Load smb config files from /etc/samba/smb.conf

 

rlimit_max: increasing rlimit_max (1024) to minimum Windows limit (16384)

 

Processing section «[Anonymous]»

 

Processing section «[secured]»

 

Loaded services file OK.

 

Server role: ROLE_STANDALONE

 

Press enter to see a dump of your service definitions <—нажмитеENTER

 

[global]

 

netbios name = CENTOS

 

server string = Samba Server %v

 

map to guest = Bad User

 

dns proxy = No

 

idmap config * : backend = tdb

 

[Anonymous]

 

path = /samba/anonymous

 

read only = No

 

guest ok = Yes

 

[secured]

 

path = /samba/secured

 

valid users = @smbgrp

 

read only = No

 

[root samba]#

 

browsable = yes.

Вы снова столкнётесь с проблемой прав доступа. Для получения прав доступа пользователя dve выполним:

cd /samba

 

chown -R dve:smbgrp secured//

Теперь пользователь samba имеет права доступа для записи в папку.

Автоматизированная установка Webmin из репозитория

Автоматизированная установка Webmin из репозитория

Что такое Webmin?

Webmin представляет собой веб-интерфейс для администрирования систем Unix. Используя любой современный веб-браузер, вы можете настроить учетные записи пользователей, Apache, DNS, файловый обмен и многое другое. Webmin устраняет необходимость вручную редактировать unix конфигурационные файлы типа: /etc/passwd, и позволяет управлять системой как с консоли, так и удаленно. Просмотрев страницу стандартных модулей, вы получите список всех функций, встроенных в Webmin. Так же просмотрите страницу скриншотов некоторых основных функций.

«установка из RPM» или все-таки «установка из репозитория»

При установке из RPM — «rpm -U webmin-1.470-1.noarch.rpm» вы не сможете обновить Webmin простым yum upgrade. Чтобы обновить при такой инсталляции вам нужно будет перезагрузить и переустановить RPM пакет вручную. Результат — невозможность автоматического обновления.

Когда Webmin установлен из репозитория, установка исправлений и патчей может быть автоматизирована как и другие системные обновления, и управляться при помощи YUM. Кроме того, демон yum-updates предупредит вас об обновлениях и(или) установит их в зависимости от заданных параметров.

Как установить Webmin из репозитория

Стать root-ом.

Копировать и вставить в консоль следующее:

 

(echo «[Webmin]

name=Webmin Distribution Neutral

baseurl=http://download.webmin.com/download/yum

enabled=1″ >/etc/yum.repos.d/webmin.repo

rpm —import http://www.webmin.com/jcameron-key.asc

yum -y install webmin)

 

Нажмите Enter, если команда не выполнится автоматически.

Ok. Репозиторий Webmin и приложение начнут установку.

Готово.

Отправка сообщений из консоли линукс в telegram

Производительность Соус

27 июля 2016 GMT

Дмитрий Попов

К тому же, чтобы быть превосходным открытым исходным кодом приложение для обмена сообщениями, Телеграмма имеет несколько хитрых трюков в рукаве. Это включает в себя поддержку ботов (или счетов , управляемых программным обеспечением) , которые могут быть поставлены в различных практических применений. В телеграмме-sendtool, например, использует бот Push — уведомления и файлы с машины Linux для телеграмм. Для того, чтобы установить телеграмму отправить на Ubuntu, выполните следующие команды:

sudo apt install python3-pip

sudo pip3 install telegram-send

После того, как вы сделали это, запустите sudo telegram-send —configure команду, создать новую телеграмму бот, введите свой маркер, и добавьте сгенерированный пароль.

Теперь вы можете нажать сообщения и файлы с вашего компьютера Linux в телеграмме. Для отправки сообщения, используйте telegram-send «O Hai World» команду. Отправка файлов одинаково легко: telegram-send —file monkey.jpg . телеграмма-отправки удобно интегрируется с браузером по умолчанию, так что вы можете отправить файл , щелкнув правой кнопкой мыши по нему и выбрав Телеграмма из Передать в контекстное меню.

ДАЛЬШЕ ОТ МЕНЯ

Сначала настраиваем безпарольный доступ (по сертификату)

Например по статье

SSH без пароля или аутентификация с использованием шифрованных ключей

 

Потом на удаленной машине даем право в sudoers на конкретный файл /usr/sbin/asterisk

 

User_Alias REMOTE_USER = serdag

serdag   ALL=/usr/sbin/asterisk    NOPASSWD: ALL

 

Вот мои скрипты на локальной машине:

#! /bin/bash
logfile=’/var/log/asterisk.log’
perc=`ssh serdag@192.168.0.5 ‘/usr/sbin/asterisk -rx «sip show peers»‘ | awk ‘ /online/ {print $5}’`
msg=’Telephons_online’
telegram-send $msg $perc
echo $msg $perc >> $logfile
perc=`ssh serdag@192.168.0.5 ‘/usr/sbin/asterisk -rx «sip show registry»‘ | awk ‘ /registrations/ {print $1}’`
msg=’Line_registered’
telegram-send $msg $perc
echo $msg $perc >> $logfile

Создаем задание в cron

echo «* 8 * * 1-5 /home/serdag/.bin/telegram_send» >> /var/spool/cron/serdag

ВСЕ!!!