Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Лучшие статьи журнала


Информационный Канал Subscribe.Ru

Здравствуйте, уважаемые читатели!

В этом выпуске рассылки публикуется статья, занявшая по результатам голосования второе место.


Арсений ЧЕБОТАРЁВ,
ac@comizdat.com

Маленькая база для маленькой компании

Ко мне периодически приходят письма такого содержания: «Я обычный суперпрограммист — но вот не совсем понимаю в администрировании. Моя проблема — так настроить компьютеры, чтобы из дому получать доступ к компьютеру на работе через три файрвола и NAT со всех сторон, но чтобы админ об этом не знал». Хм, какие проблемы — базары трем, проблемы решаем, а если нужно — то и создаем…

Мы были перед человеком-автоматом,
игрушкой в триста тысяч ценой,
умеющей говорить.
Александр Грин, Золотая цепь

Люди довольно часто оказываются в ситуации, когда срочно нужно получить доступ к данным на работе. При этом оба компьютера подключены к интернету через гейтвей и NAT — то есть имеют маскарадные IP-адреса и, естественно, не могут увидеть друг до друга по ftp, telnet или rsh. В данном случае мы не рассматриваем вариант с «третьей точкой», то есть с компьютером, который вы контролируете и который все время находится в сети. (Кстати, у меня таких целых два — но это просто некоторым так повезло.) К тому же вы не всегда можете спланировать работу таким образом, чтобы заранее положить на «третью точку» нужные вам файлы. Я уже не говорю о том, что часто бывает нужен «типа-шелл», а не собственно файлы.

Конечно, если у обоих компов нет никаких сетевых интерфейсов, то данные можно пробросить только DAT-лентами на оленях (вы, может, и не знаете — а на Аляске так когда-то досталялась электронная почта и FIDO, в натуре).

Немного о файрволлах и прочих рестикшинах. Как показывают мои наблюдения, на фирмах чаще всего запрещают доступ к тем трафикам, которые жрут байты. То есть к «мульке» (eMule) и ей подобным и даже — что есть полный позор! — к http. А вот к чему доступ, как правило, есть всегда, так это к почте, часто к ftp, а также — что есть гуд — к аське, то есть ICQ. Гуд, потому что аська — очень «плоский» интерфейс, который потребляет минимум трафика. А это важно в подключениях, где считаются байты: например, Volia Broadband (через TV-кабель), побайтовый xDSL (Cyfra, Optima), а также (важно!) — в подключениях по GPRS. Важно — потому что, если кабельные «траферы» кусают ваш бюджет за каждый мег, то GPRS этот самый бюджет вообще рвет, как Тузик грелку.

Вот именно доступ по GPRS был для меня задачей №1. Некоторые из нас, как известно, имеют привычку садиться в транспортное средство (на велик-мотик, в тачку, на дозу), а потом с утра протирать свои сморщенные революционные глазенки на предмет «ой, а где это я, чувачки? и дайте-ка мне доступ к файлам в офисе, плз». Активный образ жЫзни назыается.

Да, так вот, для такого образа жизни GPRS — самое что ни на есть оно. Конечно, я никогда не работаю через WAP-GPRS, у меня с косоглазием плохо, а вот в качестве модема использовать трубку очень удобно, чего и вам желаю. Короче, второе после так называемого low-ID (то есть временного и локального IP) — это возможность для нашего метода доступа работать через самый «строгий» к трафику вариант, например GPRS.

Третье — это «ленивый» вариант разработки. Как известно из классического труда «Десять благодетелей программиста», лень является одной из основных добродетелей кодера. Как следствие — все, что уже было написано и работает, никто не должен переписывать. И при этом нужно надеяться, что написано уже вообще все и искать до последнего — и только в крайнем случае писать собственный код.

В результате получаем такую постановку, плавно переходящую в будущую архитектуру нашего приложения: есть два компа, оба — за натом, то есть без внешних адресов. Также мы не можем (не хотим, лень, другое) тревожить системного администратора. Далее: подключение должно лояльно относиться к трафику, а поскольку из возможных готовых протоколов мне больше нравится ICQ, то так тому и быть.

Итого: я через аську подключаюсь к удаленному компу, тулю ему какие-то команды, а он мне за это делает приятно в извращенной форме. И последнее — если уж нам придется изучать чужой код, то я выбираю для этой цели что-то, что работает и под Линуксом (где, я, блин, и нахожусь), и под Виндой. В окончательном результате LICQ отпадает, как яйца от кандидата,— и остается последний, единственный и неповторимый Sim, на который перешли все знакомые мне задвиженцы, который я тоже юзаю и который написан на том самом Qt, который, в свою очередь, мне тоже совершенно не чужд.

