<?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>sveshnikov.ru - это наилучший источник информации по теме unix perl shell и всего такого &#187; tips</title>
	<atom:link href="http://alexey.sveshnikov.ru/blog/tag/tips/feed/" rel="self" type="application/rss+xml" />
	<link>http://alexey.sveshnikov.ru/blog</link>
	<description>bookmarks-on-tranquilizers</description>
	<lastBuildDate>Tue, 25 May 2010 20:30:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Магия в zsh</title>
		<link>http://alexey.sveshnikov.ru/blog/2008/11/04/zsh-magi/</link>
		<comments>http://alexey.sveshnikov.ru/blog/2008/11/04/zsh-magi/#comments</comments>
		<pubDate>Mon, 03 Nov 2008 22:02:47 +0000</pubDate>
		<dc:creator>Alexey Sveshnikov</dc:creator>
				<category><![CDATA[SHELL]]></category>
		<category><![CDATA[UNIX]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[magic]]></category>
		<category><![CDATA[zsh]]></category>

		<guid isPermaLink="false">http://alexey.sveshnikov.ru/blog/?p=88</guid>
		<description><![CDATA[Захотелось мне в этот чудесный выходной понедельник поагитировать за свой любимый шелл. Чем, кстати, вообще может похвастаться какой-либо шелл, имея в конкурентах такого монстра, как bash? Ведь в bash есть все, что может только пожелать обычный пользователь. А, собственно, и нечем. Поэтому разработчикам zsh пришлось пойти на хитрость и добавить в свое детище некоторое количество [...]]]></description>
			<content:encoded><![CDATA[<p>Захотелось мне в этот чудесный выходной понедельник поагитировать за свой любимый шелл. Чем, кстати, вообще может похвастаться какой-либо шелл, имея в конкурентах такого монстра, как bash? Ведь в bash есть все, что может только пожелать обычный пользователь. А, собственно, и нечем. Поэтому разработчикам zsh пришлось пойти на хитрость и добавить в свое детище некоторое количество магии :)</p>
<p>Большая ее порция досталась подсистеме автодополнения. Вот таким можно сделать дополнение имен файлов:<br />
<img src="http://alexey.sveshnikov.ru/blog/wp-content/uploads/2008/11/zsh-menu-completion.png" alt="zsh menu completion" title="zsh menu completion" width="500" height="132" class="aligncenter size-full wp-image-91" /><br />
(выбрать нужный вариант можно табом по старинке, курсорными клавишами или стандартными emacs-хоткеями)</p>
<p>А вот так &#8211; дополнение опций:<br />
<img src="http://alexey.sveshnikov.ru/blog/wp-content/uploads/2008/11/zsh-menu-completion-opts.png" alt="" title="zsh-menu-completion-opts" width="500" height="197" class="aligncenter size-full wp-image-99" /></p>
<p>Еще одна моя любимая магическая штуковина в автодополнении выглядит так: допустим, нужно подправить файл /usr/local/etc/rc.d/mysql. Пользователь bash бы ввел такую команду:<br />
<code>vim /usr/l[TAB]/e[TAB]/r[TAB]/m[TAB]</code><br />
В zsh все несколько проще, а именно:<br />
<code>vim /u/l/e/r/m[TAB]</code><br />
После нажатия [TAB] все элементы пути будут дополнены. Если вариантов несколько, можно будет вручную выбрать нужный.</p>
<p>Ну вот, я вам передал примерно 0.65 процента магии zsh. Помимо автодополнения, ее залежи находятся в подсистеме подстановок (man zshexpn), но там я сам не очень уверенно ориентируюсь. Все-таки одна из прелестей zsh заключается в том, что мне необязательно учиться им пользоваться &#8211; для начала можно ограничиться только bash-совместимым подмножеством функций, регулярно натыкаясь на приятные мелочи в реализации привычных вещей.</p>
<p>Дальнейшее чтение:<br />
<a href="http://citkit.ru/articles/1083/">обзор zsh</a> от Алексея Федорчука,<br />
Собрание хаков и идиом zsh: <a href="http://grml.org/zsh/zsh-lovers.html">zsh lovers</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://alexey.sveshnikov.ru/blog/2008/11/04/zsh-magi/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Заговор от битых кластеров (добавляем информацию для восстановления архивов с помощью par2)</title>
		<link>http://alexey.sveshnikov.ru/blog/2008/04/10/broken-cd-parchive/</link>
		<comments>http://alexey.sveshnikov.ru/blog/2008/04/10/broken-cd-parchive/#comments</comments>
		<pubDate>Wed, 09 Apr 2008 22:08:11 +0000</pubDate>
		<dc:creator>Alexey Sveshnikov</dc:creator>
				<category><![CDATA[UNIX]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[dd_rescue]]></category>
		<category><![CDATA[par2]]></category>
		<category><![CDATA[parchive]]></category>

		<guid isPermaLink="false">http://alexey.sveshnikov.ru/blog/2008/04/10/%d0%b7%d0%b0%d0%b3%d0%be%d0%b2%d0%be%d1%80-%d0%be%d1%82-%d0%b1%d0%b8%d1%82%d1%8b%d1%85-%d0%ba%d0%bb%d0%b0%d1%81%d1%82%d0%b5%d1%80%d0%be%d0%b2-%d0%b4%d0%be%d0%b1%d0%b0%d0%b2%d0%bb%d1%8f%d0%b5%d0%bc/</guid>
		<description><![CDATA[В этой заметке я предложу способ чтения данных с поцарапанных, погрызанных собакой или обработанных шредером компакт-дисков. Итак, к делу: регулярно, при записывании данных на диск, остается некоторое количество свободного места. Лет 5 назад можно было положить диск на полочку, пометив, что еще 30 мегабайт можно забить каким-нибудь хламом, но сейчас стоимость болванки &#8211; 10 рублей, [...]]]></description>
			<content:encoded><![CDATA[<p>В этой заметке я предложу способ чтения данных с поцарапанных, погрызанных собакой или обработанных шредером компакт-дисков. </p>
<p>Итак, к делу: регулярно, при записывании данных на диск, остается некоторое количество свободного места. Лет 5 назад можно было положить диск на полочку, пометив, что еще 30 мегабайт можно забить каким-нибудь хламом, но сейчас стоимость болванки &#8211; 10 рублей, такой аргумент не действует. И, соответственно, привычку оставлять место &#8220;на потом&#8221; надо искоренять. Мне кажется, наиболее разумным было бы добавить на диск данные для восстановления &#8211; т.н. корректирующие коды Рида-Соломона, которые могут пригодится в случае, если диск будет поврежден.</p>
<p>Собственно весь заговор выглядит следующим образом:<br />
<code>#sudo aptitude install par2<br />
#man par2<br />
#cd backups<br />
#ls<br />
dump.sql.gz<br />
#par2 create -v -r10 -n1 -m500 dump.sql.gz<br />
#ls<br />
dump.sql.gz  dump.sql.gz.par2  dump.sql.gz.vol000+100.par2</code></p>
<p>Эта команда добавит 10% избыточной информации к данным, запишет все это в один файл, при этом программе par2 разрешено использовать 500 мегабайт оперативной памяти. Файлы *.par2 следует записать на диск вместе с дампом. </p>
<p>Мне эта программа понравилась, я захотел ее проверить в боевых условиях. Сделал архив размером около 400 Мб, добавил данные для восстановления &#8211;  еще 200Мб &#8211; *.par2 файлы (50% избыточность, по умолчанию &#8211; 5%). Все это я записал на CD-RW, в котором потом сделал, простите, дырку. В итоге стандартными средствами удавалось прочитать только первые 150 Кб данных. Чтобы восстановить файл нужно сначала все считать пускай с ошибками &#8211; для этого есть программа dd_rescue, которая является практчески полным аналогом dd с одним исключением &#8211; она умеет игнорировать ошибки чтения:</p>
<p><img src='http://alexey.sveshnikov.ru/blog/wp-content/uploads/2008/04/dsc_0001_1.jpg' alt='диск с дыркой' align="right" width="240"/></p>
<p><code>#sudo dd_rescue -Av -b 1048576 -B 1048576 /dev/scd0 brokencd.iso</code>(-A &#8211; заполняь нулями те участки файла, которые считать не удалось, v &#8211; verbose, -b &#8211; размер блока данных, -B &#8211; размер блока данных для проблемных областей диска)<br />
<code># sudo mount -o loop brokencd.iso mnt # монтируем получившийся образ диска<br />
# cp mnt/* dump; cd dump # копируем содержимое<br />
# par2 r archive.par2 # приводим в изначальный вид</code></p>
<p>На этом эксперимент завершился &#8211; все данные с диска восстановлены. Даже скучно.<br />
Но пример, мне кажется, весьма красноречив :)</p>
]]></content:encoded>
			<wfw:commentRss>http://alexey.sveshnikov.ru/blog/2008/04/10/broken-cd-parchive/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>SSH для бэкапов и мониторинга: ограничиваем доступ.</title>
		<link>http://alexey.sveshnikov.ru/blog/2008/03/04/restricted-ssh/</link>
		<comments>http://alexey.sveshnikov.ru/blog/2008/03/04/restricted-ssh/#comments</comments>
		<pubDate>Mon, 03 Mar 2008 23:12:57 +0000</pubDate>
		<dc:creator>Alexey Sveshnikov</dc:creator>
				<category><![CDATA[SHELL]]></category>
		<category><![CDATA[UNIX]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[ssh]]></category>

		<guid isPermaLink="false">http://alexey.sveshnikov.ru/blog/2008/03/04/restricted-ssh/</guid>
		<description><![CDATA[&#8220;Бэкап &#8211; акт проявления трусости&#8221; (c) народная мудрость Я труслив :) Во-первых, я делаю бэкапы. Во-вторых, я их боюсь передать без шифрования и, в третьих, иногда и храню их зашифрованными. Как правильно организовать передачу бэкапов с одного сервера на другой? Дампы этого блога у меня передаются по http. Они зашифрованны, да и особо ценных данных [...]]]></description>
			<content:encoded><![CDATA[<div style="text-align: right;"><i>&#8220;Бэкап &#8211; акт проявления трусости&#8221; (c) народная мудрость</i></div>
<p>Я труслив :) Во-первых, я делаю бэкапы. Во-вторых, я их боюсь передать без шифрования и, в третьих, иногда и храню их зашифрованными.</p>
<p>Как правильно организовать передачу бэкапов с одного сервера на другой? Дампы этого блога у меня передаются по http. Они зашифрованны, да и особо ценных данных здесь нет, поэтому http меня не смущает. А как поступить с данными по-важнее? Конечно, ssh. А как при этом запретить пользователю выполнять какие-либо действия, кроме как копирования к себе бэкапа? Представим себе, что бэкап-сервер находится во вражеском дата-центре или просто вы не можете проконтролировать к нему доступ (в т.ч. физический). Нас выручит опция command файла authorized_keys.</p>
<p>Например, если необходимо предоставить доступ только к файлу backup.tgz, то в authorized_keys в самом начале соответствующей строки можно дописать следующее &#8220;command=&#8217;cat backup.tgz&#8217;&#8221;. Теперь при каждом коннекте будет автоматически выполняться команда cat backup.tgz, вам остается только перенаправить вывод в файл. Если дампов несколько, то можно написать небольшой скриптик вида:<code>#!/bin/sh<br />
read file<br />
case "$file" in<br />
"foo") cat foo.tgz ;;<br />
"bar") cat bar.tgz ;;<br />
esac</code> И прописать его в качестве команды по умолчанию. Да, не лишним было бы добавить опции no-port-forwarding, no-pty и все прочие no-*</p>
<p>Теперь копировать файл с удаленной машины можно вот такой командой:<code>echo "foo" | ssh backup@server > foo-`date +%Y-%m-%d`.tgz</code></p>
<p>Кроме как для бэкапов, такое же решение может подойти и для мониторинга. Когда нагиос стучится на удаленный сервер, чтобы собрать какую-либо статистику, полный ssh-доступ ему не нужен.</p>
<p>По-моему, все, что я описал примитивно по сложности и вместе с тем весьма надежно. Так может быть прекратим без надобности дописывать authorized_keys на серверах? Одна запись для себя, любимого, одна для бэкапов, одна для мониторинга.. ой, еще каких-то две..  дальше продолжать? :)</p>
<p>Кстати, а есть ли способы более тонко настраивать уровень доступа к ssh?</p>
]]></content:encoded>
			<wfw:commentRss>http://alexey.sveshnikov.ru/blog/2008/03/04/restricted-ssh/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>HTTP сервер в одну строку: версия 2.0</title>
		<link>http://alexey.sveshnikov.ru/blog/2007/08/30/bash-httpd-2/</link>
		<comments>http://alexey.sveshnikov.ru/blog/2007/08/30/bash-httpd-2/#comments</comments>
		<pubDate>Wed, 29 Aug 2007 20:00:11 +0000</pubDate>
		<dc:creator>Alexey Sveshnikov</dc:creator>
				<category><![CDATA[SHELL]]></category>
		<category><![CDATA[UNIX]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[netcat]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[tech]]></category>

		<guid isPermaLink="false">http://alexey.sveshnikov.ru/blog/2007/08/30/http-%d1%81%d0%b5%d1%80%d0%b2%d0%b5%d1%80-%d0%b2-%d0%be%d0%b4%d0%bd%d1%83-%d1%81%d1%82%d1%80%d0%be%d0%ba%d1%83-%d0%b2%d0%b5%d1%80%d1%81%d0%b8%d1%8f-20/</guid>
		<description><![CDATA[Идея с HTTP сервером на bash мне не дает покоя. Вернуться к ней меня побудила.. попытка воспользоваться старой версией: получалсь не очень :) Поэтому решил довести его до ума. Что-то дописал, что-то выкинул, полчилось следующее: :;while [ $? -eq 0 ];do nc -vlp 8080 -c'(r=read;e=echo;$r a b c;z=$r;while [ ${#z} -gt 2 ];do $r z;done;f=`$e [...]]]></description>
			<content:encoded><![CDATA[<p>Идея с <a href="http://alexey.sveshnikov.ru/blog/2006/12/23/http-сервер-размером-в-222-байта/">HTTP сервером на bash</a> мне не дает покоя.</p>
<p>Вернуться к ней меня побудила.. попытка воспользоваться старой версией: получалсь не  очень :)</p>
<p>Поэтому решил довести его до ума. Что-то дописал, что-то выкинул, полчилось следующее:<br />
<code>:;while [ $? -eq 0 ];do nc -vlp 8080 -c'(r=read;e=echo;$r a b c;z=$r;while [ ${#z} -gt 2 ];do $r z;done;f=`$e $b|sed 's/[^a-z0-9_.-]//gi'`;h="HTTP/1.0";o="$h 200 OK\r\n";c="Content";if [ -z $f ];then($e $o;ls|(while $r n;do if [ -f "$n" ]; then $e "&lt;a href=\"/$n\"&gt;`ls -gh $n`&lt;/a&gt;&lt;br&gt;";fi;done););elif [ -f $f ];then $e "$o$c-Type: `file -ib $f`\n$c-Length: `stat -c%s $f`";$e;cat $f;else $e -e "$h 404 Not Found\n\n404\n";fi)';done</code></p>
<p>Теперь по URL http://ваш_ip:8080/ можно получить доступ ко всем файлам, находящимся в текущим каталоге. Очевидных и прямолинейных способов сменить каталог нет. Как и раньше, протестировано и работает под Linux, bash 3.2.13, и с хоббитовским netcat v1.10 с поддержкой опции -с (запустите netcat -h и посмотрите. Как минимум в Ubuntu, Debian и Fedora Core такая опция есть).</p>
<p>Теперь строка занимает 434 байт,  что на 212 больше, чем прошлая версия. И мне кажется, что я с толком потратил эти байты: новый сервер обрабатывает ошибку 404, кроме того, теперь он работает без задержки, которая раньше требовалась для того, чтобы была возможность его остановить с помощью Ctrl-C. Для успешных запросов сервер отдает нормальные заголовки, с размером файла и даже с его MIME-типом. Например:</p>
<p><code>dainichi@fujitsu:~/backup$ echo "GET /6.1-RELEASE-i386-disc1.iso HTTP/1.1" | nc localhost 8080 | head -n3<br />
HTTP/1.x 200 OK<br />
Content-Type: application/x-iso9660<br />
Content-Length: 529784832</code></p>
<p>Для удобства можно сохранить его в файл и написать в .bash_profile примерно следующее:<code>alias share='sh ~/bash_httpd.sh'</code></p>
<p>Да, были попытки его еще уменьшить, но они не увенчались успехом. Есть такой вариант, но он даже больше:<br />
<code>w=while;d=done;e=echo;r=read;echo "true; $w [ @? -eq 0 ];do nc -vlp 8080 -c'($r a b c;f={$e @b|sed 's/[^a-z0-9_.-]//gi'{;h=}HTTP/1.x};o=}@h 200 OK#};c=}Content};if [ -z @f ];then($e @o;ls|(while $r n;do $e }<a href=\}/@n\}>@n</a><br />};done));elif [ -f @f ];then $e }@o@c-Type: {file -ib @f{#@c-Length: {stat -c%s @f{#};cat @f;else $e }@h 404 Not Found##404#};fi)';done"|tr "@{}#" '$`"<br />
'|sh</code> Оставил его, потому что выглядит страшно, детей пугать &#8211; самое то :)</p>
<p>Если у вас получится сэкономить еще пару байтов, то милости просим в комментаторскую :)</p>
<p><b>UPD: 03.09.2007:</b> Код обновлен, в него вошли <a href="http://sovety.blogspot.com/2007/08/21.html">исправления</a>, которые сделал тов. jetxee, за которые ему большое спасибо.</p>
<p><b>UPD: 03.09.2007:</b> Я удивлен тому факту, что эта заметка <a href="http://news2.ru/story/54417/"> попала в топ news2</a>, спасибо <a href="http://dikiy.com/blog/">dik&#8217;у</a> за то, что добавил ее. Я рад, что она многим показалась интересной.</p>
<p><b>UPD: 07.09.2007:</b> Товарищ Ed очень здорово прооптимизировал код. Вот, что у него вышло:<br />
<code>while :;do nc -p8080 -vnlc'r=read;e="echo -e";$r a b c;while [ -n "`$e $a|tr -d "\r\n"`" ];do $r a;done;f=`$e $b|sed s/.//`;h="HTTP/1.0";z="404 Not Found\n";[ -z $f ]&#038;&#038;(ls|while $r n;do [ -f $n ]&#038;&#038;$e "<a>$n</a>";done)||([ -f $f ]&#038;&#038;($e "$h 200 OK\r\nContent-Type: `file -ib $f`\n";cat $f)||$e "$h $z\n$z")';done</code></p>
<p>Работоспособность проверялась автором на таблетке Nokia N800, а у меня в Kubuntu 7.04 что-то не заработало. Сегодня вечером буду разбираться :)</p>
<p>p.s. Мне теперь стыдно из-за того, что сам не догадался использовать &#038;&#038; и || вместо if..then. :(</p>
<p>p.p.s. stay <a href="http://feeds.feedburner.com/Bookmarks-on-tranquilizers">tuned</a>!</p>
<p><b>UPD 18.08.2008:</b> О, <a href="http://habrahabr.ru/blogs/crazydev/37245/">написали</a> про это безобразие на Хабре, назвали меня извращенцем. Хулиганьё!! :)</p>
]]></content:encoded>
			<wfw:commentRss>http://alexey.sveshnikov.ru/blog/2007/08/30/bash-httpd-2/feed/</wfw:commentRss>
		<slash:comments>51</slash:comments>
		</item>
		<item>
		<title>Программерские загогулины [2]</title>
		<link>http://alexey.sveshnikov.ru/blog/2007/08/23/zagogulina2/</link>
		<comments>http://alexey.sveshnikov.ru/blog/2007/08/23/zagogulina2/#comments</comments>
		<pubDate>Thu, 23 Aug 2007 16:51:12 +0000</pubDate>
		<dc:creator>Alexey Sveshnikov</dc:creator>
				<category><![CDATA[SHELL]]></category>
		<category><![CDATA[UNIX]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[загогулины]]></category>
		<category><![CDATA[общее]]></category>
		<category><![CDATA[quiz]]></category>
		<category><![CDATA[tech]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://alexey.sveshnikov.ru/blog/?p=23</guid>
		<description><![CDATA[Очередная программерская загогулина, на этот раз решение сразу не дам :) Допустим, надо выполнить какую-либо команду на нескольких хостах, перечисленных в файле. Пишу: cat file &#124; ( while read host; do ssh user@$host "command" done ) Ошибка, однако! В чем? Кто сможет разобраться в уме, не запуская код, тому респект и уважуха :) UPD: Решил [...]]]></description>
			<content:encoded><![CDATA[<p>Очередная программерская загогулина, на этот раз решение сразу не дам :)</p>
<p>Допустим, надо выполнить какую-либо команду на нескольких хостах, перечисленных в файле. Пишу:</p>
<p><code>cat file | (<br />
   while read host; do<br />
      ssh user@$host "command"<br />
   done<br />
)</code></p>
<p>Ошибка, однако! В чем?<br />
Кто сможет разобраться в уме, не запуская код, тому респект и уважуха :)</p>
<p><b>UPD: </b></p>
<p>Решил человек, скрывающийся под ником gds:</p>
<blockquote><p>поток из “cat file” будет выкушан только первой запущенной командой “ssh …”?</p></blockquote>
<p>gds, респект тебе уважуха  :)</p>
]]></content:encoded>
			<wfw:commentRss>http://alexey.sveshnikov.ru/blog/2007/08/23/zagogulina2/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Удаленный рабочий стол. UNIX-way :)</title>
		<link>http://alexey.sveshnikov.ru/blog/2007/08/06/%d1%83%d0%b4%d0%b0%d0%bb%d0%b5%d0%bd%d0%bd%d1%8b%d0%b9-%d1%80%d0%b0%d0%b1%d0%be%d1%87%d0%b8%d0%b9-%d1%81%d1%82%d0%be%d0%bb-unix-way/</link>
		<comments>http://alexey.sveshnikov.ru/blog/2007/08/06/%d1%83%d0%b4%d0%b0%d0%bb%d0%b5%d0%bd%d0%bd%d1%8b%d0%b9-%d1%80%d0%b0%d0%b1%d0%be%d1%87%d0%b8%d0%b9-%d1%81%d1%82%d0%be%d0%bb-unix-way/#comments</comments>
		<pubDate>Mon, 06 Aug 2007 13:56:11 +0000</pubDate>
		<dc:creator>Alexey Sveshnikov</dc:creator>
				<category><![CDATA[UNIX]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[общее]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[tech]]></category>
		<category><![CDATA[x]]></category>

		<guid isPermaLink="false">http://alexey.sveshnikov.ru/blog/?p=31</guid>
		<description><![CDATA[Как всегда, существует уйма способов запускать графические программы удаленно. Не все из них основаны на туннелинге X-трафика, но именно с ним играться интересней всего. Приступим :) Собственно, на практике страшная фраза &#8220;сделать туннелинг Х-протокола&#8221; обозначает, что нужно добавить опцию X к ssh. Получается, что в простейшем случае запустить удаленную графическую программу можно так: ssh -X [...]]]></description>
			<content:encoded><![CDATA[<p>Как всегда, существует уйма способов запускать графические программы удаленно. Не все из них основаны на туннелинге X-трафика, но именно с ним играться интересней всего.</p>
<p>Приступим :)</p>
<p>Собственно, на практике страшная фраза &#8220;сделать туннелинг Х-протокола&#8221; обозначает, что нужно добавить опцию X к ssh. Получается, что в простейшем случае запустить удаленную графическую программу можно так:<br />
<code>ssh -X user@host firefox </code></p>
<p>Kdesktop от других программ ничем не отличается:<br />
<code>ssh -X user@host kdesktop </code></p>
<p><img src='http://alexey.sveshnikov.ru/blog/wp-content/uploads/2007/09/qtdesignersmall.png' alt='Удаленный или локальный десктоп? Вот в чем вопрос.'  align="right"/><br />
Неудобство последней команды как способа удаленного входа заключается в том, что в случае, если какая-либо оболочка уже запущена, то неизбежны конфликты и долгие раздумья на тему принадлежности какого-нибудь окошка удаленной или локальной машине. Поэтому все что нужно сделать &#8211; это использовать подобную команду <b>вместо</b> оболочки.</p>
<p>Я это сделал так:<br />
<code>xinit /usr/bin/ssh -X user@host startkde -- :1</code><br />
Набирать команду следует из обычной, неиксовой консоли (Ctrl-Alt-F1), и работать она будет только в случае, если на удаленной машине уже лежит наш публичный ключик, т.к. не будет возможности ввести пароль. (<a href="http://www.yandex.ru/yandsearch?text=ssh+%EF%F3%E1%EB%E8%F7%ED%FB%E9+%EA%EB%FE%F7">что такое публичный ключ</a>). Полный путь к ssh на некоторых дистрибутивах обязателен.</p>
<p>Теперь сочетанием клавиш Ctrl-Alt-F7 и Ctrl-Alt-F9 можно переключаться между локальным и удаленным рабочим столом (хотя F9 для удаленной машины &#8211; это лично у меня, у вас может быть также F8 или F10). Да, и делать это лучше только если соединение между машинами быстрое, иначе нервных расстройств не избежать :)</p>
<p>Этот пост написан с рабочего десктопа, но через ноутбучную оперу :)</p>
<p>А что интересного с помощью ssh удавалось сделать вам?</p>
<p><i>UPD через 20 мин: Отправил ноутбук в ребут и через некоторое время понял, что работаю на удаленной машине. 5 секунд паники, 10 &#8211; на сохранение и минута чтобы понять, что я ошибся :) Вобщем, для людей со слабым сердцем не рекомендую так работать, а сам я теперь осторожен, как сапер на минном поле :) </i></p>
]]></content:encoded>
			<wfw:commentRss>http://alexey.sveshnikov.ru/blog/2007/08/06/%d1%83%d0%b4%d0%b0%d0%bb%d0%b5%d0%bd%d0%bd%d1%8b%d0%b9-%d1%80%d0%b0%d0%b1%d0%be%d1%87%d0%b8%d0%b9-%d1%81%d1%82%d0%be%d0%bb-unix-way/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>codepage horror</title>
		<link>http://alexey.sveshnikov.ru/blog/2007/06/29/codepage-horror/</link>
		<comments>http://alexey.sveshnikov.ru/blog/2007/06/29/codepage-horror/#comments</comments>
		<pubDate>Thu, 28 Jun 2007 20:01:54 +0000</pubDate>
		<dc:creator>Alexey Sveshnikov</dc:creator>
				<category><![CDATA[загогулины]]></category>
		<category><![CDATA[общее]]></category>
		<category><![CDATA[SHELL]]></category>
		<category><![CDATA[tech]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[UNIX]]></category>

		<guid isPermaLink="false">http://alexey.sveshnikov.ru/blog/?p=27</guid>
		<description><![CDATA[Иногда мне снятся сны. Бывает, что кошмары. Что такое кошмар для админа? Это когда видишь свой сайт &#8211; все работает, все грузится, но кодирЛЮХВ КВЯНЕК ЗИЕОЕИВ!!! На работе сегодня этот кошмар воплотился: вселился бес в базу и попутал все кодировки. Попутал на славу, так что первый дамп пришлось расшифровать в два приема: utf8->koi и cp1251->koi, [...]]]></description>
			<content:encoded><![CDATA[<p>Иногда мне снятся сны. Бывает, что кошмары. Что такое кошмар для админа? Это когда видишь свой сайт &#8211; все работает, все грузится, но кодирЛЮХВ КВЯНЕК ЗИЕОЕИВ!!!</p>
<p>На работе сегодня этот кошмар воплотился: вселился бес в базу и попутал все кодировки. Попутал на славу, так что первый дамп пришлось расшифровать в два приема: utf8->koi и cp1251->koi, а со вторым развлечение было поизощреннее. С каждой перестановкой буквы прыгали издевательски с места на место, подмигивали и смеялись, доводя мой <s>ЙЛЗХ</s>моск до кипения. Но битву они все-так проиграли. После пятой перекодировки cp1251->koi8r из поганцев сгинул злой дух и оборотились они текстом складным и залился дамп в базу и вернулись: юзерам &#8211; счастье, а админу &#8211; крепкий сон :)</p>
<p>p.s.</p>
<p>А на #freebsd народ показал такой фокус:</p>
<p><code><br />
#str="трали-вали"; for((i=0; $i<20; i++)); do str=`echo "$str" | iconv -f CP1251 -t KOI8-R`; done;<br />
#echo $str<br />
трали-вали<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://alexey.sveshnikov.ru/blog/2007/06/29/codepage-horror/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>return 0;</title>
		<link>http://alexey.sveshnikov.ru/blog/2007/06/27/im-back/</link>
		<comments>http://alexey.sveshnikov.ru/blog/2007/06/27/im-back/#comments</comments>
		<pubDate>Wed, 27 Jun 2007 19:45:17 +0000</pubDate>
		<dc:creator>Alexey Sveshnikov</dc:creator>
				<category><![CDATA[PERL]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[загогулины]]></category>
		<category><![CDATA[quiz]]></category>
		<category><![CDATA[tech]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[UNIX]]></category>

		<guid isPermaLink="false">http://alexey.sveshnikov.ru/blog/?p=26</guid>
		<description><![CDATA[Я вернулся :) За время учебного отпуска нагулял отличное рабочее настроение! В первый рабочий день обратил внимание на небольшой юбилей: 1 год и 4 дня исполнилось моему процессу screen, запущенному на работе, которым я активно пользуюсь по 40 часов в неделю. Слава героям!! Попутно веду свою маленькую коллекцию программерских загогулин, вот очередной экземпляр: #!/usr/bin/perl $var1 [...]]]></description>
			<content:encoded><![CDATA[<p>Я вернулся :)<br />
За время учебного отпуска нагулял отличное рабочее настроение!</p>
<p>В первый рабочий день обратил внимание на небольшой юбилей: 1 год и 4 дня исполнилось моему процессу screen, запущенному на работе, которым я активно пользуюсь по 40 часов в неделю. Слава героям!!</p>
<p>Попутно веду свою маленькую коллекцию программерских загогулин, вот очередной экземпляр:</p>
<p><code><br />
#!/usr/bin/perl<br />
$var1 = "one|two|three";<br />
$var2 = join('|', split ('|', $var1));<br />
</code></p>
<p>Опрос знакомых программистов показал, что предполагаемым значением $var2 является исходная строка  ($var1). PERL думает иначе.</p>
<p>Вся мощь перла с его реально перегруженными функциями именно в этом моменте дала слабину: split в качестве первого аргумента принимает _только_ регулярное выражение, и, соответственно, символ &#8216;|&#8217; воспринимается как логическое &#8220;или&#8221;.. Таким образом, в var2 будет &#8220;o|n|e||t|w|o&#8221;&#8230;</p>
<p>Пусть такое поведение и является документированным, меня оно все равно расстраивает..</p>
]]></content:encoded>
			<wfw:commentRss>http://alexey.sveshnikov.ru/blog/2007/06/27/im-back/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Интернет от skylink в Linux (Kubuntu + Ubiquam U-300 через bluetooth)</title>
		<link>http://alexey.sveshnikov.ru/blog/2007/01/05/%d0%b8%d0%bd%d1%82%d0%b5%d1%80%d0%bd%d0%b5%d1%82-%d0%be%d1%82-skylink-%d0%b2-linux-kubuntu-ubiquam-u-300-%d1%87%d0%b5%d1%80%d0%b5%d0%b7-bluetooth/</link>
		<comments>http://alexey.sveshnikov.ru/blog/2007/01/05/%d0%b8%d0%bd%d1%82%d0%b5%d1%80%d0%bd%d0%b5%d1%82-%d0%be%d1%82-skylink-%d0%b2-linux-kubuntu-ubiquam-u-300-%d1%87%d0%b5%d1%80%d0%b5%d0%b7-bluetooth/#comments</comments>
		<pubDate>Fri, 05 Jan 2007 14:15:20 +0000</pubDate>
		<dc:creator>Alexey Sveshnikov</dc:creator>
				<category><![CDATA[UNIX]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[bluetooth]]></category>
		<category><![CDATA[skylink]]></category>
		<category><![CDATA[tech]]></category>

		<guid isPermaLink="false">http://alexey.sveshnikov.ru/blog/?p=19</guid>
		<description><![CDATA[В Linux просто замечательная поддержка bluetooth &#8211; интернет у меня заработал в течении 15 минут. Больше времени потребовалось на то, чтобы решиться :) А команды будет всего три: root@dainichi-laptop:~# sdptool search DUN Inquiring ... Searching for DUN on 00:16:39:ED:81:00 ... Service Name: QC Dial-up Networking Service RecHandle: 0x10000 Service Class ID List: "Dialup Networking" (0x1103) [...]]]></description>
			<content:encoded><![CDATA[<p>В Linux просто замечательная поддержка bluetooth &#8211; интернет у меня заработал в течении 15 минут. Больше времени потребовалось на то, чтобы решиться :)</p>
<p>А команды будет всего три:</p>
<p><code>root@dainichi-laptop:~# sdptool search DUN<br />
Inquiring ...<br />
Searching for DUN on 00:16:39:ED:81:00 ...<br />
Service Name: QC Dial-up Networking<br />
Service RecHandle: 0x10000<br />
Service Class ID List:<br />
"Dialup Networking" (0x1103)<br />
Protocol Descriptor List:<br />
"L2CAP" (0x0100)<br />
"RFCOMM" (0x0003)<br />
 Channel: 8<br />
Language Base Attr List:<br />
code_ISO639: 0x656e<br />
encoding: 0x6a<br />
base_offset: 0x100<br />
Profile Descriptor List:<br />
"Dialup Networking" (0x1103)<br />
 Version: 0x0100 </code></p>
<p>Отсюда узнаем, что существует некое устройство с MAC 00:16:39:ED:81:00, которое предоставляет сервис доступа к сети на канале 8. Далее создаем rfcomm устройство &#8211; COM порт, работающий через bluetooth:</p>
<p><code>root@dainichi-laptop:~# rfcomm bind 0 00:16:39:ED:81:00 8<br />
root@dainichi-laptop:~# dmesg | tail<br />
[17179616.448000] Bluetooth: L2CAP socket layer initialized<br />
[17179616.464000] Bluetooth: RFCOMM socket layer initialized<br />
[17179616.464000] Bluetooth: RFCOMM TTY layer initialized<br />
[17179616.464000] Bluetooth: RFCOMM ver 1.7 </code></p>
<p>Если команда rfcomm ничего не вывела на STDOUT, значит, все отлично и можно приступать к установлению PPP соединения. Я это сделал так:</p>
<p><code>root@dainichi-laptop:~# kppp </code></p>
<p>Уже в kppp добавил модем (устройство: /dev/rfcomm0; скорость: 115200; управление потоком: hardware), указал телефон (#777), аутентификацию (PAP-CHAP), и логин/пароль (mobile/internet).</p>
<p>Собственно, с интернетом разобрались, напоследок немного увлекательнейших манов: sdptool, dund, hcitool, l2ping, rfcomm :)</p>
]]></content:encoded>
			<wfw:commentRss>http://alexey.sveshnikov.ru/blog/2007/01/05/%d0%b8%d0%bd%d1%82%d0%b5%d1%80%d0%bd%d0%b5%d1%82-%d0%be%d1%82-skylink-%d0%b2-linux-kubuntu-ubiquam-u-300-%d1%87%d0%b5%d1%80%d0%b5%d0%b7-bluetooth/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Hint [10]</title>
		<link>http://alexey.sveshnikov.ru/blog/2006/12/23/hint-10/</link>
		<comments>http://alexey.sveshnikov.ru/blog/2006/12/23/hint-10/#comments</comments>
		<pubDate>Sat, 23 Dec 2006 14:14:32 +0000</pubDate>
		<dc:creator>Alexey Sveshnikov</dc:creator>
				<category><![CDATA[UNIX]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[SHELL]]></category>
		<category><![CDATA[tech]]></category>

		<guid isPermaLink="false">http://alexey.sveshnikov.ru/blog/?p=18</guid>
		<description><![CDATA[[10] Все мы с пеленок знаем, что &#038; значит запустить программу в фоновом режиме, но лично у меня случаи, когда такая форма запуска является оправданной встречаются редко. Хотя недавно я &#8220;открыл для себя&#8221; один из классов таких случаев &#8211; какие-либо действия с сетью, которые сами по себе не ресурсоемки, но могут выполняться долго вследствие больших [...]]]></description>
			<content:encoded><![CDATA[<p>[10] Все мы с пеленок знаем, что &#038; значит запустить программу в фоновом режиме, но лично у меня случаи, когда такая форма запуска является оправданной встречаются редко. Хотя недавно я &#8220;открыл для себя&#8221; один из классов таких случаев &#8211; какие-либо действия с сетью, которые сами по себе не ресурсоемки, но могут выполняться долго вследствие больших таймаутов.</p>
<p>Вот так я проверяю список хвостов на &#8220;пингуемость&#8221;:</p>
<p>cat proxies | (IFS=&#8221;:\n&#8221;; while read ip port; do (if ping -w 1 -c 1 -q $ip>/dev/null; then echo &#8220;$ip:$port&#8221;; else echo &#8220;bad: $ip:$port&#8221;; fi)& done;) | tee proxies_pingable</p>
<p>В данном случае я запускаю в фоне сабшелл (if ping -w 1 -c 1 -q $ip>/dev/null; then echo &#8220;$ip:$port&#8221;; else echo &#8220;bad: $ip:$port&#8221;; fi), потому скрипт приступает к пингу следующего хоста, не дожидаясь, когда завершится проверка предыдущего. Выигрыш по времени пропорционален количеству хостов &#8211; если их 100, то практически стократный!<br />
Правда, нужно быть аккуратным &#8211; если в списке 10 тысяч хостов, то это будет уже больше похоже на DoS.</p>
]]></content:encoded>
			<wfw:commentRss>http://alexey.sveshnikov.ru/blog/2006/12/23/hint-10/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
