Monday, May 07, 2007

 

Переезд

Переезд!!

Отныне блог будет доступен по более осмысленному адресу http://alexey.sveshnikov.ru/blog, RSS здесь: http://alexey.sveshnikov.ru/blog/feed/atom.

Обновите ваши закладки :)

Wednesday, March 07, 2007

 

Feodora Core

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

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

Эх!

Labels:


Tuesday, January 02, 2007

 

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

В 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 :)

Labels: , , , , , ,


Saturday, December 23, 2006

 

Hint [10]

[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.

Friday, December 22, 2006

 

HTTP сервер размером в 222 байта :)

В продолжение предыдущей идеи с передачей файлов по HTTP. Я не удержался и написал вполне полноценный (для нужд раздачи файлов на соседний компьютер) HTTP сервер:


while true; do nc -vv -l -p 8080 -c '( read a b c; file=`echo $b | sed 's/[^a-z0-9.]//g'`; if [ a$file = "a" ]; then ( ls | (while read f; do echo "<a href=$f>$f</a><br>"; done) ); else cat $PWD/$file; fi )'; sleep 1; done

(все это - одна команда, должна вводиться в одну строку. Тестировалось в linux/bash 3.1.17)

Вот и все :) Правда, на этот раз я опять решил отказаться от заголовков ответа, т.к. это слишком усложнит "команду", но при желании их можно взять из предыдущего примера. Этот сервер отдает все файлы, которые есть в текущем каталоге и пытается противодействовать попыткам его сменить. В случае, если запрашивается корневая директория, то управление передается своеобразному mod_index - т.е. выводится список файлов-ссылок. В конце добавлена задержка в 1 сек для того, чтобы была возможность убить его нажатием Ctrl-C.

Воистину, netcat одна из моих любимых программ!
Буду рад услышать замечания относительно сервера :)

p.s. Кто теперь осмелится заявить, что я не извращенец? :))
p.p.s. HTTP server bash netcat shell



UPD: новая версия сервера доступна здесь

 

hint [9] swiss army knife

Еще один очень простой способ передавать файлы между компьютерами:
на сервере
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

(набирать это каждый раз утомительно, но ничто не мешает сделать скрипт)

 

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

В случае, если необходимо сделать мелкие исправления сразу в множестве не идеинтичных файлов, могут очень помочь утилиты 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 корректно обрабатывает эту ситуацию и не даст испортить файл. Но все равно, лучше сразу сделать все нормально.

Monday, November 27, 2006

 

mrxvt

Какая программа самая важная на *NIX десктопе? Правильно, терминалка!

Про нее и поговорим.

Исторически сложилось так, что моей первой любовью после освоения иксов стал Konsole. Динамически изменяемая кодировка, удобные настройки из меню - то, за что я продолжаю любить его и сейчас. Но у него есть и серьезный минус - скорость. На работе у меня довольно старый десктоп - P3-900, на нем переключение между 12-тью вкладками занимает какое-то время - немного, но все-таки слегка раздражает. Это было толчком к тому, чтобы отправиться на поиски альтернатив. Требования к ним такие: поддержка табов, несложное конфигурировние, очень желателен "broadcast" режим (когда все, что пишется на одну консоль дублируется на все остальные), скорость, желательно отсутсвие привязки к библиотекам вроде qt или gtk.

Когда я нашел mrxvt я был на седьмом небе от счастья. Однократного беглого прочтения мана был достаточно для того, чтобы написать сносный конфиг и начать наслаждаться жизнью. Проще показать скриншот (27Kb, 1600x1200):
Любимая цветовая схема, табы, между которыми программа переключается молниеносно, даже если она запущена удаленно. Это скриншот моего домашнего десктопа, на работе wm - enlightenment, там заголовок окна либо узкий и незаметный, либо вообще приложение работает в full-screen. Из того, что не получилось сделать "с разбега" - автоматическое переименование табов.

