[ Content | View menu ]

Как распаковать vmlinuz и вытащить оттуда версию компилятора

05.09.2008

Иногда бывает необходимо узнать полную версию ядра Linux, не имея возможности или желания грузиться с него. Например, сегодня мне нужно было перекомпилировать ядро с незначительными изменениями в .config и самым тщательным образом убедиться, что новый vmlinuz ничем не отличается от старого. Один из ключевых моментов — это строчка vermagic, которая должна совпадать у ядра и загружаемых модулей. Эта строчка выводится в начале загрузки ядра, например:

Linux version 2.6.24-19-generic (buildd@terranova) (gcc version 4.2.3 (Ubuntu 4.2.3-2ubuntu7)) #1 SMP Fri Jul 11 23:41:49 UTC 2008 (Ubuntu 2.6.24-19.36-generic)

Интересующихся смыслом vermagic отправляю к главе 2.8 The Linux Kernel Module Programming Guide и описанию опции --force-vermagic в man modprobe.

Vermagic незагруженного модуля, находящегося в текущем каталоге, можно узнать по команде modinfo ./module_name.ko (работает, даже если модуль собран для другой архитектуры, например, если мы работаем в i386, а модуль — для x86_64, и наоборот). С ядром такой фокус не пройдет: во-первых, ядро, как правило, находится в сжатом виде, а исходники ядра не всегда доступны; во-вторых, сжатое ядро представляет собой загрузчик и распаковщик, за которым следует собственно сжатый алгоритмом zlib vmlinux (вопреки распространенному мнению, bzImage — это не ядро, сжатое bzip’ом, а сжатое ядро, которое можно загружать в несвязанные между собой области памяти), и необходимо отделить сжатое ядро от загрузчика.

Решение нашлось на форуме CodeGuru.

Заголовок gzip начинается с байт 1f 8b 08 00, их и будем искать. По ссылке выше рекомендуют использовать команду od -A d -t x1 vmlinuz|grep "1f 8b 08 00", и в некоторых случаях это действительно помогает, однако, во-первых, остаётся много трудноалгоритмизируемой ручной работы (необходимо отсчитать количество байт от смещения первого байта в строке до начала собственно заголовка gzip); во-вторых, две части искомого фрагмента могут находиться в разных строках, как, например, в текущей версии generic-ядра Ubuntu:

0011376 00 fd f3 a4 fc 5e 81 c5 ff ff 0f 00 81 e5 00 00
0011392 f0 ff 8d 83 90 01 1d 00 ff e0 01 01 1d 00 1f 8b
0011408 08 00 26 a1 ac 48 02 03 ec 3a 6d 74 14 55 96 af
0011424 3b d5 49 77 e8 58 15 a7 5b 5b b6 19 1a 2d 30 19

В данном случае, чтобы вычислить актуальное смещение заголовка gzip, необходимо к смещению первого байта в строке (11392) прибавить еще 14 байт. Поэтому мы пойдём немного другим путём.

Как я уже писал ранее, в состав исходников ядра Linux входит программа binoffset, с помощью которой можно находить сколь угодно длинные последовательности байт в бинарном файле. Ей и воспользуемся, благо она присутсвует также и в пакете linux-headers в Ubuntu:

$ gcc -o binoffset /usr/src/linux/scripts/binoffset.c
$ /binoffset /vmlinuz 0x1f 0x8b 0x08 00 2>/dev/null
11406

Теперь «вытащим» из vmlinuz сжатое ядро и распакуем его:

$ dd if=/vmlinuz skip=11406 bs=1|gzip -d >vmlinux

В vmlinux уже можно искать нужные строки:

$ strings vmlinux |grep gcc
Linux version 2.6.24-19-generic (buildd@terranova) (gcc version 4.2.3 (Ubuntu 4.2.3-2ubuntu7)) #1 SMP Wed Aug 20 22:56:21 UTC 2008 (Ubuntu 2.6.24-19.41-generic)
%s version %s (buildd@terranova) (gcc version 4.2.3 (Ubuntu 4.2.3-2ubuntu7)) %s

Как видно, получили почти то, что нам нужно. Теперь сократим все вышенаписанное в одну строчку:

(dd if=/vmlinuz skip=`./binoffset /vmlinuz 0x1f 0x8b 0x08 0x00` bs=1|gzip -d |strings|grep "^Linux version") 2>/dev/null

