Постановка задачи
В этой статье будет рассмотрено пару скриптов для:
- Управления командной строкой через 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 "daten";
print "Command: $cmdn";
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 "daten";
print "Command: $cmdn";
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» отчеты не будут сохраняться.
При написании скриптов, для меня главное было воплотить идею, которая мне показалась интересной. Скрипты могут оказаться с некоторыми ошибками, хотя при тестировании ничего серьезного не заметил.
Автор: web_loki