Archive

Archive for the ‘Unix’ Category

HTTP сервер в одну строку: версия 2.0

August 30th, 2007 49 comments

Идея с 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 $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;(for n in *;do if [ -f "$n" ]; then $e “`ls -gh \”$n\”`
“;fi;done););elif [ -f "$f" ];then $e “$o$c-Type: `file -ib \”$f\”`\n$c-Length: `stat -c%s \”$f\”`”;$e;$e $f>&2;cat “$f”;else $e -e “$h 404 Not Found\n\n404\n”;fi)’;done

Теперь по URL http://ваш_ip:8080/ можно получить доступ ко всем файлам, находящимся в текущим каталоге. Очевидных и прямолинейных способов сменить каталог нет. Как и раньше, протестировано и работает под Linux, bash 3.2.13, и с хоббитовским netcat v1.10 с поддержкой опции -с (запустите netcat -h и посмотрите. Как минимум в Ubuntu, Debian и Fedora Core такая опция есть).

Теперь строка занимает 434 байт, что на 212 больше, чем прошлая версия. И мне кажется, что я с толком потратил эти байты: новый сервер обрабатывает ошибку 404, кроме того, теперь он работает без задержки, которая раньше требовалась для того, чтобы была возможность его остановить с помощью Ctrl-C. Для успешных запросов сервер отдает нормальные заголовки, с размером файла и даже с его MIME-типом. Например:

dainichi@fujitsu:~/backup$ echo “GET /6.1-RELEASE-i386-disc1.iso HTTP/1.1″ | nc localhost 8080 | head -n3
HTTP/1.x 200 OK
Content-Type: application/x-iso9660
Content-Length: 529784832

Для удобства можно сохранить его в файл и написать в .bash_profile примерно следующее:alias share='sh ~/bash_httpd.sh'

Если у вас получится сэкономить еще пару байтов, то милости просим в комментаторскую :)

UPD: Код обновлен, в него вошли исправления, которые сделал тов. jetxee, за которые ему большое спасибо.

UPD: Заметка попала в топ news2, спасибо dik’у за то, что добавил ее. Я рад, что она многим показалась интересной.

UPD: Товарищ Ed очень здорово прооптимизировал код. Вот, что у него вышло:

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 ]&&(ls|while $r n;do [ -f $n ]&&$e “$n“;done)||([ -f $f ]&&($e “$h 200 OK\r\nContent-Type: `file -ib $f`\n”;cat $f)||$e “$h $z\n$z”)’;done

Работоспособность проверялась автором на таблетке Nokia N800, а у меня в Kubuntu 7.04 что-то не заработало. Сегодня вечером буду разбираться :). Мне теперь стыдно из-за того, что сам не догадался использовать && и || вместо if..then. :(

UPD: О, на хабре написали.

Для владельцев Ubuntu 10.10: Теперь в дистрибутиве по умолчанию стоит другой вариант netcat’а. Вот так можно вернуть все как было, это абсолютно безвредное для системы действие:

sudo apt-get install netcat-traditional
sudo update-alternatives –set nc /bin/nc.traditional

P.S. Ссылка на скрипт в plain text: http://sveshnikov.ru/httpd.sh, он же, в более удобночитаемом виде: http://sveshnikov.ru/httpd.sh.formatted

Что получится, если скрестить fuse и ssh? ‮[файловая система sshfs]

August 29th, 2007 No comments

А получится sshfs.
sshfs позволит вам монтировать каталоги на удаленных машинах по протоколу SFTP; пользоваться им настолько просто, что даже рассказать в этой заметке практически нечего: ни тебе интрижки с накладыванием патчей и сборкой пакета, ни тебе объектного языка конфигурационных файлов. Тоска, одним словом.

Но для sshfs это, вобщем-то, плюс. Итак, начнем с установки пакета и добавления себя в группу fuse, делается это так:
apt-get install sshfs
sudo adduser your_name fuse

Команда adduser в таком контексте ничего, кроме добавления уже существующего пользователя в группу не делает, так что не нужно смущаться от ее неожиданного выхода на сцену. После этого нам нужно перелогиниться, чтобы изменения в /etc/group вступили силу.

Мне пришлось выполнить еще одну операцию: сменить группу у устройства /dev/fuse. Я думаю, это особенность лично моего дистрибутива, но если у вас тоже попытки монтирования будут завершаться ошибкой “что-то там permission denied”, то вот вам команда:
chgrp fuse /dev/fuse
По-хорошему, ее надо прописать куда-нибудь в автозагрузку, например, в /etc/rc.local.

Теперь все готово для монтирования:
mkdir mount_point
sshfs remoteuser@remotehost:/some/folder ~/mount_point
ls mount_point

Ну вот, собственно, и все, можно работать.

Теперь настало время рассказать об одном ограничении: кроме нас, никто в системе не сможет воспользоваться примонтированным каталогом. Сама возможность пустить туда других пользователей есть, но корректность операций записи не гарантируется (могут быть повреждены атрибуты файла – владелец и пр.). Поэтому перед тем, как открывать доступ к важным данным лучше все-таки поставить эксперимент на копии. Также несколько странные результаты будет выдавать команды du и df, но по-моему, это я уже придираюсь :)