Оптимизацию и рефакторинг этой команды оставляю в качестве самостоятельной работы для читателей.

P.S. Примерно то же самое делает скрипт /usr/src/linux/scripts/extract-ikconfig, только нужно слегка его модифицировать, чтобы он выдавал не конфиг, а распакованное ядро, но мне было интересно изобрести очередной велосписед и разобраться самостоятельно :-)

linux - 0 комментариев

Небольшой костыль для мониторинга ресурсов

23.06.2008

На одном высоконагруженном сервере постоянно возникала нехватка ресурсов: то httpd расплодится и забьёт таблицу процессов, то место закончится, то память… Поэтому необходимо было мониторить несколько разных параметров. Разумеется, впоследствии тут не обошлось без Nagios’а, а в качестве срества дополнительного контроля мы сделали мелкий скриптик /usr/local/bin/hh, в который написали несколько строчек вида:

#!/bin/sh
df -h /usr/ | awk '$6~/^\/usr$/ {print $4" space available on /usr"}'
ps ax | grep httpd | grep -v grep | wc -l | awk '{print $1,"httpd processes running"}'

Запуск скриптика поместили в ~/.cshrc (дело было под FreeBSD) каждого заинтересованного пользователя, после чего, входя на сервер, админы получали необходимую информацию о состоянии системы и, если что, предпринимали действия по устранению неполадок.

Сейчас почти то же самое у меня работает на Asus EEE PC — в условиях крайне ограниченного места необходимо время от времени его мониторить, а захламлять панель (и память) апплетами очень не хочется. Поскольку я постоянно использую консоль, то посчитал логичным выводить информацию о свободном месте при каждом логине. Одна лишняя строчка при входе в шелл совсем не напрягает, а пользы от нее очень много.

linux - 2 комментария

SOCKS proxy в SSH

09.06.2008

Алексей Свешников в комментарии к заметке о пробросе туннелей через ssh напомнил о возможности использования ssh в качестве SOCKS4/SOCKS5-сервера.

Допустим, у нас есть рабочая станция в локальной сети за firewall’ом; также имеется ssh-доступ на сервер в Интернете. Кроме ssh, никакой связи с внешним миром не имеется, а очень хочется, например, подключиться к какому-нибудь jabber-серверу.

На рабочей станции запускаем простую команду:

ssh -D 5555 user@remotehost -f -N

Теперь, указав в настройках XMPP-клиента (например, Pidgin’а) в качестве SOCKS5 прокси localhost:5555, получим желаемый результат: Pidgin соединяется с сервером через внешний сервер.

Еще один неизвестный мне доселе ssh tip: в комплект поставки ssh входит программка ssh-copy-id, автоматически прописывающая ваш .ssh/.id_rsa.pub в .ssh/authorized_keys на целевом сервере и устанавливающая правильные права. Использовать это проще простого:

ssh-copy-id user@remotehost

(via 10 трюков в командной строке, о которых вы не знали.)

linux, Без рубрики - 4 комментария

Геотаргетинг в СУПе

07.06.2008

Прочитал во френдленте преисполненную драматизма историю попытки разместить нацеленную на Нижний Новгород рекламу в ЖЖ. Выяснилось, что для геотаргетинга в СУПе используется глючная база MaxMind GeoIP, вечно путающая Новгород и Нижний Новгород. Оставив в стороне некомпетентность суповского рекламного менеджера, который оказался не в состоянии разрулить проблему или хотя бы передать ее более компетентному коллеге, и сделав скидку на технические проблемы обработки накопленной в жежешной базе данных статистики соответствий IP-адресов и указанных пользователями регионов, можно констатировать, что имеет место явный обман — вместо ожидаемого заказчиком геотаргетинга по тому местонахождению, которое указал сам пользователь, работает (точнее, не работает) геотаргетинг по абсолютно левой, не относящейся к ЖЖ базе.

А ведь можно было бы пойти другим путём и всё сделать по уму — на основе указанных пользователями ЖЖ регионов сформировать базу, хотя бы уточняющую данные из MaxMind GeoIP — сразу была бы решена проблема отнесения нижегородцев к Новгороду и упомянутого поста не возникло бы. Или скооперироваться с другими сервисами СУПа (не ЖЖ ведь единым СУП жив), пользователи которых указывают своё местонахождение, и сделать свою, правильную базу, тогда от MaxMind вообще можно было бы отказаться — по крайней мере, для России.