Да, так вот, взял я этот самый Sim за исходник, почитал доку и — оба-на! В самом Sim'е есть такой плуг (называется Action), который — растопырили уши! — вызывает указанное вами приложение в ответ на любое происходящее действие. В том числе — на приход. В том числе — на приход сообщения. В том числе — от меня, всевидящего. Вот так вот ботик и получит сигнал бедствия. Вот так он и запустит ботика, который отошлет мне все мои файлы.

Это называется «молитва — оружие верующего».

Почему все остальное — sucks

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

Первый «конкурент» нашего бота — это различные программы удаленного управления. Ну, сразу скажем, что все они, начиная от vnc и заканчивая Citrix Metaframe, работают по определенным портам, которые были закрыты еще в первом действии. Во-вторых, все они кидаются графикой, то есть огромными и бесполезными мегабайтами. Уже указанные vnc и Citrix пробрасывают реальные куски экрана, пусть и оптимизируя этот процесс (invalidate по площадям, пересылки по запросу и локальные «догадки» у Citrix) и даже пожимая его на лету. Все равно: в плане трафика пересылка графики — бред полнейший.

Несколько отличаются похожие «братья загребали» — X-Windows и ему «иксоподобные». Эти пересылают только GDI-вызовы, что, конечно, уже компактнее — но все равно никому не надо. Ну, по крайней мере, мне совершенно не интересно, как именно расположены окошки — вдоль или поперек, и каким стилем отрисовывается KDE. А в случае с X-Windows сеансом мне это придется узнать.

Мне нужны:

а) файлы (возможно, на сетевых ресурсах, куда у меня есть права монтироваться);

б) почта — в режиме статистики или форварда (то есть, чтобы можно было сказать: «это письмо перешли мне сюда»;

в) способность отдать «мульке» команду «качай ID=59ac8f10b43901, скАтина!!!».

Ну, собственно, и все — а уж как оно там на экране, меня не шкребет.

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

Во-вторых, есть еще одна опасность. Вот представьте: поставили вы мост, подняли «типа-локалку» и стали присоединяться к удаленному компу. Что вы можете сделать? Либо опять откроете ту же жирную X-Windows-сессию, либо же примонтируетесь по nfs, а потом станете на удаленных fs'ках открывать файлы — и при этом OpenOffice будет в режиме AutoSave пробрасывать ваш файл каждый раз по соединению, накручивая мегасы. А уж если вы удаленно откроете файл в MS Word, тот вообще удаленно создаст файл отката с таким к нему трафиком, что замахаетесь деньги провайдеру носить.

Короче, мост это круто — но если вы построите его в среде с оплатой по трафику, то логоньтесь каким-то ssh на худой конец. Опять-таки, в нашем случае обычный мост не катит, хотя можно придумать какой-то IPoverFTP или даже IPoverEMule. Тема интересная и бесконечная.

Наконец, последний, самый близкий по духу и родственный по содержанию вариант — это известный с детства почтовый ботик. Всем он хорош — и тем, и этим, и доступен, и красив. Одна разница небольшая — реактивность, то есть скорость реакции. Кое-где почта ходит очень легко, кое-где — пакетами, по расписанию. Собственно, это не беда — но если есть аська, то она ведь все равно быстрее ходит. Что еще: почту часто читают администраторы и начальство (просто в договоре так и пишут «будем, мол, читать вашу почту»). И если админ найдет ваши странные «письма на Родину», то у него может зародиться подозрение, что вы — шпион вражеский или мало еще какая сволочь. А вы всего-то и хотели, что поработать на выходных.

Короче: мы за почтовые ботики — но это дело исследованное, так что и писать бы не стоило.

Знакомьтесь — Хавик, младший брат Ксаверия

— Ксаверий! Позволь рассказать твою историю!
— Мне все равно,— ответила кукла.— Я — механизм.

После трех секунд напряженной мысли я тут же придумал имя своему ботику: Ксаверий — так звали известного механического человека из повести Александра Грина «Золотая цепь». Но об ём самом попозже — а пока поговорим о его младшем братике, Хавике.

Идея проста: Хавик получает сообщения по ICQ посредством плуга Sim Action, анализирует адрес отправителя, а также некоторые дополнительные делишки (если вы думаете, что я тут все выложу — то, как говорят индейцы, «фигвам!» — у меня еще не так хорошо отлажена система защиты, чтобы подставлять Хавика под атаку ваших злобных грабалок).