В итоге, мы имеем отличную замену scp/sftp или fish (встроенная в mc и konqueror оболчка для sftp) для случаев, когда нужно выполнить действия посложнее, чем копирование.

Дальнейшее чтение: FAQ по sshfs, Другие основанные на fuse файловые системы

Программерские загогулины [2]

August 23rd, 2007 8 comments

Очередная программерская загогулина, на этот раз решение сразу не дам :)

Допустим, надо выполнить какую-либо команду на нескольких хостах, перечисленных в файле. Пишу:

cat file | (
while read host; do
ssh user@$host "command"
done
)

Ошибка, однако! В чем?
Кто сможет разобраться в уме, не запуская код, тому респект и уважуха :)

UPD:

Решил человек, скрывающийся под ником gds:

поток из “cat file” будет выкушан только первой запущенной командой “ssh …”?

gds, респект тебе уважуха :)

Удаленный рабочий стол. UNIX-way :)

August 6th, 2007 7 comments

Как всегда, существует уйма способов запускать графические программы удаленно. Не все из них основаны на туннелинге X-трафика, но именно с ним играться интересней всего.

Приступим :)

Собственно, на практике страшная фраза “сделать туннелинг Х-протокола” обозначает, что нужно добавить опцию X к ssh. Получается, что в простейшем случае запустить удаленную графическую программу можно так:
ssh -X user@host firefox

Kdesktop от других программ ничем не отличается:
ssh -X user@host kdesktop

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

Я это сделал так:
xinit /usr/bin/ssh -X user@host startkde -- :1
Набирать команду следует из обычной, неиксовой консоли (Ctrl-Alt-F1), и работать она будет только в случае, если на удаленной машине уже лежит наш публичный ключик, т.к. не будет возможности ввести пароль. (что такое публичный ключ). Полный путь к ssh на некоторых дистрибутивах обязателен.

Теперь сочетанием клавиш Ctrl-Alt-F7 и Ctrl-Alt-F9 можно переключаться между локальным и удаленным рабочим столом (хотя F9 для удаленной машины – это лично у меня, у вас может быть также F8 или F10). Да, и делать это лучше только если соединение между машинами быстрое, иначе нервных расстройств не избежать :)

Этот пост написан с рабочего десктопа, но через ноутбучную оперу :)

А что интересного с помощью ssh удавалось сделать вам?

UPD через 20 мин: Отправил ноутбук в ребут и через некоторое время понял, что работаю на удаленной машине. 5 секунд паники, 10 – на сохранение и минута чтобы понять, что я ошибся :) Вобщем, для людей со слабым сердцем не рекомендую так работать, а сам я теперь осторожен, как сапер на минном поле :)

Kubuntu 7.04

May 17th, 2007 No comments

KNetworkManager screenshotВ новом Kubuntu появилась интереснейшая вещь, которой раньше очень не хватало: маленький апплет, с помощью которого можно быстро сконфигурировть сетевые интерфейсы.

Вдвойне приятно, что WiFi и Bluetooth заработали сами по себе, не требуя к себе внимания (это был камень в огород Fedora Core :)

Ubuntu – офигенный дистрибутив!

Categories: Unix, Техноблог Tags:

Feodora Core

March 3rd, 2007 No comments

Недавно linux на моем ноутбуке упал. Зря я доверился ext2: корневая система рухнула после грубого выключения системы (причем сразу же после загрузки). Это стало поводом для продолжения экспериментов, на этот раз подопытным кроликом стала Feodora Core 6.
После Kubuntu новых впечатлений – масса!!
Во-первых, это GNOME, c которым я раньше особо и не сталкивался – я, конечно, его снесу через какое-то время, но что-то в нем все-таки есть, по крайней мере я начинаю понимать людей, которые с ним работают.
Во-вторых, все очень быстро. Пока не понимаю, как такое может быть, но по ощущениям Open Office грузится в полтора-два раза быстрее.
В-третьих, я еще не гуру линукса, для меня довольно важное значение имеет автоопределние оборудования и дефолтная конфигурация: BeryL из коробки – это клево!! И потом, наконец-то заработала функция перехода в спящий режим при закрывании крышки ноутбука!

Но есть и минусы: yum после apt-get – штука очень тормозная. Может секунд 20 выполнять поисковый запрос и еще минуту – проверять зависимости (это при том, что у меня довольно быстрый компьютер). И еще, похоже, что тулзу для понижения тактовой частоты процессора придется искать самостоятельно – при полной зарядке аккумулятора прогнозируемое время работы – полтора часа, что в полтора раза меньше времени работы из-под ubuntu.

Эх!

Categories: Unix, Техноблог Tags: ,

Интернет от skylink в Linux (Kubuntu + Ubiquam U-300 через bluetooth)

January 5th, 2007 1 comment