А так получается еще один, не первый и далеко не последний камень в огород СУПа.

geolocation - 3 комментария

Asus EEE PC 701G: впечатления от использования

06.05.2008

  Aishe: Теперь я буду есть как все нормальные люди!
Aishe: на кухне
Aishe: с ноутом..

Цитата №396526

Две недели назад обзавёлся означенным ноутбуком, и за это время он уже успел неплохо себя зарекомендовать. Специально не стал сразу писать пост, чтобы успеть понять, действительно ли он стоит таких восторженных отзывов, или же всё обстоит как в известном анекдоте:
- Зря слона ругаешь!
- Почему?
- Не продашь!

Впрочем, обо всём по порядку.

1. Покупка
Последний раз я что-то покупал в Эльдорадо лет 5 назад — телевизор для престарелой бабушки. Дело закончилось обменом купленного телевизора на работающий уже через час после покупки. Затем лишь читал отзывы на сайте анекдот.ру (нашел место, ага). Но поскольку у нас EEE PC продаётся исключительно в Эльдорадо, то мне ничего не оставалось делать, кроме как скрежеща зубами нести им свои 10 т.р.

На удивление всё оказалось цивильно и без подвоха (несмотря на страстное желание менеджера продать мне заодно внешний накопитель, USB-мышь и техподдержку на несколько лет — раз в полгода бесплатно чистить клавиатуру). На мой вопрос о популярности данного продукта продавец ответил, что на складе их осталось совсем немного, и, если в ближайшее время не завезут, то через пару дней продавать будет нечего. Т.е. спрос на такой скромный, по сравнению с рядом стоящими собратьями, девайс, всё же имеется, и немалый.

2. Комплектация
В коробке обнаружился собственно ноут, чехол к нему, DVD с драйверами под Windows, руководство пользователя, несколько различных рекламных и гарантийных бумажек и адаптер питания. Несоответствие габаритов последнего духу минимизации неприятно поражает, а впоследствии и очень раздражает. Но, похоже, это единственная ложка дёгтя, поскольку всё остальное высоко держит марку.

По умолчанию на ноутбуке установлена специальная (?) редакция Windows XP. Про нее можно сказать, что несмотря на кажущуюся поддержку всех имеющихся устройств, включая возможность установить разрешение экрана 800×600 (с вертикальным скроллингом), выглядит она просто ужасно и пользоваться ею на Asus EEE PC без вреда для психического здоровья невозможно (мне, по крайней мере).

К чести Microsoft необходимо заметить, что без них эта покупка состоялась бы на несколько месяцев позже или вообще не состоялась бы — именно благодаря идее мелкомягких распространить как можно больше компьютеров с установленным Windows и их соглашению с Эльдорадо и Asus’ом о предустановке винды на ноуты, где изначально должен быть Linux и последующей продаже этих ноутбуков по демпинговой цене (в GNU/Linuxcenter правильные eee pc с xandros стоят от 12 т.р.) эти девайсы и попали в регионы.

Молодцы, одним словом, но я всё равно поставил Ubuntu.

3. Установка и настройка правильной ОС

Почитав мануалы по различным вариантам установки многочисленных дистрибутивов, я решил изменить Федоре, на которой сижу и с которой работаю последние несколько лет, с Ubuntu. Сама идея изначально ограниченного eeexubuntu мне не понравилась, поэтому я предпочел поставить нормальный ubuntu desktop и затем удалить оттуда всё ненужное. Установка 7.10 Gutsy Gibbon (не заморачиваясь с флэшкой, нашел старенький USB-привод и поставил с него) прошла без проблем, дальнейшая конфигурация согласно доке на wiki.eeeuser.com тоже особых затруднений не вызвала. Hardy Heron вообще должен с полпинка заработать, как пишут на том же сайте. Поэтому описывать в этом разделе больше нечего.

4. Использование

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

Возможности самого ноутбука вкупе с возможностями Ubuntu (уже из коробки на порядок превосходящие возможности Windows) предполагают огромное количество вариантов использования – от написания и отладки мелких скриптов до реализации целых проектов, от чтения новостей за чашкой кофе по утрам до ознакомления с рабочими документами и системной документацией (man bash удобно перечитывать в дороге :)). Исчезла проблема разделения основного домашнего компьютера: пока жена играет в очередную инкарнацию шариков, я валяюсь на диване с ноутом и занимаюсь своим делом. И наоборот, пока жена с ноута читает очередной детектив про Фандорина, ничто не мешает мне через ssh что-нибудь полезное поделать на том же ноуте. На первые майские праздники ездили в деревню, так я установил kstars и, сверяясь с этим карманным планетарием, смотрел в телескоп на звёзды.