Но есть и минусы. Если использовать mrxvt совместно со screen, то они подвисают, оба, хотя последний все-таки поддается реанимации. Впрочем, так как я уже успел влюбиться в эту программу, буду пытаться заставить все это нормально работать - собирать из исходников свежую версию mrxvt, экспериментировать с screen..

Thursday, November 16, 2006

 

Hints [5..8]

[5]. Допустим, есть огромный (5Gb) файл, из которого нужно извлечь все строки, содержащие слово "error", а также посчитать md5 и количество строк. Можно сделать это в пять приемов и потратить полчаса, но есть способ проще и быстрее:

#cat big_file | tee >(md5) >(wc -l) | grep "error" > big_file_errors

Т.е. все нужные действия производятся за один цикл чтения!

Таким же образом можно скопировать файл с удаленного хоста и одновременно посчитать md5:

#ssh remote_host "cat /home/user/file" | tee >(md5) > file

(в linux вместо md5 нужно писать md5sum)

[6]. Если есть открытый ssh-сеанс на удаленной машине, можно поднять туннель, прямо в этом же сеансе. Комбинация клавиш "~C" позволяет отредактировать командную строку. Например, если написать "-D 1080", то будет поднят прокси на 1080-м порту.

[7]. При работе с лог-файлами в sh-скриптах может понадобиться преобразовать дату из human-readable формата в unixtime. Делается это так:

#date -j -f "%d/%m/%Y %H:%M:%S" "18/08/2006 16:43:02" "+%s"

Опция -j запрещает команде date делать попытки установить дату.
-f - формат даты в строке, которую следует разобрать
"+%s" - отобразить дату в формате unixtime. Если этот аргумент опустить, то дата будет выведена в стандартном UTC формате (пятница, 18 августа 2006 г. 16:43:02 (MSD))

[8]. Во FreeBSD есть утилита bdes, позволяющая (де)криптовать файлы из командной строки.

#cat file | bdes > file.cripted
Enter key:

Также есть утилита enigma, но криптостойкость ее алгоритмов очень низка.

Friday, November 03, 2006

 

Hints [1..4]

[1]. Если в баше запущена интерактивная команда (не демон), которая выполняется долго, можно узнать ее состояние, нажав Ctrl-T.
Например:
cat access_log | perl -pe 's/.*"(POST|GET.+?)"/$1/g;' > urls
[Ctrl-T]
load: 2.72 cmd: perl 9210 [running] 1.11u 2.44s 10% 3188k


[2]. Если написать
#mysql -u user -ppassword base
То выполнив ps axl можно увидеть пароль.
Если передавать его не через командную строку, а через переменную окружения MYSQL_PWD, то другим пользователям пароль виден не будет:
MYSQL_PWD=passsword mysql -u user base

Но от рута не спрячешься:
#ps axe

[3]. Во FreeBSD случайные пароли можно сгенерировать следующей командой:
#jot -r -c 8 a z | rs -g 0 8

[4]. Если наблюдать за файлом с помощью командый tail -f file, а файл периодически ротируется, то наблюдение остановится. Нужно использоватеь -F, чтобы tail отслеживал изменение дескриптора файла с заданным именем. BTW, в последних версиях FreeBSD команда tail позволяет указывать несколько файлов в аргументе -f.

Tuesday, October 24, 2006

 

Сохранение POST-запросов в apache

В некоторые моменты чувствую себя очень неуютно из-за того, что нет возможности посмотреть, что конкретно делают с моим сервером некоторые персоны. Я долго искал возможность логгировать все, в том числе и POST запросы клиентов и нашел способ - через mod_security.

