Постановка задачи
В этой статье будет рассмотрено пару скриптов для:
- Управления командной строкой через Dropbox. Скрипт будет проверять указанный файл на сервере, и выполнять команды написанные внутри файла.
- Управление командной строкой через почту. Один аккаунт почты будет выступать в роли сервера, а другой в роли клиента.
Все написанные скрипты тестировались под управлением Linux Ubuntu 13.04.
Управление командной оболочкой с помощью Dropbox
Заходим на оф. сайт Dropbox’a, качаем клиент и устанавливаем.
Теперь рассмотрим следующий скрипт на Perl:
#!/usr/bin/perl # cmdfile.pl use strict; while (1) { # Запускаем бесконечный цикл close STDOUT; open CMDFILE, "commandfile"; # Открываем файл my @file = <CMDFILE>; # Заливаем файл в массив unless (@file) {sleep 10;next;} # Если нет файла, спим 10 секунд, и переходим к следующей итерация цикла close CMDFILE; system "rm commandfile"; # Удаляем файл, чтобы он его не использовал по кругу if ($file[0] =~ m/ban log:/) { # Если в начале файла написана строка "ban log", значит не использовать файл логов shift @file; # Выполняем все команды из файла foreach my $cmd(@file) { system "$cmd"; } } else { # Использовать файл отчетов foreach my $cmd(@file) { # Оформление файла отчетов open STDOUT, ">>", "log"; print "*" x 80,"\n"; printf "%25s"; system "date\n"; print "Command: $cmd\n"; system "$cmd"; } close STDOUT; } }
Сохраняем скрипт в папку Dropbox, и запускаем его. Теперь когда в этой папку появиться файл «commandfile», скрипт будет выполнять все указанные команды и сохранять отчеты в файл «log». Если нужно отключить отчеты, пишем в начале файла «ban log».
Управление командной оболочкой с помощью почты
Скрипт на Perl:
#!/usr/bin/perl #mail_commander.pl use Mail::POP3Client; while (1) { # Запускаем бесконечный цикл # Подключаемся к серверу почты my $pop = new Mail::POP3Client ( USER => "example\@bk.ru", PASSWORD => "password", HOST => "pop3.mail.ru", PORT => "995", USESSL => true, ); # Эти настройки рассчитаны на mail.ru, но для других будет примерно тоже самое if ($pop->Count() == 0) {sleep 10;next;} # Если нет писем, спим 10 сек. и переходим к следующей итерация цикла for (my $i = 1; $i <= $pop->Count(); $i++) { my @body = (); my @commands = (); foreach ($pop->Head($i)) { # Читаем заголовки if (/From:.+<example_2\@gmail.com>/) { # Проверяем отправителя @body = $pop->Body($i); # Если отправитель совпадает, загружаем тело письма в массив $pop->Delete($i); # Удаляем письмо if ($body[3] =~ m/begin:/) { # Письмо должно начинаться cо слова "begin:" for (my $j = 4; $j <= $#body; $j++) { # Читаем команды last if $body[$j] =~ m/end;/; # Письмо должно заканчиваться словом "end;" push @commands, $body[$j]; # Загружаем команды в массив } # Если вторая строчка содержит "ban log", значит не использовать файл отчетов if ($commands[0] =~ m/ban log/i) { shift @commands; close STDOUT; foreach my $cmd(@commands) { # Выполняем команды system "$cmd"; } } else { # Если использовать отчеты open STDOUT, ">>", "log"; foreach $cmd(@commands) { # Оформляем файл, и производим запись отчетов print "*" x 80,"\n"; printf "%25s"; system "date\n"; print "Command: $cmd\n"; system "$cmd"; } close STDOUT; } } } } } } $pop->Close;
Теперь сохраняем скрипт в папку Dropbox’a, запускаем. Если отправить письмо с example_2@gmail.com на example@bk.ru, будут выполнены все указанные команды.
Пример письма:
To: example@bk.ru
From: example_2@gmail.com
Subject: CMD
Text:
begin: rm /home/examle.txt touch hello.txt echo Hello, I'am command >> hello.txt end;
Отчеты будут сохраняться в файл «log», если пропишем после «begin:», «ban log» отчеты не будут сохраняться.
При написании скриптов, для меня главное было воплотить идею, которая мне показалась интересной. Скрипты могут оказаться с некоторыми ошибками, хотя при тестировании ничего серьезного не заметил.
ссылка на оригинал статьи http://habrahabr.ru/post/202532/
Добавить комментарий