Кстати, мой Хавик даже дает мне ощущение удаленного шелла — правда, очень ограниченного, то есть супербоссом через него невозможно стать в принципе, поскольку нельзя удаленно ввести пароль. Как говорится, «забудьте слово root».

На самом деле я написал с две дюжины скриптов — и мой ботик выполняет их по одному за раз, типа собственной оболочки. Этого мне достаточно для удаленного монтирования на наш сервер рабочей группы (по самбе или nfs) и для того, чтобы паковать там файлы и отсылать мне-себе на почту или выкладывать на ftp. По корявости своей это сильно напоминает удаленное управление в известном трояне Back Orifice — но, как говорится, «имеешь консоль — имеешь кого хочешь».

Не буду скрывать: первым номером был скрипт «прочитать почту или получить файл по ftp/http (если доступно) и подключить новый скрипт к команде такой-то». Ну, типа «set ftp checkmail» ищет исполнимый файл с именем checkmail (скорее, checkmail.py — поскольку я сейчас в большой дружбе с питонами) на нашем условленном сервере (пароли знают только двое) и устанавливает его в качестве новой команды.

В результате я дома за свои деньги не читаю тот спам, который приходит мне на работу — по команде checkmail digest письма аккуратно получает новый скрипт и высылает мне лишь резюме: «прислали 693 письма, из них 691 — галимый спам, два — от boss@mudila.ru (3000 байт) и от natasha@love.com (40000 байт), а также от неизвестного васи traktorrr@udaff.com (4000 байт)». Так, или почти так.

Следующим моим действием может быть, например, checkmail fwd_whitelist noattch — эта команда перешлет мне почту от тех людей, которые в «белом списке» (обычный текстовый файл на удаленном компе, тоже может обновляться удаленно), причем без удаления с нашего почтового сервера и без всяких аттачментов. Ну, и так далее — и это только одна команда, и то еще скромный набор возможностей.

Что самое главное, так это то, что поверх этого фрэймворка каждый легко сможет построить свои миры, целые «города» скриптов, интегрироваться в любые доступные службы вроде ftp или http — это уж что вам удобнее, те же файлы можно выкладывать в архиве на ftp, или присылать вам по почте, или и то и другое одновременно. То есть получить все что угодно можно где угодно: в интернет-кафе, например,— по ftp, а в таежной глуши лучшим вариантом может оказаться почта. Если есть практика написания скриптов на том же Pyt/home/ac/dev/xalichon сходу, можно срочно написать содержательный код типа sendAllSexPornoNow.py — и поднять его как новую команду.

С другой стороны, кое-кто (типа админа, например) может и расковырять автоматический бинд новой команды или вскрыть пароль архива. Короче, в безопасности я пока не уверен. Так что, хоть в моем случае от админа Леши у меня секретов нет (да и какие могут быть секреты при физическом доступе к моему компу на работе?) — тем не менее, я предпочитаю стратегию «защита через неизвестность», поскольку есть и другие-разные, которые если и не взломают, то завалят моего Хавика спамом или станут брутально энфорсить. Как говорится, чего и вам советую — Сеть так плотно наполнена такими долбожелателями, что вам и не снилось.

Механика

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