Устанавливается он элементарно apxs -cia mod_security.c (см документацию, правда, для его работы в наиболее удобном, "Concurrent", режиме логгирования, нужен модуль unique_id. После установи модуля следует добавить следующую секцию в httpd.conf:


<IfModule mod_security.c>
SecAuditEngine On

# У mod_security есть два механизма логгирования, Concurrent - более быстрый и продвинутый.
SecAuditLogType Concurrent

# Здесь будет храниться индекс - файл, по структуре похожий на access_log + идентификаторы, по которым можно найти полную информацию в StorageDir
SecAuditLog /var/log/www/audit/index

# Тут хранятся все данные запросов. Каждый запрос в отдельном файле. Запросы разнесены по каталогам (вместе все запросы одной транзакции, вместе все транзакции одного дня)
SecAuditLogStorageDir /var/log/www/audit/data/

# Наиболее полное логгирование (man)
SecAuditLogParts ABCDEFGHZ

# Добавить обработку POST данных.
SecFilterScanPOST On
SecFilterEngine On

# Следующие строки нужны для сохранения загруженных на сервер файлов:
SecUploadDir /var/log/www/audit/upload
SecUploadKeepFiles On

</IfModule>


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


p.s. Работоспособность конфига проверялась в apache 1.3.37, mod_security 1.9.4, но работать должно и в 2.0/2.0

Sunday, October 08, 2006

 

KOI8-R локаль в [K]Ubuntu


UPD: обновлено для Ubuntu 6.10

"А по улицам там ходят медведи с балалайками и разговаривают на KOI8-R" (почти BOR). Так вот, я и есть такой медведь. И когда мне дают дистрибутив с локалью UTF8 по умолчанию, я буду все переделывать. Для себя и для других медведей - инструкция:

а) Все начинается с генерации локали ru_RU-KOI8-R, делается это командой locale-gen. В качестве парамета ей целесообразно указать язык (ru), иначе она будет генерировать локали всех языков (/usr/share/i18n/locales/*), но только для кодировки UTF-8. Для языка ru будут сгенерированы следующие локали:
#cat /var/lib/locales/supported.d/ru
ru_RU.UTF-8 UTF-8
ru_UA.UTF-8 UTF-8

Следующими командами можно заставить сгенерировать ее локаль для кодировки KOI8-R:
#sudo -s sh -c 'echo "ru_RU.KOI8-R KOI8-R" >> /var/lib/locales/supported.d/ru'
#sudo locale-gen ru
Generating locales...
ru_RU.KOI8-R... done
ru_RU.UTF-8... done
ru_UA.UTF-8... done
Generation complete.

б) Далее, обновляем переменные окружения. Имя конфиг-файла зависит от версии Ubuntu:
Для Ubuntu <6.10 sudo vim /etc/environment
Ubuntu 6.10 sudo vim /etc/default/locale
В нем пишем: LANG="ru_RU.KOI8-R"
LANGUAGE="ru_RU:ru:en_GB:en"

С русификацией иксов покончено

в) Приступаем к консоли. Пишем:
apt-get install console-cyrillic
В файл .profile добавляем:
loadkeys /usr/share/console-cyrillic/ru-koi8-r.kmap
consolechars -f /usr/share/console-cyrillic/UniCyr_8x14.psf -m /usr/share/console-cyrillic/koi8-r.acm.gz

Готово.
У меня заработало все, кроме mcedit, который пришлось пересобрать. (В Kubuntu 6.10 заработал и mcedit)


Tuesday, August 29, 2006

 

ssh и анонимность

Сегодня обнаружил, что текстовое поле в конце файла id_rsa.pub - просто комментарий. Это значит, что после копирования его на удаленный хост в authorized_keys можно заменить свой настоящий логин и имя хоста на строку "тут был Вася" и никто никогда не поймет, кто такой Вася и как он сюда попал.
И еще. Можно работать на удаленном хосте, не светясь ни в auth.log, ни в `who` ни в `last`, без возможности посмотреть, что творится в консоли через watch - для этого достаточно запускать ssh-сессию так: ssh user@host "bash".

Мораль здесь одна: если у человека есть ssh аккаунт на машине, то контроллировать его действия практически невозможно.

This page is powered by Blogger. Isn't yours?