5. Минусы

Предполагаемые ранее недостатки в полной мере себя не проявили: процессор Celeron M 600 Mhz работает довольно шустро; 512 мегабайт оперативной памяти вполне хватает для одновременного запуска трёх-четырёх приложений (firefox, gnome-terminal, openoffice и вышеупомянутый kstars); свободного места на диске после установки убунту оставалось почти 2 гигабайта. К уменьшенной клавиатуре я уже привык (только всё время вместо кнопки с тильдой и буквой Ё попадаю не туда и каждый раз промахиваюсь мимо правого шифта), тачпад тоже нареканий не вызывает. В режиме активного использования батарейка работает около двух часов, процесс полной зарядки занимает чуть побольше. К недостаткам можно отнести маленький экран, при котором приходится выбирать между крупным шрифтом и большим количеством отображаемой информации, и крайне неудобный адаптер питания, из-за которого всё добро приходится таскать в рюкзаке, вместо того, чтобы распихать по карманам.

6. Мораль

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

Разное - 21 комментарий

fortune в подписи thunderbird

29.04.2008

Что мы имеем на текущий момент:

  • thunderbird в качестве почтового клиента. Многим лучше, немногим хуже монстроидальных и неповоротливых Outlook и Evolution. Один из недостатков — невозможность редактирования шаблонов без использования дополнений, что приводит к необходимости каждый раз вручную вставлять подпись.
  • непреодолимое желание нести свет в корпоративные массы путём включения избранных linux-related цитат из сборника fortune linuxcookie

В настройках учётной записи thunderbird есть специальная галка «использовать файл подписи». Эту фичу и заюзаем для того, чтобы в каждое письмо вставлять подпись в соответствии с корпоративным стандартом и приплюсовывать туда что-нибудь забавное и правильное из fortune.

Для того, чтобы у получателя была возможность отличить собственно подпись от цитаты, буквально взявшейся с потолка, каждую строчку цитаты будем предварять традиционным для c-программистов сочетанием символов «//».

Ничтоже сумняшеся, набросал небольшой скрипт на любимом средстве мыслевыражения — perl-е:

#!/usr/bin/perl -w
use strict;

my $sign="/path/to/home/signature.txt";
open(F,">$sign") || die "Could not open $sign: $!\n";
my $fortune=`fortune linuxcookie`;
chomp $fortune;
undef($/);
$fortune=~s|\n|\n// |g;
while(<DATA>){
    s/\{fortune\}/$fortune/g;
    print F;
}
close F;
exit 0;

__DATA__
Best regards,
John Doe
Company
Department
Software Engineer

//  {fortune}

Поместив команду запуска этого скрипта в свой собственный crontab (man 1 crontab, см. также предыдущую запись), получаем обновляемый раз в минуту файл ~/signature.txt, который можно указать thunderbird’у как файл подписи. Что и требовалось.

lifehack - 5 комментариев

Организация рабочих файлов по неделям

28.04.2008

Ежедневно в моей рабочей папке появлялось от одного до полутора десятков и более файлов — документов, патчей, скриптов, отчётов и прочих продуктов рабочей деятельности. Однажды настал момент, когда найти нужный файл среди этого бардака стало довольно затруднительно, и чаша моего терпения переполнилась. Файлы нужно каким-нибудь организовать, подумал я. Изобретать систему меток для организации файлов по фэн-шую GTD было лень, поэтому я просто остановился на принципе «одна неделя — одна папка», т.е. все файлы хранятся в папках вида ~/work/week18, к текущей и предыдущей неделе можно обратиться по ссылкам ~/work/current и ~/work/prev.

Для начала я соорудил скрипт для раскидывания файлов по папкам, создающий в текущей директории папки с именами в нужном формате, если их не существует, и перемещающий туда файлы:

#!/usr/bin/perl -w
use File::stat;
use POSIX qw(strftime);
use strict;
foreach(`find . -maxdepth 1 -type f |sed 's/\ /\\ /g;'`){
    chomp;
    my $st=stat($_)||die "Could not stat $_: $!\n";
    my $week=strftime("%W",localtime($st->mtime));
    unless(-d "week$week"){mkdir "week$week";}
    rename("$_","week$week/$_")||warn "Could not rename $_ to week$week/$_: $!\n";
}

Затем создал скриптик для еженедельного создания новой папки и переименования ссылок current и prev:

#!/bin/sh
current_week=week`/bin/date "+%W"`
test -L ~/work/prev && rm ~/work/prev
mkdir -p ~/work/$current_week
pushd ~/work
test -L current && /bin/mv current prev
ln -s $current_week current
popd

Запуск скриптика в первый день каждой недели (нулевой — воскресение, по американским традициям) поместил в свой crontab (если кто еще не в курсе, у каждого пользователя есть свой crontab, аналогичный общесистемному /etc/crontab; редактируется с помощью команды crontab -e, просматривается командой crontab -l; подробнее см. man 1 crontab):

# crontab -l
1   0   *   *   1   ~/bin/weekly.sh

Ссылки на ~/work/current и ~/work/prev впоследствии была добавлены в в favorite folders в Gnome, а также во все места, где требуется быстрый доступ к рабочим материалам. Кроме того, в начале каждой новой недели при написании еженедельного отчета стало на порядок проще делать обзор работы за предыдущую неделю (конечно, список рабочих активностей не исчерпывается появившимися файлами; есть же еще и почта, и bug-tracker, и другие средства организации информации)Недостаток у данного скрипта пока один — нужно ежегодно архивировать накопившиеся 52 папки, иначе снова возникнет бардак :) Но и это исправляется при наличии желания и умения.

lifehack - 8 комментариев

Epic fail

10.04.2008

Из всех админских ошибок, которые мне когда-либо случалось делать (с каждым бывает), самой кошмарной, до сих пор приходящей ко мне в сновидениях, была опечатка в рутовой консоли на боевом сервере под управлением freebsd 5.4: вместо обычного убийства команды в бэкграунде kill %1 набрал и выполнил kill 1. Всего один символ забыл, зато какой эффект! Процесс init с pid’ом 1 был благополучно уничтожен… К чести Linux-сообщества, эта команда на моём тестовом сервере действия не возымела.

linux - 6 комментариев

Небольшие обновления в блоге

07.04.2008

1. Нарисовал себе велосипед в качестве favicon.ico. Хотите такой же? favicon.cc вам поможет.

2. Свёл все свои нетленные креативы в единое содержание, которое стало уже третьим по списку (но не последним по смыслу) методом навигации по сайту. Предыдущие два — метки и «предыдущая страница — следующая страница» — не очень хорошо работают. Идею слизал у интернетных штучек. Пока что из-за большой доли комментариев к ссылкам обновляется вручную, но надо будет подумать над автоматизацией процесса.

Разное - 0 комментариев

Anonymising proxies в Google

03.04.2008

Читаю CV человека по имени Ian Macdonald, автора многочисленных скриптов автодополнения в bash, с 2001 года работавшего (работающего?) системным администратором в Google. Конечно же, неплохой образец карьеры в Linux/Open Source, но вот эта фраза меня смутила:

Configured and deployed HTTP-anonymising proxies for anonymous corporate use of WWW.

Значит ли это, что в Гугле настолько пекутся о конфиденциальности веб-серфинга своих сотрудников, что предлагают им ходить в интернет через собственные анонимные прокси?

Разное - 0 комментариев

Фокусы с автодополнением в bash

После посещения заметки "Создание списка имен хостов для ssh на лету для автодополнения" долго вчитывался в man bash с целью понять, как же там это автодополнение работает. В конце концов, поняв, что с наскоку эту гремучую смесь из фич баша и возможностей readline не осилить, скачал оба исходника и нашел там великое множество примеров использования автозаполнения в bash, значительно упрощающих повседневную работу в консоли. Эти команды можно добавить в ~/.bash_profile или вынести в отдельный файл ~/.bash_completions или /etc/bash_completions и подключать его в .bash_profile. Список текущих дополнений можно посмотреть по команде complete (без параметров).

Данные скрипты скопированы почти без изменений из папки examples/complete архива с исходными текстами bash. Автор всех скриптов, за исключением последнего — Ian Macdonald. На его странице доступен архив с огромным количеством скриптов автодополнения. Автор последнего скрипта (автодополнение длинных опций у configure) — Manu Rouat. Большое им человеческое спасибо :-)

