<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>mysyslog.ru</title>
	<atom:link href="http://mysyslog.ru/feed" rel="self" type="application/rss+xml" />
	<link>http://mysyslog.ru</link>
	<description>Всякая IT всячина</description>
	<lastBuildDate>Sat, 17 Mar 2012 17:39:43 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>SSH fingerprint check</title>
		<link>http://mysyslog.ru/posts/657</link>
		<comments>http://mysyslog.ru/posts/657#comments</comments>
		<pubDate>Sat, 17 Mar 2012 16:59:25 +0000</pubDate>
		<dc:creator>constantine.malov</dc:creator>
				<category><![CDATA[Советы]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[ssh]]></category>

		<guid isPermaLink="false">http://mysyslog.ru/?p=657</guid>
		<description><![CDATA[В моем не очень продвинутом понимании работы SSH, сервер, при своем первом старте, создает пару ключей, закрытый и открытый. Открытый ключ отсылается клиенту в момент установки соединения. Клиент, в свою очередь, при установки соединения создает отпечаток ключа (fingerprint) и сохраняет его у себя в файле known_hosts.
При каждом новом соединении он проверяет полученный при первом соединении [...]]]></description>
			<content:encoded><![CDATA[<p>В моем не очень продвинутом понимании работы SSH, сервер, при своем первом старте, создает пару ключей, закрытый и открытый. Открытый ключ отсылается клиенту в момент установки соединения. Клиент, в свою очередь, при установки соединения создает отпечаток ключа (fingerprint) и сохраняет его у себя в файле known_hosts.</p>
<p>При каждом новом соединении он проверяет полученный при первом соединении отпечаток с тем. что был передан при новом соединении. Если они не отличаются, то все видимо хорошо. Если же они разные, то с большой вероятностью вы подключаетесь к хосту, который хочет выдать себя за кого-то другого. </p>
<p>В принципе эта проверка очень даже полезна, так как значительно снижает вероятность атаки &#8220;человек посередине&#8221;, но внутри собственной сети от нее часто больше бед, чем пользы. Уже несколько раз наталкивался в своей практике, как страдали бекапы через ssh от проверки fingerprint хоста. Как правило, такое происходит при переустановки ОС, смене доменного имени, или IP. Если машин немного &#8211; проблем особых нет, сам все вовремя отловишь. Но когда число серверов переваливает за второй десяток, да еще серверами и бекапами занимаются разные люди &#8211; быть беде.<br />
Решение есть &#8211; не проверять fingerprint. Конечно же оно связано с определенным риском получить MITM, так что нужно сперва взвесить все плюсы и минусы. Реализация же очень простая:</p>
<pre class="brush: plain;">ssh -o StrictHostKeyChecking=no host.ru</pre>
<p>Можно еще запретить добавление fingerprint в known_hosts</p>
<pre class="brush: plain;">ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null host.ru</pre>
<p><strong>Источник:</strong> <a href="http://linuxcommando.blogspot.com/2008/10/how-to-disable-ssh-host-key-checking.html">http://linuxcommando.blogspot.com</a></p>
]]></content:encoded>
			<wfw:commentRss>http://mysyslog.ru/posts/657/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FreeBSD timezone для России после перехода на летнее время.</title>
		<link>http://mysyslog.ru/posts/648</link>
		<comments>http://mysyslog.ru/posts/648#comments</comments>
		<pubDate>Fri, 12 Aug 2011 13:18:05 +0000</pubDate>
		<dc:creator>constantine.malov</dc:creator>
				<category><![CDATA[Советы]]></category>
		<category><![CDATA[daylight saving]]></category>
		<category><![CDATA[freebsd]]></category>
		<category><![CDATA[timezone]]></category>

		<guid isPermaLink="false">http://mysyslog.ru/?p=648</guid>
		<description><![CDATA[Этой весной в России отменили переход на летнее время. Хорошо это или плохо для всей страны &#8211; покажет время. Для нас же, юниксойдов, это скорее проблема. Нужно обновлять файлы timezone. Многие linux дистрибутивы уже это сделали, а вот старушка FreeBSD, как всегда, сама у себя на уме. В RELENG_8 все хорошо, а в старых системах [...]]]></description>
			<content:encoded><![CDATA[<p>Этой весной в России отменили переход на летнее время. Хорошо это или плохо для всей страны &#8211; покажет время. Для нас же, юниксойдов, это скорее проблема. Нужно обновлять файлы timezone. Многие linux дистрибутивы уже это сделали, а вот старушка FreeBSD, как всегда, сама у себя на уме. В RELENG_8 все хорошо, а в старых системах 7.X, 8.X чтобы обновиться, нужно допилить напильником. Ниже я дам несколько линков о теоретической части вопрос, а тут практика:<br />
1) Нужно достать новый файл с описанием европейских timezones.<br />
Сделать это можно или из cvs/svn FreeBSD RELENG_8 или с ftp проекта, который собственно на добровольных началах мейнтейнит базу всех timezone планеты (ftp://elsie.nci.nih.gov/pub/).<br />
2) После получения файла europe версии 8.33 или выше, его нужно положить в /usr/src/share/zoneinfo<br />
3) cd /usr/src/share/zoneinfo &#038;&#038; make clean ; make install clean<br />
4) Получили новые файлы в /usr/share/zoneinfo/<br />
5) Проверяем, что все ок. Делается это утилитой zdump, сейчас лето и старая зона должна показывать MSD для Москвы, и MSK для нового файла зоны. Причем время должно быть одинаковым.<br />
# zdump /usr/share/zoneinfo/Europe/Moscow<br />
/usr/share/zoneinfo/Europe/Moscow  Fri Aug 12 17:11:22 2011 MSK<br />
6) Если нужно, то копируем /usr/share/zoneinfo/Europe/Moscow в /etc/localtime</p>
<p><strong>Линки:</strong><br />
<a href="http://www.opennet.ru/base/sys/date_and_time.txt.html">Статья про время в linux на opennet</a><br />
<a href="http://ru.wikipedia.org/wiki/Tz_database">Tz database</a> </p>
<p><strong>P.S</strong><br />
Я написал соответствующий PR в FreeBSD, с запросом как же быть с системами, которые будут поддерживать еще несколько лет (7.3 например), но имеют старые файлы зон для России. Мне вежливо ответили, что понимают мое беспокойство, но ничего сделать не могут. В базовую систему изменения вносятся только в случае проблем с безопасностью. Т.е. ждем, когда кто-нибудь придумает, как использовать старый файл зоны для проникновения в систему? Забавно.</p>
<p><strong>P.S 2</strong><br />
Как мне подсказал Максим Коновалов из Russian FreeBSD Team, можно использовать порт:<br />
misc/zoneinfo </p>
<p><strong>P.S 3</strong><br />
Самый простой и самый некрасивый вариант:<br />
cp /usr/share/zoneinfo/Etc/GMT+4 /etc/localtime</p>
]]></content:encoded>
			<wfw:commentRss>http://mysyslog.ru/posts/648/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>sysctl.conf.local или как настроить sysctl не ломая стандартизацию</title>
		<link>http://mysyslog.ru/posts/643</link>
		<comments>http://mysyslog.ru/posts/643#comments</comments>
		<pubDate>Mon, 28 Feb 2011 13:03:19 +0000</pubDate>
		<dc:creator>constantine.malov</dc:creator>
				<category><![CDATA[Советы]]></category>
		<category><![CDATA[freebsd]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://mysyslog.ru/?p=643</guid>
		<description><![CDATA[Часто парк серверов не такой уж стандартный, как того хотелось бы. И в тоже время хочется держать стандартные настройки на всех серверах, чтобы обновлять и изменять их особо не парясь&#8230; Это я к чему? Возникла задача поменять sysctl.conf на одном из серверов, но sysctl.conf должен быть стандартным на всех серверах! Вот незадача! Что же делать?
Ради [...]]]></description>
			<content:encoded><![CDATA[<p>Часто парк серверов не такой уж стандартный, как того хотелось бы. И в тоже время хочется держать стандартные настройки на всех серверах, чтобы обновлять и изменять их особо не парясь&#8230; Это я к чему? Возникла задача поменять sysctl.conf на одном из серверов, но sysctl.conf должен быть стандартным на всех серверах! Вот незадача! Что же делать?<br />
Ради интереса посмотрел содержание /etc/rc.d/sysctl и нашел в нем</p>
<pre class="brush: bash;">
sysctl_start()
{
        parse_file /etc/sysctl.conf $1
        parse_file /etc/sysctl.conf.local $1
}
</pre>
<p>Разработчики FreeBSD уже подумали о этой проблеме =) Все кастумные настройки добавляем в /etc/sysctl.conf.local</p>
]]></content:encoded>
			<wfw:commentRss>http://mysyslog.ru/posts/643/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Эмулирование Unix команд при помощи sed</title>
		<link>http://mysyslog.ru/posts/637</link>
		<comments>http://mysyslog.ru/posts/637#comments</comments>
		<pubDate>Wed, 02 Feb 2011 08:42:26 +0000</pubDate>
		<dc:creator>constantine.malov</dc:creator>
				<category><![CDATA[Новости]]></category>

		<guid isPermaLink="false">http://mysyslog.ru/?p=637</guid>
		<description><![CDATA[Набрел на интересную страничку. sed во всей своей красе.

UNIX          &#124;  SED
--------------+----------------------------------------------------------------
 cat          &#124;  sed ':'
 cat -s       &#124;  sed '1s/^$//p;/./,/^$/!d'
 tac        [...]]]></description>
			<content:encoded><![CDATA[<p>Набрел на <a href="http://sed.sourceforge.net/local/docs/emulating_unix.txt">интересную страничку</a>. sed во всей своей красе.</p>
<pre class="brush: bash;">
UNIX          |  SED
--------------+----------------------------------------------------------------
 cat          |  sed ':'
 cat -s       |  sed '1s/^$//p;/./,/^$/!d'
 tac          |  sed '1!G;h;$!d'
 grep         |  sed '/patt/!d'
 grep -v      |  sed '/patt/d'
 head         |  sed '10q'
 head -1      |  sed 'q'
 tail         |  sed -e ':a' -e '$q;N;11,$D;ba'
 tail -1      |  sed '$!d'
 tail -f      |  sed -u '/./!d'
 cut -c 10    |  sed 's/\(.\)\{10\}.*/\1/'
 cut -d: -f4  |  sed 's/\(\([^:]*\):\)\{4\}.*/\2/'
 tr A-Z a-z   |  sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'
 tr a-z A-Z   |  sed 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'
 tr -s ' '    |  sed 's/ \+/ /g'
 tr -d '&#92;&#48;12' |  sed 'H;$!d;g;s/\n//g'
 wc -l        |  sed -n '$='
 uniq         |  sed 'N;/^\(.*\)\n\1$/!P;D'
 rev          |  sed '/\n/!G;s/\(.\)\(.*\n\)/&amp;\2\1/;//D;s/.//'
 basename     |  sed 's,.*/,,'
 dirname      |  sed 's,[^/]*$,,'
 xargs        |  sed -e ':a' -e '$!N;s/\n/ /;ta'
 paste -sd:   |  sed -e ':a' -e '$!N;s/\n/:/;ta'
 cat -n       |  sed '=' | sed '$!N;s/\n/ /'
 grep -n      |  sed -n '/patt/{=;p;}' | sed '$!N;s/\n/:/'
 cp orig new  |  sed 'w new' orig
 hostname -s  |  hostname | sed 's/\..*//'
</pre>
]]></content:encoded>
			<wfw:commentRss>http://mysyslog.ru/posts/637/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>tcp listen queue в Linux</title>
		<link>http://mysyslog.ru/posts/633</link>
		<comments>http://mysyslog.ru/posts/633#comments</comments>
		<pubDate>Mon, 31 Jan 2011 08:44:37 +0000</pubDate>
		<dc:creator>constantine.malov</dc:creator>
				<category><![CDATA[Советы]]></category>
		<category><![CDATA[centos]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[network]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://mysyslog.ru/?p=633</guid>
		<description><![CDATA[В FreeBSD netstat отличается от netstat linux, причем в лучшую сторону!
Например, netstat -Lan покажет listen queue, что иногда нужно для дебага непонятных проблем. Но в linux аналога нет! ( есть какие-то самодельные патчи на netstat с требованием к ядру 2.6.18+ =) ).
Что же делать? Awk спешит на помощь!

Если процесс все еще в listen queue, но [...]]]></description>
			<content:encoded><![CDATA[<p>В FreeBSD netstat отличается от netstat linux, причем в лучшую сторону!<br />
Например, netstat -Lan покажет listen queue, что иногда нужно для дебага непонятных проблем. Но в linux аналога нет! ( есть какие-то самодельные патчи на netstat с требованием к ядру 2.6.18+ =) ).<br />
Что же делать? Awk спешит на помощь!<br />
<span id="more-633"></span><br />
Если процесс все еще в listen queue, но соединение уже установлено, то netstat -nap будет показывать его уже как  ESTABLISHED. Причем в качестве процесса будет указан &#8220;-&#8221;, т.е. accept() для него еще не был вызван. Нужно учесть, что это при включенных syncookies, Иначе, например, SYN_RCVD тоже нужно будет учитывать.<br />
Если мы посчитаем все такие соединения, то как раз получим число соединений в listen queue. Тут очень помогает awk =)</p>
<pre class="brush: bash;">
netstat -ntp --tcp | fgrep ESTABLISHED | awk '{ if ($7 == &quot;-&quot;) arrQueue[$4]=arrQueue[$4]+1; } END { for (service in arrQueue) print service&quot; &quot;arrQueue[service]}'
</pre>
<p>Так же awk может показать сколько памяти (в КБ) расходует сетевая подсистема. Делается это опять же при помощи netstat </p>
<pre class="brush: bash;">
netstat -na | awk 'BEGIN { RecvQ=0; SendQ=0; } { RecvQ+=$2; SendQ+=$3; } END { print &quot;RecvQ &quot; RecvQ/1024; print &quot;SendQ &quot; SendQ/1024; }'
</pre>
]]></content:encoded>
			<wfw:commentRss>http://mysyslog.ru/posts/633/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Изучаем top в FreeBSD</title>
		<link>http://mysyslog.ru/posts/628</link>
		<comments>http://mysyslog.ru/posts/628#comments</comments>
		<pubDate>Wed, 08 Dec 2010 13:30:11 +0000</pubDate>
		<dc:creator>constantine.malov</dc:creator>
				<category><![CDATA[Советы]]></category>
		<category><![CDATA[environment]]></category>
		<category><![CDATA[freebsd]]></category>

		<guid isPermaLink="false">http://mysyslog.ru/?p=628</guid>
		<description><![CDATA[Вообще, все что я тут буду рассказывать есть или в help top (нажми h во время работы top), или есть в man top.
Если тебе лень их читать (что я, конечно же, не одобряю), то эта заметка для тебя, и мне шпаргалка.
Что такое top и зачем он нужен, я писать не буду, поговорим о приятных возможностях.
Еще [...]]]></description>
			<content:encoded><![CDATA[<p>Вообще, все что я тут буду рассказывать есть или в help top (нажми h во время работы top), или есть в <strong>man top</strong>.<br />
Если тебе лень их читать (что я, конечно же, не одобряю), то эта заметка для тебя, и мне шпаргалка.<br />
Что такое top и зачем он нужен, я писать не буду, поговорим о приятных возможностях.<br />
Еще хочу заметить, что top меняется вместе с системой, что-то добавляется, что-то меняется, что-то исчезает. Все опции здесь взяты для freebsd 7.3, как наиболее надежной в данный момент. И так поехали!<br />
<span id="more-628"></span><br />
1) Как правило, мы хотим увидеть в top какие-то работающие процессы, которые грузят систему, все остальные только затуманивают нам взгляд.<br />
Так что их лучше отключить! Для этого нужно запустить top с ключем <strong>-I</strong>, или во время работы нажать <strong>i</strong> (повторное нажатие вернет все обратно).</p>
<p>2) Такие процессы, как mysql используют потоки, которые top не выводит отдельными строчками, а показывает сколько потоков у данного процесса в поле THR. Можно заставить показывать каждый поток отдельно, для этого нужно запустить top с ключом <strong>-H</strong> или нажать <strong>H</strong> в процессе работы.</p>
<p>3) Jail &#8211; замечательный механизм изоляции различных окружений на одной машине.<br />
top позволяет определить какому из jail принадлежит процесс при помощи jail id. 0 &#8211; это host система, остальные номера смотрим через jls. Или при запуске нужно запустить top с ключом <strong>-j</strong>, или при работе нажать <strong>j</strong>.</p>
<p>4) Поиск утилизирующего диск приложения &#8211; top помогает и с этой задачей.<br />
Опция <strong>-m</strong> с параметром <strong>io</strong> (или <strong>m</strong> в процессе работы) переводит top в режим отображения IO активности, вместо CPU. Очень полезно. </p>
<p>5) Опция -S показывает системные процессы, полезная опция на загруженных системах.<br />
Например, можно подсмотреть сколько процессора потребляет работа сетевой карты, выглядит это примерно так:</p>
<pre class="brush: plain;">39 root          1 -68    -     0K    16K WAIT    6 117.6H  8.69% irq256: em0</pre>
<p>6) Все мы уже привыкли, что процессоров у нас много, ядер в них тоже много и SMP включен, но top упорно показывает всего одну строчку про процессор:</p>
<pre class="brush: plain;"> CPU:  0.4% user,  1.6% nice,  1.4% system,  1.4% interrupt, 95.3% idle</pre>
<p>Можно заставить top показывать статистику по каждому ядру/процессору, для этого нужно указать опцию <strong>-P</strong>.<br />
Возможность была бы совершенно бесполезная, если бы не cpuset! (читайте <strong>man cpuset</strong>). </p>
<p>7) Частота обновления top задается опцией <strong>-s</strong> в качестве параметра нужно указать время в секундах. В время работы меняется нажатием <strong>s</strong>.</p>
<p>Вот и все про top!</p>
]]></content:encoded>
			<wfw:commentRss>http://mysyslog.ru/posts/628/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Обработка сигналов в sh</title>
		<link>http://mysyslog.ru/posts/621</link>
		<comments>http://mysyslog.ru/posts/621#comments</comments>
		<pubDate>Thu, 02 Dec 2010 14:39:58 +0000</pubDate>
		<dc:creator>constantine.malov</dc:creator>
				<category><![CDATA[Советы]]></category>
		<category><![CDATA[scripting]]></category>
		<category><![CDATA[sh]]></category>

		<guid isPermaLink="false">http://mysyslog.ru/?p=621</guid>
		<description><![CDATA[Сигналы &#8211; один из способов взаимодействия между процессами. Отправив определенный сигнал, можно приостановить или возобновить работы приложения, завершить его или сделать с ним еще что-нибудь. Сигнал определяется номером, которому соответствие имя. Посмотрите man signal или наберите kill -l чтобы получить список сигналов.
В скриптах обработка сигналов может быть крайне полезна.

 Например, ваш скрипт выполняет обновление системы [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Сигналы</strong> &#8211; один из способов взаимодействия между процессами. Отправив определенный сигнал, можно приостановить или возобновить работы приложения, завершить его или сделать с ним еще что-нибудь. Сигнал определяется номером, которому соответствие имя. Посмотрите <strong>man signal</strong> или наберите <strong>kill -l</strong> чтобы получить список сигналов.<br />
В скриптах обработка сигналов может быть крайне полезна.<br />
<span id="more-621"></span><br />
 Например, ваш скрипт выполняет обновление системы и тут происходит разрыв соединения с сервером&#8230; что получится в результате сказать сложно, скорее всего ничего хорошего. Конечно же можно запустить процесс через <strong>nohup</strong>, но можно поступить иначе &#8211; вписать обработку сигналов.<br />
 Или другой пример, скрипт в течение своей работы создает временные файлы, которые потом удаляются, но при нажатии <strong>Ctrl+С</strong> он завершит свою работу сразу и никакой чистки данных выполнять не будет. Но если обработать сигнал, то можно завершить работы скрипта куда элегантнее.<br />
Для обработки сигналов в sh используется встроенная команда trap, формат ее такой</p>
<pre class="brush: plain;">trap [action] signal ...</pre>
<p>Т.е. команде нужно передать как минимум два параметра, действие при получении сигнала и сигнал, для которого будет выполняться указанное действие. Сигналов можно указать несколько подряд. В качестве пример напишем скрипт, которые при получении SIGHUP будет продолжать работать. Т.е. при закрытии консоли, в которое выполняется наш скрипт, он спокойно продолжит выполнение, а не завершится. При получении SIGINT скрипт удалит временные файлы и завершит работу, SIGINIT вызывается при нажатии Ctrl+C.</p>
<pre class="brush: bash;">
#!/bin/sh

TEMPFILE=`mktemp /tmp/XXXXXXX`

signalhandler() {
  local signal=$1

  case $signal in
    SIGHUP)
      echo &quot;Do nothing&quot;
    ;;
    SIGINT)
      rm -f $TEMPFILE
      exit
    ;;
  esac
}

trap &quot;signalhandler SIGINT &quot;  SIGINT
trap &quot;signalhandler SIGHUP &quot;  SIGHUP

# do something good

rm -f $TEMPFILE
exit 0
</pre>
<p>Для обработки сигналов используется наша функция <strong>signalhandler</strong>, которая в качестве параметра принимает имя сигнала, и в зависимости от него выполняет разные действия. Чтобы передать разные имена сигналов приходится вызывать trap несколько раз.<br />
Как видите, все просто. </p>
]]></content:encoded>
			<wfw:commentRss>http://mysyslog.ru/posts/621/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>sed tips and tricks</title>
		<link>http://mysyslog.ru/posts/598</link>
		<comments>http://mysyslog.ru/posts/598#comments</comments>
		<pubDate>Wed, 24 Nov 2010 16:06:20 +0000</pubDate>
		<dc:creator>constantine.malov</dc:creator>
				<category><![CDATA[Новости]]></category>
		<category><![CDATA[scripting]]></category>

		<guid isPermaLink="false">http://mysyslog.ru/?p=598</guid>
		<description><![CDATA[Sed &#8211; прекрасное средство редактирования текста с отвратительной документацией. В скриптах он часто бывает незаменим, но чтобы выполнить что-то непривычное приходится долго искать интернете нужный пример или долго экспериментировать с разными вариантами. Очень неудобно!
Так что сделаю сделаю себе памятку!

1) Разделители в sed
Часто нужно поменять какие-то пути в файлах и выглядит это страшно, примерно так:
echo $PATH [...]]]></description>
			<content:encoded><![CDATA[<p>Sed &#8211; прекрасное средство редактирования текста с отвратительной документацией. В скриптах он часто бывает незаменим, но чтобы выполнить что-то непривычное приходится долго искать интернете нужный пример или долго экспериментировать с разными вариантами. Очень неудобно!<br />
Так что сделаю сделаю себе памятку!<br />
<span id="more-598"></span><br />
<strong>1) Разделители в sed</strong><br />
Часто нужно поменять какие-то пути в файлах и выглядит это страшно, примерно так:</p>
<pre class="brush: bash;">echo $PATH | sed s'/\/etc/\/usr\/local\/etc/g'</pre>
<p>Читать это невозможно, да и ошибиться с экранирование легче легкого!<br />
На самом деле sed воспринимает и другие символы в качестве разделителей, а использование &#8216;/&#8217; является &#8220;исторической традицией&#8217;. Данную конструкцию легко заменить на такую:</p>
<pre class="brush: bash;">echo $PATH | sed s':/etc:/usr/local/etc:g'</pre>
<p>Или такую:</p>
<pre class="brush: bash;">echo $PATH | sed s'|/etc|/usr/local/etc|g'</pre>
<p>Согласитесь, так намного лучше!</p>
<p>2) <strong>Выполнение нескольких команд sed подряд</strong><br />
Иногда нужно выполнить несколько команд подряд, самый простой способ &#8211; сделать несколько pipe, но выглядит это так себе.</p>
<pre class="brush: bash;">echo &quot;New string&quot; | sed 's/New/Old/' | sed 's/string/letter/'</pre>
<p>Вместо этого можно задать последовательность при помощи опции <strong>-e</strong>:</p>
<pre class="brush: bash;">echo &quot;New string&quot; | sed -e 's/New/Old/' -e 's/string/letter/'</pre>
<p>Или можно задать последовательность команд через &#8216;;&#8217;:</p>
<pre class="brush: bash;">echo &quot;New string&quot; | sed 's/New/Old/; s/string/letter/'</pre>
<p>3) <strong>Экранирование команд sed в разных оболочках</strong><br />
Очень важная тема, особенно в контексте написания скриптов. Например если <strong>/bin/csh</strong> ввести такую команду:</p>
<pre class="brush: bash;">cat /etc/resolv.conf | sed /search/ a\
nameserver 127.0.0.1 \
'
sed: 1: &quot;/search/ a
1 ...&quot;: command a expects \ followed by text
</pre>
<p>Получаем неприятную ошибку вместо ожидаемого результата. Решение &#8211; добавить еще один &#8216;\&#8217; после &#8216;a\&#8217;:</p>
<pre class="brush: bash;">cat /etc/resolv.conf | sed /search/ a\ \
nameserver 127.0.0.1 \
'
</pre>
<p>В общем случае для <strong>sed в C shell</strong> экранировать нужно так:</p>
<pre class="brush: bash;">
#!/bin/csh -f
sed 's/a/A/g \
s/e/E/g \
s/i/I/g \
s/o/O/g \
s/u/U/g' &lt;old&gt;new
</pre>
<p>Для <strong>Bash</strong> все проще:</p>
<pre class="brush: bash;">
#!/bin/sh
sed '
s/a/A/g
s/e/E/g
s/i/I/g
s/o/O/g
s/u/U/g' &lt;old &gt;new
</pre>
<p>4) <strong>Основные команды sed</strong></p>
<table style="height: 17px;" border="0" width="129">
<tbody>
<tr>
<td>Команда</td>
<td>Описание</td>
</tr>
<tr>
<td>p</td>
<td>Вывести адресуемую строку</td>
</tr>
<tr>
<td>=</td>
<td>Вывести адреса адресуемых строк</td>
</tr>
<tr>
<td>a</td>
<td>Добавление текста после адресуемой строки</td>
</tr>
<tr>
<td>i</td>
<td>Добавление текста перед адресуемой строкой</td>
</tr>
<tr>
<td>с</td>
<td>Замена адресуемой строки блоком указанного текста</td>
</tr>
<tr>
<td>d</td>
<td>Удаление адресуемой строки</td>
</tr>
</tbody>
</table>
<p>Собственно они есть в любом нормальном описании по sed, здесь я их привожу, как шпаргалку и за одно несколько примеров.<br />
Поиск номера строки по определенному шаблону, опция -n запрещает вывод всех остальных строк:</p>
<pre class="brush: bash;">cat /path/to/file | sed -n '/some/='</pre>
<p>Поиск строки по шаблону:</p>
<pre class="brush: bash;">cat /path/to/file | sed -n '/some/p'</pre>
<p>Удалим все строки со словом some из файла /path/to/file:</p>
<pre class="brush: bash;">sed -I '' -e '/some/d' /path/to/file</pre>
<p>Удалим строки с первой по третью:</p>
<pre class="brush: bash;">sed -I '' -e '1,3d' /path/to/file</pre>
<p>Удалим последнюю строку</p>
<pre class="brush: bash;">sed -I '' -e '$d' /path/to/file</pre>
<p>Опция -I нужна для редактирования указанного файла, а параметр &#8221; говорит, что не нужно создавать резервную копию.<br />
Добавление и изменение строк работает аналогично.</p>
<p>5) <strong>Хорошая документация по sed</strong><br />
В принципе для какого-то просто скриптинга всех этих приемов более чем хватает, но всегда может получить больше, например на <a href="http://www.grymoire.com/Unix/Sed.html">сайте</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://mysyslog.ru/posts/598/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Поиск измененных конфигурационных файлов FreeBSD</title>
		<link>http://mysyslog.ru/posts/591</link>
		<comments>http://mysyslog.ru/posts/591#comments</comments>
		<pubDate>Wed, 17 Nov 2010 12:40:53 +0000</pubDate>
		<dc:creator>constantine.malov</dc:creator>
				<category><![CDATA[Советы]]></category>
		<category><![CDATA[freebsd]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://mysyslog.ru/?p=591</guid>
		<description><![CDATA[В продолжение темы mergemaster и обновления системы. Как найти конфигурационные файлы, которые были изменены с момента установки системы? Очень просто &#8211; сравнить их с файлами &#8220;из коробки&#8221;.

Для этого нужно получить исходные коды FreeBSD для установленной версии и собрать из них в сторонке temproot. Вот как это делается в mergemaster:

#!/bin/sh

TEMPROOT=/var/tmp/temproot
ARCH=`uname -p`

if [ -d ${TEMPROOT} ]; then
 [...]]]></description>
			<content:encoded><![CDATA[<p>В продолжение темы mergemaster и обновления системы. Как найти конфигурационные файлы, которые были изменены с момента установки системы? Очень просто &#8211; сравнить их с файлами &#8220;из коробки&#8221;.<br />
<span id="more-591"></span><br />
Для этого нужно получить исходные коды FreeBSD для установленной версии и собрать из них в сторонке temproot. Вот как это делается в mergemaster:</p>
<pre class="brush: bash;">
#!/bin/sh

TEMPROOT=/var/tmp/temproot
ARCH=`uname -p`

if [ -d ${TEMPROOT} ]; then
     chflags -R noschg ${TEMPROOT}
     rm -rf ${TEMPROOT}
fi
mkdir ${TEMPROOT}

od=${MAKE_TEMPROOT}/usr/obj
make_opts=&quot;TARGET_ARCH=${ARCH} -m /usr/src/share/mk&quot;

make $make_opts DESTDIR=${TEMPROOT} distrib-dirs
MAKEOBJDIRPREFIX=$od make $make_opts _obj SUBDIR_OVERRIDE=etc
MAKEOBJDIRPREFIX=$od make $make_opts everything SUBDIR_OVERRIDE=etc
MAKEOBJDIRPREFIX=$od make $make_opts DESTDIR=${TEMPROOT} distribution

rm -f ${TEMPROOT}/etc/*.db ${TEMPROOT}/etc/passwd
find ${TEMPROOT}/usr/obj -type f -delete
find ${TEMPROOT} -type f -size 0 -delete
</pre>
<p>Теперь нужно сравнить /var/tmp/temproot с корнем, делаем это вот таким скриптом</p>
<pre class="brush: bash;">
#!/bin/sh
cd /var/tmp/temproot/

for file in `find . -type f`; do
  root_file=&quot;/jail/dnl/&quot;${file#./}
  if [ `md5 -q $file` != `md5 -q $root_file` ]; then
    echo file $root_file changed
  fi
done
</pre>
<p>Получаем список файлов, которые изменились по сравнению с системой из коробки. </p>
]]></content:encoded>
			<wfw:commentRss>http://mysyslog.ru/posts/591/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mergemaster tips and tricks!</title>
		<link>http://mysyslog.ru/posts/553</link>
		<comments>http://mysyslog.ru/posts/553#comments</comments>
		<pubDate>Sun, 14 Nov 2010 19:18:07 +0000</pubDate>
		<dc:creator>constantine.malov</dc:creator>
				<category><![CDATA[Статьи]]></category>
		<category><![CDATA[freebsd]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://mysyslog.ru/?p=553</guid>
		<description><![CDATA[При переходе с версии на версию FreeBSD самым неприятным этапом является обновление конфигурационных файлов. mergemaster отнимает массу времени и сил, требует аккуратности и внимательности. Это наверное один из самых неудобных инструментов FreeBSD!
Но на самом деле это не совсем так! Если внимательно изучить, как он работает и разобраться с его ключами, то можно значительно упростить себе [...]]]></description>
			<content:encoded><![CDATA[<p>При переходе с версии на версию FreeBSD самым неприятным этапом является обновление конфигурационных файлов. mergemaster отнимает массу времени и сил, требует аккуратности и внимательности. Это наверное один из самых неудобных инструментов FreeBSD!<br />
Но на самом деле это не совсем так! Если внимательно изучить, как он работает и разобраться с его ключами, то можно значительно упростить себе жизнь. Не скажу, что обновление станет приятным, но уж оно точно перестанет быть такой головной болью.<br />
<span id="more-553"></span><br />
<strong>Как работает mergemaster</strong></p>
<p>mergemaster &#8211; это обычный shell скрипт! Очень длинный, слегка запутанные и требующий неплохого знания программирования на sh (man sh, man test, man mtree вам в помощь!), но все же всего лишь скрипт.<br />
Если очень упрощенно рассказывать, как он работает, то получится примерно такая схема:</p>
<ul>
<li>Из свежих /usr/src собирается новый корень в отдельном каталоге. По умолчанию это /var/tmp/temproot</li>
<li>Запускается цикл сравнения всех файлов из нового корня с аналогичными по названию файлами в текущем корне</li>
<li>По результатам сравнения принимается решение, что делать с этим файлом</li>
</ul>
<p>Результатов сравнения может быть не так много:<br />
1) Файл есть в новом корне, но нет в текущем<br />
2) Файлы не отличаются<br />
3) Файлы имеют разный тип (например в текущем корне это линк, а в новом обычный файл<br />
4) Файлы отличаются<br />
Но вот число файлов при проверке исчисляется сотнями.<br />
Если запускать mergemaster с минимальным набором опций и без подготовки, то вся тяжесть выбора ложится на системного администратора. Но выход есть, и есть он в самом mergemaster!<br />
Скрипт имеет несколько механизмов автоматического выбора действия при сравнении.</p>
<p><strong>Механизмы автоматического выбора</strong></p>
<ul>
<li>1) mtree база данных</li>
</ul>
<p>Допустим у нас есть конфигурационный файл, который никак не менялся пользователем. Значит его можно спокойно обновить до новой версии, так как никаких правок, специфичных для данного сервера в него не вносилось. Логика простая, но как узнать, что файл не изменился с момента установки системы?<br />
Ответом может стать утилита mtree. При ее помощи можно создать текущий снимок дерева каталогов (права и размер файлов их чексуммы и т.п.). Такую базу данных можно использовать для сравнения с состоянием того же дерева каталогов, но в другой момент времени. mtree покажет, какие файлы изменились.<br />
mergemaster активно использует mtree, и в конце своей работы создает снимок системы. При следующем запуске mergmaster, он вам задаст куда меньше вопросов, чем прошлый раз именно потому, что теперь у него есть база mtree.<br />
Проблема в том, что при установки сервера никто такую базу специально не делает и потому первое обновление будет очень долгим.<br />
Но можно создать такую базу самому, делается это так:</p>
<pre class="brush: bash;">
mtree -ci -p / -k size,time, md5digest -X /usr/src/exclude.list &gt; /var/db/mergemaster.mtree
</pre>
<p>/usr/src/exclude.list  &#8211; это текстовый файл с элементами, которые не стоит включать в базу mtree. Это значительно уменьшает время ее создания и время проверки.</p>
<pre class="brush: bash;">
cat /usr/src/exclude.list
./usr/src/*
./usr/obj/*
./usr/.snap/*
./jail/*
./usr/ports/*
</pre>
<p>/var/db/mergemaster.mtree &#8211; это путь, где mergemaster будет искать базу данных mtree.<br />
Как mergemaster использует mtree? При запуске скрипт проверяет, есть ли файл mtree. Если он его находит, то сравнивает корень с ним. Получается список измененных файлов.<br />
При сравнении всех файлов из нового корня с текущем, если файл изменился, то проверяется, есть ли этот файл в списке измененных файлов, полученный из mtree. Если в списке его нет, то mergemaster просто заменит файл (нужно указать ключ -U), если файл есть в списке, то будет выведен diff двух файлов и решение об обновлении придется принимать вам.<br />
<strong>Но что же делать, если при первой настройке сервера mtree базу данных никто не делал? Ведь если создать ее сразу перед выполнением mergemaster все файлы будут считаться неизмененными? Т.е. с ключом -U mergemaster обновить нам все файлы, даже те, которые мы совсем не хотим обновлять (/etc/group /etc/master.passwd и еще массу полезных файлов)?    </strong> В общем-то да, так и будет, из обновления систему получится катастрофа, но выход есть в разделе 3) mergemaster.rc и IGNORE_FILES</p>
<ul>
<li>2) Теги в файлах конфигов</li>
</ul>
<p>Если выбрать какой-нибудь системный конфиг FreeBSD, то вы сразу заметете в его шапке что-то похожее на:<br />
<em># $FreeBSD: src/etc/group,v 1.35.8.1 2009/04/15 03:14:26 kensmith Exp $</em><br />
Это тег файла, при его помощи определяют версию конфига. Но фишка в том, что в файле от релиза к релизу может измениться только сам тег, а конфиг ничем не будет отличаться. Т.е. вполне логично, что если в файле изменился только тег, то стоит его просто заменить. Именно так и работает mergemaster c ключом -F. <strong>Всегда ставьте ключ -F при запуске mergemaster!</strong></p>
<ul>
<li>3) mergemaster.rc и IGNORE_FILES</li>
</ul>
<p>Было бы здорово заставить mergemaster не проверять какие-то файлы вообще. Например /etc/group или /etc/master.passwd. Видимо такая мысль пришла в голову автора mergemaster и он реализовал ее через переменную IGNORE_FILES. Для хранения таких переменных используется файл /etc/mergemaster.rc. В IGNORE_FILES нужно добавить не такой большой список файлов, но жизнь это упростит значительно:<br />
<em>IGNORE_FILES=&#8217;/etc/master.passwd /etc/group /etc/mail/aliases /etc/sysctl.conf /etc/syslog.conf /etc/newsyslog.conf /etc/crontab /etc/login.conf /etc/ssh/sshd_config /root/.cshrc /.cshrc&#8217; </em><br />
Теперь можно смело создавать базу mtree перед запуском mergemaster, все нужные файлы мы &#8220;защитили&#8221;.<br />
Тут правда есть одна проблема проблема! Мы можем разойтись с новой версией в опциях, которые вообще-то было бы лучше установить. Т.е. нам нужно смерджить эти файлы с новыми конфигами или хотя бы узнать, что в них изменилось. Как подсмотреть, что же изменилось я расскажу в 6) Подсматриваем в /usr/src</p>
<ul>
<li>4) А если нет такого файла?</li>
</ul>
<p>Может так случиться, что появится какой-то новый конфигурационный файл, которого в прошлой версии не было. Логично его просто скопировать, а не спрашивать, что же с ним делать у администратора. Именно так и сделает megremaster, если указать ключ <strong>-i</strong>.</p>
<ul>
<li>5) На всякий случай все сохраняем</li>
</ul>
<p>Вообще сохранить конфиги перед тем, как что-то делать с ними &#8211; хорошая идея. И эта идея реализована в mergemaster. Если задать ключ -P, то будет создан каталог /var/tmp/mergemaster. В нем можно будет найти копию измененных файлов.</p>
<ul>
<li>6) Подсматриваем в /usr/src</li>
</ul>
<p>Нам нужно сравнить текущие файлы, которые мы решили не обновлять и эти же файлы в новой версии. Ничего нет проще! В каталоге /usr/src/etc лежат все конфиги. Например, мы хотим узнать не появилось ли каких-то новых системных пользователей:</p>
<pre class="brush: bash;">
diff -u /etc/master.passwd /usr/src/etc/master.passwd
</pre>
<p>Собираем все вместе:<br />
1 ) Создаем /etc/mergemaster.rc со списком IGNORE_FILES<br />
2 ) Создаем базу mtree<br />
3 ) делаем csup<br />
4 ) собираем ядро и мир<br />
5 ) устанавливаем ядро<br />
6 ) запускаем mergemaster -piUP<br />
7 ) устанавливаем мир<br />
8 ) mergemaster -iUFP<br />
9 ) Удаляем старые файлы и либы </p>
]]></content:encoded>
			<wfw:commentRss>http://mysyslog.ru/posts/553/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

