Archive

Archive for the ‘Tips’ Category

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:

mrxvt

November 27th, 2006 No comments

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

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

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

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

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

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

Hints [5..8]

November 24th, 2006 2 comments

[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, но криптостойкость ее алгоритмов очень низка (вернее, отсутствует)

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

Hints [1..4]

November 3rd, 2006 No comments

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

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

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

October 24th, 2006 No comments

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

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


ltIfModule mod_security.cgt
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

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

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

October 8th, 2006 No comments

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

а) Все начинается с генерации локали ru_RU-KOI8-R, делается это командой locale-gen. Список локалей, которые она будет генерировать, находится в файле /var/lib/locales/supported.d/local. Нужно привести его к такому виду:

#cat /var/lib/locales/supported.d/local
ru_RU.UTF-8 UTF-8
ru_UA.UTF-8 UTF-8
ru_RU.KOI8-R KOI8-R

Затем, собственно, сгенерировать:
#sudo locale-gen
Generating locales...
ru_RU.KOI8-R... done
Generation complete.

б) Далее, обновляем переменные окружения. За это отвечает файл /etc/default/locale. В нем пишем: LANG="ru_RU.KOI8-R"
LANGUAGE="ru_RU:ru:en_GB:en"

Иксы уже сейчас будут работать с богомерзской KOI8-R, а чтобы заставить работать консоль, нужно сделать еще несколько телодвижений:
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

Готово.

p.s. Только не спрашивайте, зачем кому-то в 21-м веке понадобилась KOI8-R. Иногда бывает, что с ней живется проще.

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

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

August 16th, 2006 No comments

Если не бояться страшных аббревиатур, то можно обнаружить очень полезные вещи у себя под носом. RCS – элементарная штука.

Для чего она нужна я думаю объяснять никому не надо. А для раобты с ней используются всего пять команд: ci (импорт), co (экспорт), rscdiff, rlog и rcs (тюнинг, настройка).

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

1. #ls -R > file – это файл, с которым будем работать.
2. #mkdir RCS – здесь будет располагаться RCS репозиторий.
3. #ci -l file – так файл сохраняется в RCS (почему -l – см. ниже)
4. #rcs -U file – установка постоянной блокировки – однопользовательский режим работы.
4. #vi file – редактируем файл.
5. #rcsdiff file – смотрим различия между сохраненной в RCS версией файла и текущей.
6. #ci -l file – сохраняем в RCS новую версию файла (при этом нас попросят ввести комментарий к версии)
7. #rlog file – просмотр changelog файла.

Это все!

Теперь несколько слов про опции. Практически для каждой команды можно указать параметр -r N.N – номер ревизии. Так, co -r 1.1 извлечет файл с номером версии 1.1, а ci -r 2.0 сохранит файл под версией 2.0. Иногда полезно выполнить rcsdiff -r 1.1 -r 1.2 file (сравнение двух версий, находящихся в репозитории) или rcsdiff -r 1.2 file (сравнение текущей версии с версией 1.2)

По умолчанию “ci” _перемещает_ файлы в репозиторий, а “co” извлекает их в режиме read only (т.е. права доступа 444 и не установлена блокировка, т.е. невозможно будет сохранить изменения). Опция -u для ci эквивалентна последовательному вызову ci file&&co file, а -l – ci file&&co file&&chmod 644 file&&rcs -l file. Т.е. файл сохраняется в RCS и извлекается, готовый к редактированию. При установленном sticky locking -u ведет себя так же как и -l.

Дальнейшее чтение: rcsintro(1), rcs(1), co(1), ci(1).

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

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

August 8th, 2006 2 comments

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

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

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

ФС и партиции

August 3rd, 2006 No comments

Теперь я знаю, почему ставить *nix даже на десктоп нужно в разные разделы. Разносить /, /var и /tmp по разным разделам – это минимум.

На моем рабочем компьютере сегодня начались какие-то проблемы с ФС (линукс, установленный в один ext3 раздел). Для того, чтобы натравить fsck на корневой раздел надо, по идее, сначала сделать “mount -o remount,ro /”, а это невозможно – “mount: / is busy”. Вот и придется решать проблему перезагрузкой, хоть это и противоречит моим убеждениям..

Впрочем, что делать, если бы я разбил диск и проблемы начались в разделе /var – вопрос открытый..

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