Для команд работы с каталогами tab показывает только каталоги:

complete -d cd mkdir rmdir pushd

Для команд работы с файлами показываются только файлы (все или определённых типов, в зависимости от команды):

complete -f cat less more chown ln strip
complete -f -X '*.gz' gzip
complete -f -X '*.Z' compress
complete -f -X '!*.+(Z|gz|tgz|Gz)' gunzip zcat zmore
complete -f -X '!*.Z' uncompress zmore zcat
complete -f -X '!*.+(gif|jpg|jpeg|GIF|JPG|bmp)' ee xv
complete -f -X '!*.+(ps|PS|ps.gz)' gv
complete -f -X '!*.+(dvi|DVI)' dvips xdvi dviselect dvitype
complete -f -X '!*.+(pdf|PDF)' acroread xpdf
complete -f -X '!*.texi*' makeinfo texi2dvi texi2html
complete -f -X '!*.+(tex|TEX)' tex latex slitex
complete -f -X '!*.+(mp3|MP3)' mpg123

Для команд работы с заданиями показываются номера заданий, предваряемые символом "%":

complete -A signal kill -P '%'
complete -A stopped -P '%' bg
complete -j -P '%' fg jobs disown

Сетевым командам подставляется список хостов из файла, заданного в переменной окружения HOSTFILE. Обычно это файл /etc/hosts:

complete -A hostname ssh rsh telnet rlogin ftp ping fping host traceroute nslookup

По уже упоминавшейся ссылке рекомендуют подставлять команде ssh список хостов из ~/.ssh/known_hosts:

complete -W "$(echo `cat ~/.ssh/known_hosts | cut -f 1 -d ' ' | sed -e s/,.*//g | uniq | grep -v "\["`;)" ssh

Для ряда встроенных команд bash, а также системных команд тоже свои списки дополнений:

# подставляются переменные окружения
complete -v export local readonly unset
# подставляются параметры команд set, shopt, help, unalias, bind
complete -A setopt set
complete -A shopt shopt
complete -a unalias
complete -A binding bind

Для команд управления выполнением программ подставляются названия возможных программ:

complete -c command time type nohup exec nice eval strace gdb

Думаю, основной принцип понятен -- указываем ключевое слово "complete", за ним некий список возможных "подстав" и далее команды, для которых этот список работает. Список подстановок может быть задан в виде уже готовой опции, как в большинстве вышеприведённых примеров (в фрагменте complete -d cd mkdir rmdir pushd опция -d означает, что должен подставляться список доступных каталогов; на самом деле это сокращённый вид опции -A directory. За списком возможных параметров опции -A обращайтесь к man builtin), в виде списка возможных слов, как в примере с .known_hosts (тогда список предваряется опцией -W), или в виде списка файлов (-X "*.gz" покажет все доступные файлы, которые не совпадают с шаблоном "*gz"; чтобы, наоборот, показать все файлы *.gz, нужно в начало шаблона добавить восклицательный знак).

Конечно же, этим возможности автодополнения bash не ограничиваются. Можно использовать свои функции, которые сработают после того, как пользователь напишет команду, но перед тем, как будет нажата кнопка Tab, показывающая список возможных параметров. Такие функции должны произвести какие-то действия для нахождения подходящих параметров для автодополнения и заполнить этими параметрами массив COMPREPLY; при этом доступны массив COMP_WORDS, содержащий все слова из уже написанной строки, переменные COMP_CWORD (номер текущего слова в массиве COMP_WORDS), COMP_LINE (вся строка целиком в одной переменной) и еще парочка (см. man bash).

Формат команды настройки автодополнения в случае использования функции следующий:

_function_name ()
{
...
}
complete -F _function_name command

Чтобы не быть голословным, приведу несколько примеров, из которых всё станет ясно:

Для команды umount подставляется список примонтированных файловых систем:

_umount ()
{
    local cur
    COMPREPLY=()
    cur=${COMP_WORDS[COMP_CWORD]}

    COMPREPLY=( $( mount | cut -d' ' -f 3 | grep ^$cur) )
    return 0
}
complete -F _umount umount

Для команд работы с группами пользователей подставляются названия групп из /etc/group:

_gid_func ()
{
    local cur
    COMPREPLY=()
    cur=${COMP_WORDS[COMP_CWORD]}
    COMPREPLY=( $( awk 'BEGIN {FS=":"} {if ($1 ~ /^'$cur'/) print $1}' /etc/group ) )
    return 0
}

complete -F _gid_func groupdel groupmod

А теперь те две функции, ради которых, собственно, и затевался этот пост :)
Автодополнение параметров для команды find:
read more…

