LINUX.ORG.RU

Jabber-Shell: администрирование посредством Jabber


0

0

Опубликован бот, позволяющий управлять удалённой системой посредством jabber.

В настоящий момент бот находится в зачаточном состоянии. Однако он уже работает и даже пригоден к использованию. Хотя никто не может гарантировать что с ним не будет проблем.

Бот работает следующим образом: получив сообщение он смотрит на JID отправителя. Если оно отправлено администратором, то полученное сообщение выполняется как команда оболочки (os.system()) с перенаправлением вывода в файл /tmp/jabebr-shell. После завершения выполнения команды, содержимое файла /tmp/jabber-shell отправляется в ответном сообщении администратору.

В настоящий момент есть следующие замечания:

  • Если вывод команды очень большой - он обрезается до четырёх килобайт. В перспективе - разбивать на несколько сообщений.
  • Если послать боту команду clear - он падает.
Что когда-нибудь будет сделано:
  • Ну во-первых проблемы, перечисленные в предыдущем пункте:)
  • Загрузка файлов на удалённую машину и скачивание файлов с неё.
  • Асихнхронная обработка очереди сообщений, чтобы можно было убивать зависшую программу:)
Бот написан на языке python, с использованием библиотеки xmpppy.

>>> Страница бота

Ответ на: комментарий от Teak

Как обычно, "эксперты ЛОРа" - голимые теоретики. Все бы им эсэсаш да
 эсэсэль... Приведенный ниже бот я еще весной использовал для 
управления несколькими своими серверами, разбросанными по городу и два
 в пределах области. ssh-ом не везде подлезешь (вот тут то и можно 
вспомнить серые ипы, нат и динамический адрес от адсл), и потом, на 
моем стареньком siemens S65 ssh почемуто не работает :(. Зато Bombus 
запусакется отлично... Ну а когда какая неприятность случается - сразу
 видно, кто из ростера в офлайн ушел.

Короче, автору респект, развивай далее свою утилиту. Ну а я к питону 
равнодушен, буду юзать перл :))

ЗЫ джаббер позволяет делать ваше преусловутое ssl :)

#!/usr/bin/perl

use strict;
use Net::XMPP;
use Net::XMPP::Client;
use Data::Dumper;
use Text::Iconv;

exit if fork;

my $client = new Net::XMPP::Client();

my $owner='tim2k@jabber.ru';

$client->SetCallBacks( 
                onauth => \&onAuth,
                 );
$client->SetMessageCallBacks(
                #normal=>\&messageNormalCB,
                chat=>\&messageChatCB
                );

$client->Execute(hostname=>'jabbus.org',
                         username=>'perlbot',
                         password=>'******',
                         resource=>'server-aquarium'
                        );

$client->Disconnect();
#exit;

###########################################################

sub onAuth {
        $client->PresenceSend(show=>"online", priority=>10);
}

sub messageChatCB {
        my ($sid,$mes) = @_;
        my $sender=$mes->GetFrom();
        my $body=$mes->GetBody();
        my $thread=$mes->GetThread();

        my $s_jid=$sender;
        
        #обрезаем ресурс
        $s_jid=~s|\/.*$||;


        my $reply='';

        for ($body) {
                /^(whois|host)\s+([0-9a-zA-Z.]+)/ && do {
                        $reply=`$1 $2`;
                        last;
                } ||
                
                /^(who|uptime|w|ps|whoami|last|lastlogin|top\ -b|)(\s.*)?$/ && $ s_jid eq $owner && do {
                        $reply = `$1 $2`;
                        last;
                } ||
                /^(autherr)$/ && $s_jid eq $owner && do {
                        $reply = "\n" . `cat /var/log/auth.log`;
                        last;
                } ||

                /^(ping)\s+([0-9a-zA-Z.]+)$/ && do {
                        $reply = "\n\n" . `ping -c 4 $2`;
                        last;
                } ||
                /^exit$/ && $s_jid eq $owner && do {
                        $client->Disconnect();
                } ||
                /^pid$/ && $s_jid eq $owner && do {
                        $reply = $$;
                } ||
                do {
                        $reply = 'п≈п╢п╣я│я▄ я▐ п╥п╟я┌я┐п©п╦п╩';
                }
        }
        $reply and $client->MessageSend(
                        to=>$sender,
                        subject=>"",
                        body=> $reply,
                        type => 'chat',
                        thread => $thread,
                );
}

tim2k
()
Ответ на: комментарий от tim2k

PPS изначальный код не мой, я просто скопипастил (С)

tim2k
()
Ответ на: комментарий от tim2k

> Как обычно, "эксперты ЛОРа" - голимые теоретики.

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

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

Teak ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.