В Linux просто замечательная поддержка bluetooth – интернет у меня заработал в течении 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)
Protocol Descriptor List:
"L2CAP" (0x0100)
"RFCOMM" (0x0003)
Channel: 8
Language Base Attr List:
code_ISO639: 0x656e
encoding: 0x6a
base_offset: 0x100
Profile Descriptor List:
"Dialup Networking" (0x1103)
Version: 0x0100

Отсюда узнаем, что существует некое устройство с MAC 00:16:39:ED:81:00, которое предоставляет сервис доступа к сети на канале 8. Далее создаем rfcomm устройство – COM порт, работающий через bluetooth:

root@dainichi-laptop:~# rfcomm bind 0 00:16:39:ED:81:00 8
root@dainichi-laptop:~# dmesg | tail
[17179616.448000] Bluetooth: L2CAP socket layer initialized
[17179616.464000] Bluetooth: RFCOMM socket layer initialized
[17179616.464000] Bluetooth: RFCOMM TTY layer initialized
[17179616.464000] Bluetooth: RFCOMM ver 1.7

Если команда rfcomm ничего не вывела на STDOUT, значит, все отлично и можно приступать к установлению PPP соединения. Я это сделал так:

root@dainichi-laptop:~# kppp

Уже в kppp добавил модем (устройство: /dev/rfcomm0; скорость: 115200; управление потоком: hardware), указал телефон (#777), аутентификацию (PAP-CHAP), и логин/пароль (mobile/internet).

Собственно, с интернетом разобрались, напоследок немного увлекательнейших манов: sdptool, dund, hcitool, l2ping, rfcomm :)

Hint [10]

December 23rd, 2006 No comments

[10] Все мы с пеленок знаем, что & значит запустить программу в фоновом режиме, но лично у меня случаи, когда такая форма запуска является оправданной встречаются редко. Хотя недавно я “открыл для себя” один из классов таких случаев – какие-либо действия с сетью, которые сами по себе не ресурсоемки, но могут выполняться долго вследствие больших таймаутов.

Вот так я проверяю список хвостов на “пингуемость”:

cat proxies | (IFS=”:\n”; while read ip port; do (if ping -w 1 -c 1 -q $ip>/dev/null; then echo “$ip:$port”; else echo “bad: $ip:$port”; fi)& done;) | tee proxies_pingable

В данном случае я запускаю в фоне сабшелл (if ping -w 1 -c 1 -q $ip>/dev/null; then echo “$ip:$port”; else echo “bad: $ip:$port”; fi), потому скрипт приступает к пингу следующего хоста, не дожидаясь, когда завершится проверка предыдущего. Выигрыш по времени пропорционален количеству хостов – если их 100, то практически стократный!
Правда, нужно быть аккуратным – если в списке 10 тысяч хостов, то это будет уже больше похоже на DoS.

Categories: Tips, Unix, Техноблог Tags:

hint [9] swiss army knife

December 22nd, 2006 2 comments

Еще один очень простой способ передавать файлы между компьютерами:
на сервере
nc -l -p 8080 < file
на клиенте достаточно в браузере набрать http://192.168.0.123:8080
Собственно, все. Вообще, теоретически, работать это не должно, т.к. нет заголовков сервера - Status, Content-type и проч. Но работает, это факт.
Впрочем, чтобы никто не смог сказать, что в юниках в командной строке нельзя сделать HTTP сервер, вот полная реализация:
(echo -e "HTTP/1.1 200\nContent-Disposition: attachment; filename=gena_na.png\nContent-Type: application/octet-stream\nConnection: close\n"; cat mrxvt_screen2.png) | nc -vv -l -p 8080
(набирать это каждый раз утомительно, но ничто не мешает сделать скрипт)

Categories: Tips, Unix, Техноблог Tags:

Редактирование множетва файлов (diff, patch)

December 2nd, 2006 No comments

В случае, если необходимо сделать мелкие исправления сразу в множестве не идеинтичных файлов, могут очень помочь утилиты diff/patch.

Например, сегодня нужно было исправить e-mail адреса в конфигах десяти разных инсталляциях одной программы. Можно было ручками пройтись и тупо редактировать файлы, но это не интересно. Вот, как это можно сделать:

mkdir _wrk && cd _wrk - создать временный каталог
cp ~/installation1/file . - скопировать в него один из файлов.
cp file file.bak - сохранить старую версию
vim file - внести необходимые изменения
diff file.bak file > ~/patch - создать патч.

cd ~ - перейти в каталог, в котором наохдятся все инсталляции
find -name file -print0 | xargs -n1 -J % echo "patch " % " ~/patch" > script найти все файлы, которые нужно отредактировать и сохранить скрипт, который сделает все необходимые изменения

cat script - убедиться, что не нашлось ничего лишнего (например, тот же файл, но в бекапах)
sh script - поехали!

Далее, необходимо убедиться в том, что все ок и удалить *.orig файлы (резервные копии, оставленные программой patch. Сделать это можно командой find -name file.orig -rm).

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

Categories: Tips, Unix, Техноблог Tags: