Управляем удаленным компьютером с помощью почты и облачного хранилища Dropbox

в 9:00, , рубрики: linux, perl, системное администрирование, удаленное управление, метки: , ,

Постановка задачи

В этой статье будет рассмотрено пару скриптов для:

  • Управления командной строкой через 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

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js