Вернемся к механике вопроса. Документации у плуга Action — минимум. Или максимум, если в качестве документации рассматривать исходный код. В моем изложении перевод хелпа выглядит следующим образом:

  1. В командной строке можно использовать параметры: &IP, &Mail, &Phone, &Nick, &Unread, &Status, &TimeStatus, &IntervalStatus (по-русски: вместо указанных параметров Sim подставляет в командную строку, которую вы вводите, реальные, участвующие в операции значения.
  2. command вызывает команду и подставляет вместо себя вывод команды. Для пользователей Linux тут и так все понятно, а приверженцам MS Windows объяснять все равно бесполезно — ни нормальной консоли, ни командной строки, ни обратных кавычек у них сроду не было, нет и, судя по всему, никогда не будет.
  3. Для событий, связанных с сообщениями, текст сообщения поступает на «линейный вход». Если прога выходит по exit(0), текст будет заменен на стандартный выход программы (оба-на!). Если же эта прога ничего не пишет, месага исчезает (вообще, как и не было). Это сделано для создания фильтров сообщений.

Что в этом хорошо, так это то, что у нас есть один сравнительно небольшой модуль, который «хукает» весть памп Sim'а и позволяет эффективно тырить сообщения из входной очереди. Что и было немедленно реализовано.

Чтобы вы и сами могли «прочувствовать», как работает Хавик, представляю его первую (минус нулевую) версию, с которой-то все и началось. Хавик расположен у меня по адресу /home/ac/dev/xavic, поэтому строка в настройках Sim выглядит так:
Setup->Plugins->Action->Message->~/xavic/xavic.py

Поскольку сейчас я пишу на Python все то, что раньше писал на Perl, текст выглядит следующим образом:
#!/usr/bin/python
import sys
file=open('/tmp/xavic.log','a')
msg=sys.stdin.readlines()
file.write('- '*30+'\n')
for i in msg:file.write(i+'\n')
file.close()

В указанном файле /tmp/xavic.log появляется именно то, что вы там можете ожидать,— сообщения ваших контактов. Попробуйте и убедитесь сами. Естественно, в реальной жизни это не сообщения, а команды, которые не записываются (впрочем, записываются тоже), а выполняются с помощью довольно-таки прямолинейной, но гибкой системы вызовов внешних модулей Python.

Ксаверий, собственно (человек в стадии разработки)

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

Собственно, всем хорош Хавик — да только очень уж молчалив. Стандартный механизм Action позволяет перехватывать сообщения и реагировать на них — но не отвечать. А ведь по тексту Ксаверий именно что отвечал на всякие умные вопросы.

Так что Ксаверий — это новый, совершенно независимый плуг для Sim с одноименным названием Xaverius. Он тоже имеет похожее окно настроек, куда можно вставить программу — но, в отличие от Хавика, не «фильтрует» сообщения для пользователя. Напротив — выход программы является «ответкой» для удаленного командира. Кроме того, в Ксаверия не встроена обработка других «событий списка», таких как вставка нового контакта и т.д.,— а только «новое сообщение».

Короче, интересный получается «человечище», хотя некоторые моменты еще не отлажены. Что важно: поскольку механизм подключения тот же (ну и код, конечно, был позаимствован из Action), то все скрипты работают абсолютно так же — так что реально переделок не так много.

Об интерфейсах Sim и о том, как писать плагины, я расскажу как-нибудь при случае — а вообще-то перед вами код, там уже все написано.

Кстати, один и тот же код дает целых четыре варианта подключения к ICQ-протоколу (и к остальным тоже). Два уже описаны: подключение к «плугу» Action и написание собственного плагина. Два других — это прямая эксплуатация протокола по ICQ-плагину, но это долго и неспортивно, в смысле — не «лениво». Наконец, самый для меня сейчас интересный вариант (и, наверное, самый правильный) — удаленное управление через UINX-сокет /tmp/sim.%user%. Просто этот выгодный вариант первоначально ускользнул от моего внимания — подкупило слово Remote, а ведь это совсем не предписывает все делать именно удаленно. В документации говорится о подключению по telnet — но это тот же шелл, а значит то, что делает римоут кантрол simctrl, то же можем мы делать и сами.

Все команды хорошо «описаны» в plugins/remote/remote.cpp. Правда, в римоутере не реализованы «хаверские» операции принятия и рассылки сообщений (наверное, чтобы усложнить жизнь спамерам), но это дело наживное. Так что сейчас я занят «подкопом» с этой стороны. И, опять-таки, поскольку все закончиться передачей команд в «шелл-мирок» моих скриптов, то и здесь все будет просто. Собственно, это тот механизм, с помощью которого Хавик может стать разговорчивым ботиком.

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

Что же из этого следует? Следует жить?

— Ксаверий! Что ожидает нас сегодня и вообще?
— Все вы умрете; а ты, спрашивающий меня, умрешь первый.

Как и было обещано, проблемы мы решаем. Но можем и создавать. В некотором смысле моя статья — вредная, скорее создающая проблемы, чем решающая их. Вот жил себе человек, ничего не знал, ни о чем не беспокоился — и вдруг узнает о Sim Action plug-in, вспоминает о Linux, о командной строке, обратных кавычках и еще бог весть о какой ерунде. Что этот человек может теперь сделать? Правильный ответ — все, практически. А может и ничего не делать — я не обижусь. Если пораскинуть ушами, то для программистов все возможно (а админы пусть потом изучают мануалы по вашим полетам).

Арсений ЧЕБОТАРЁВ,
ac@comizdat.com


P.S. Никакая рассылка не заменит большой журнал с цветными иллюстрациями и компакт-диском. Наш подписной индекс — 01728.

Задать вопрос
Прислать свою статью для публикации в журнале
Просто поговорить

До следующего выпуска!
Елена Полонская, редактор "К+П"
www.comizdat.com

Перепечатка материалов этой рассылки разрешается только по согласованию с редакцией журнала "Компьютеры+Программы"


http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.paper.bestarticles
Отписаться

В избранное