linux - 6 комментариев

Околотелефонные проблемы

28.03.2008

Последние несколько недель жестоко страдал от странного поведения моего телефона (Sony Ericsson Z530i) — при попытке вынуть телефон из поясного футляра с тем, чтобы ответить на входящий вызов, звонок всегда сбрасывался и приходилось перезванивать и извиняться. Меня это под конец достало и я таки разобрался.

Проблема оказалась в том, что футляр держится в закрытом состоянии благодаря довольно сильному магниту. При вынимании телефона из футляра возникал небольшой ток вследствие явления электромагнитной индукции, в результате чего эмулировалось нажатие кнопки и происходил сброс вызова. Придётся теперь привыкать класть телефон в футляр другой стороной или обвешиваться гарнитурой, вдобавок к наушникам от плеера… Или футляр менять.

лытдыбр - 1 комментарий

Извлечение конфига ядра Linux без загрузки с него и другие советы

В случае, если при сборке ядра была включена опция «Kernel .config support» (CONFIG_IKCONFIG), файл ядрёной конфигурации .config добавляется в бинарник ядра в гзипованном виде. А если дополнительно отметить еще и «Enable access to .config through /proc/config.gz» (CONFIG_IKCONFIG_PROC), то этот конфиг доступен через /proc/config.gz. Иногда хочется посмотреть, чем одно ядро отличается от другого в плане конфигурации, но перезагружаться или городить виртуальную машину ради того, чтобы посмотреть /proc/config.gz, не хочется. В таком случае помогут два скрипта, входящих в состав архива с исходными текстами ядра. Первый из них, служебный, называется binoffset и предназначен для определения смещения бинарного фрагмента от начала файла. Второй называется extract-ikconfig и служит непосредственно для поиска и извлечения из бинарника ядра гзипованного конфига. Перед запуском необходимо скомпилировать binoffset:

cd /usr/src/linux/scripts
gcc -o binoffset binoffset.c

После чего можно натравливать extract-iconfig на ядро:

scripts/extract-ikconfig /path/to/bzImage

Иногда при работе в midnight commander появляется сообщение «The shell is already running the command», не дающее выполнить команду в текущем каталоге. Стандартный способ обхода — Ctrl+O, Ctrl+C, Enter приводит к тому, что mc возвращается в каталог, где была выполнена предыдущая команда, и приходится еще раз переходить в нужный каталог. Проблема обсуждается чуть ли не с самого первого релиза mc, но по каким-то причинам принципиально не может быть решена.

В этом случае помогает выполнение команды «cd -» (после Ctrl+O, Ctrl+C, Enter, Ctrl+O), которая меняет каталог на предыдущий (т.е. в котором мы находились до первого Ctrl+O). (или Alt+Y, как советуют в комментариях)


Регулярное чтение избранных частей из man bash просветляет и приносит несомненную пользу. Недавно поразил коллегу генератором паролей на основе /usr/share/dict/words:

#!/bin/bash
passwords_count=3
test $1 && echo $1 | grep -q ^[0-9]*$ && passwords_count=$1

words=/usr/share/dict/words
words_count=3
symbols=("," "*" "-" "(" ")" "_" '"' ',' ',')

# prepare words array
declare -a allwords
exec 10< $words
while read LINE <&10; do
    allwords[${#allwords[*]}]=$LINE
done

nwords=${#allwords[@]}

for ((k=0;$k<$passwords_count;k++));
do
    declare -a words_array
    for w in `seq 0 $words_count`; do
        words_array[${#words_array[*]}]=${allwords[$(($nwords*$RANDOM/32767))]}
    done

    passwd=${words_array[0]}
    for ((c=1;$c<${#words_array[@]}-1;c++));
    do
        symbol=${symbols[(($RANDOM*${#symbols[*]}/32767))]}
        passwd="${passwd}${symbol}${words_array[$c]}"
    done
    echo $passwd
    unset passwd
    unset words_array
done

linux - 3 комментария

Asus EEE PC в Нижнем Новгороде

27.03.2008

Видел вчера в местном Эльдорадо (ТЦ Шоколад на ул. Белинского в Нижнем Новгороде) недавно завезённый туда Asus EEE PC 701 стоимостью 9999 рублей. На фоне своих больших собратьев смотрится довольно невзрачно, и ажиотажа вокруг него, конечно же, не наблюдается, что дало мне возможность познакомиться с ним поближе.

Несмотря на самые пессимистичные ожидания, на семидюймовом экране разрешением 800 на 480 умещается довольно большое количество графической информации. Другое дело, что идиотское оформление установленной там Windows XP съедает процентов 15-20 экранного пространства, но это дело поправимое. Из ПО, кроме идущего в составе XP, установлен пакет Microsoft Works — видимо, какой-то ограниченный недоофис. Из 4 гигабайт дискового пространства под систему отведено почти 2,6 Гб, еще 30 мегабайт занято шифрованным диском непонятного назначения, таким образом, пользователю остаётся 1,4 Гб под его личные нужды. Уже сейчас видно, что это всё будет тормозить и глючить (с). Опять же поправимо путём установки более правильной ОС.

Попробовал набрать простенький стишок про ёжика в блокноте — кнопки нажимаются легко, пальцы друг другу не мешают. Клавиатура русская, кнопка Ctrl — самая крайняя в нижнем ряду, Fn — следующая, так что после больших клавиатур привыкать придётся лишь к иному расположению и без того редко используемой клавиши с логотипом Windows.

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

Еще одна потенциальная проблема — ненадёжность только ещё появившихся SSD, что чревато потерей данных и гарантийными разбирательствами с Эльдорадо. Та еще контора, кстати, но за неимением лучшего предложения и рак в поле рыба.

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

Разное - 5 комментариев

2 способа проброса туннелей с использованием ssh

27.02.2008

1. туннель ssh

Дано: сервер ourproxy.provider.ru, стоящий на страже локальной сети. Этот сервер доступен извне и на нём работает демон sshd.

Требуется: получить из дома доступ к ресурсам внутри локальной сети, например, к интранет-серверу 10.10.5.1:80

Решение: выполнить на домашней машине команду, пробрасывающую туннель к искомому IP-адресу через ourproxy.provider.ru:

ssh -f -N user@ourproxy.provider.ru -L 8080:10.10.5.1:80

Опция -f говорит ssh, что после соединения нужно уйти в background.
Опция -N указывает, что никаких команд выполнять не нужно
Ключ -L означает, что соединения к localhost на порт 8080 нужно перенаправлять на 80 порт IP-адреса 10.10.5.1

Таким образом, набирая в браузере адрес http://localhost:8080, попадаем на нужный сервер.

2. обратный туннель ssh

Дано: компьютер на работе, находящийся за firewall’ом и nat’ом; компьютер дома с доступом в интернет; сервер ourproxy.provider.ru с работающим sshd, доступный обоим компьютерам. Но в данном случае прямой доступ с ourproxy.provider.ru к рабочей машине отсутствует.

Требуется: получить из дома доступ к сервису sshd на рабочем компьютере.

Решение: на рабочей машине выполнить команду:

ssh -f -N user@ourproxy.provider.ru -R 12345:localhost:22

Опции -f и -N описаны несколькими строчками выше.
Ключ -R означает, что подключения к порту 12345 на ourproxy.provider.ru будут перенаправляться на 22 порт рабочего компьютера.

После выполнения этой команды с рабочей машины можно будет попасть на эту машину с ourproxy.provider.ru, выполнив команду:

ssh -p 12345 user@locahost

По этому же принципу можно получить доступ к прочим ресурсам локальной сети. Вот еще один пример.

На рабочей машине:

ssh -f -N user@ourproxy.provider.ru -R 8080:10.10.5.1:80

На домашней машине:

ssh -f -N user@ourproxy.provider.ru -L localhost:8080:localhost:8080

Теперь, набрав в адресной строке браузера на домашнем компьютере http://localhost:8080, получаем доступ к интранет-серверу за семью замками двумя firewall-ами.

Конечно же, это приводит к серьёзной бреши в корпоративной безопасности, поэтому крайне не рекомендуется злоупотреблять этим советом.


Чтобы не писать команды вручную при каждой перезагрузке, можно внести их в конфигурационный файл ssh_config. Интересующихся отсылаю к соответствующему ману.

linux - 5 комментариев