MaxKonovalov38

Perl скрипты для автоматизации в Linux

Коллекция полезных Perl скриптов для автоматизации задач в Linux. Каждый скрипт сопровождается подробным объяснением и примерами использования.

1. Управление системой

1.1 Мониторинг использования диска

#!/usr/bin/perl
use strict;
use warnings;

use File::Find;

my $threshold = 90; # Процент использования диска
my $disk_usage = qx(df -h / | tail -1 | awk '{print \$5}' | sed 's/%//');

if ($disk_usage > $threshold) {
    print "Внимание! Использование диска: $disk_usage%\n";
    print "Начинаем поиск больших файлов...\n";
    find({
        wanted => sub {
            my $size = -s $_;
            print "$File::Find::name: $size байт\n" if $size > 100000000;
        }
    }, '/home');
}

Скрипт мониторит использование диска и находит большие файлы, если использование превышает заданный порог.

1.2 Мониторинг процессов

#!/usr/bin/perl
use strict;
use warnings;

use Proc::ProcessTable;

my $t = Proc::ProcessTable->new;
my $threshold = 50; # Процент использования CPU

foreach my $p (@{$t->table}) {
    if ($p->pctcpu > $threshold) {
        print "Процесс $p->{pid} ($p->{cmndline}) использует $p->{pctcpu}% CPU\n";
    }
}

Скрипт отслеживает процессы, использующие более 50% CPU, и выводит информацию о них.

2. Управление файлами

2.1 Автоматическая очистка логов

#!/usr/bin/perl
use strict;
use warnings;

use File::Find;
use POSIX qw(strftime);

my $log_dir = '/var/log';
my $days_to_keep = 30;
my $current_time = time;

find({
    wanted => sub {
        if (-f $_ and $_ =~ /\.log$/) {
            my $mtime = -M $_;
            if ($mtime > $days_to_keep) {
                print "Удаление: $File::Find::name\n";
                unlink $_;
            }
        }
    }
}, $log_dir);

Скрипт удаляет лог-файлы старше 30 дней в указанной директории.

2.2 Резервное копирование файлов

#!/usr/bin/perl
use strict;
use warnings;

use File::Copy;
use POSIX qw(strftime);

my $source_dir = '/home/user/documents';
my $backup_dir = '/backup';
my $date = strftime "%Y-%m-%d", localtime;
my $backup_path = "$backup_dir/backup_$date";

mkdir $backup_path unless -d $backup_path;

opendir(my $dh, $source_dir) or die "Не могу открыть директорию: $!";
while (my $file = readdir($dh)) {
    next if $file =~ /^\./;
    my $source = "$source_dir/$file";
    my $dest = "$backup_path/$file";
    copy($source, $dest) or print "Ошибка копирования $file: $!\n";
}
closedir($dh);

Скрипт создает резервную копию файлов с датой в имени директории.

3. Сетевые задачи

3.1 Мониторинг сетевых соединений

#!/usr/bin/perl
use strict;
use warnings;

use Net::Ping;

my $p = Net::Ping->new("icmp");
my @hosts = qw(google.com yandex.ru github.com);

foreach my $host (@hosts) {
    if ($p->ping($host)) {
        print "$host доступен\n";
    } else {
        print "$host недоступен\n";
    }
}
$p->close;

Скрипт проверяет доступность указанных хостов через ICMP пинг.

3.2 Мониторинг портов

#!/usr/bin/perl
use strict;
use warnings;

use IO::Socket::INET;

my @ports = (22, 80, 443);
my $host = 'localhost';

foreach my $port (@ports) {
    my $socket = IO::Socket::INET->new(
        PeerAddr => $host,
        PeerPort => $port,
        Proto => 'tcp',
        Timeout => 2
    );
    if ($socket) {
        print "Порт $port открыт\n";
        close($socket);
    } else {
        print "Порт $port закрыт\n";
    }
}

Скрипт проверяет доступность указанных портов на локальной машине.

4. Автоматизация системных задач

4.1 Автоматическое обновление системы

#!/usr/bin/perl
use strict;
use warnings;

my $update_cmd = 'apt-get update && apt-get upgrade -y';
my $log_file = '/var/log/system_update.log';

open(my $log, '>>', $log_file) or die "Не могу открыть лог-файл: $!";
print $log "Начало обновления: " . scalar(localtime) . "\n";

my $output = qx($update_cmd);
print $log "$output\n";
print $log "Обновление завершено: " . scalar(localtime) . "\n";
close($log);

Скрипт автоматически обновляет систему и записывает результаты в лог-файл.

4.2 Мониторинг сервисов

#!/usr/bin/perl
use strict;
use warnings;

my @services = qw(apache2 mysql nginx);

foreach my $service (@services) {
    my $status = qx(systemctl is-active $service);
    chomp($status);
    
    if ($status ne "active") {
        print "Сервис $service неактивен. Попытка перезапуска...\n";
        system("systemctl restart $service");
    } else {
        print "Сервис $service работает нормально\n";
    }
}

Скрипт проверяет статус указанных сервисов и перезапускает их при необходимости.

5. Управление пользователями

5.1 Создание пользователей из CSV

#!/usr/bin/perl
use strict;
use warnings;

use Text::CSV;

my $csv = Text::CSV->new({ binary => 1 });
open(my $fh, '<', 'users.csv') or die "Не могу открыть файл: $!";

while (my $row = $csv->getline($fh)) {
    my ($username, $fullname, $group) = @$row;
    system("useradd -m -c '$fullname' -G $group $username");
    system("echo '$username:password123' | chpasswd");
    print "Создан пользователь: $username\n";
}
close($fh);

Скрипт создает пользователей из CSV-файла с указанными параметрами.

5.2 Проверка прав доступа

#!/usr/bin/perl
use strict;
use warnings;

use File::Find;

my $dir = '/home';
my $max_perms = 0755;

find({
    wanted => sub {
        if (-f $_) {
            my $mode = (stat($_))[2] & 07777;
            if ($mode > $max_perms) {
                print "Найден файл с небезопасными правами: $File::Find::name\n";
                print "Текущие права: $mode\n";
                chmod $max_perms, $_;
            }
        }
    }
}, $dir);

Скрипт проверяет права доступа к файлам и исправляет небезопасные настройки.

Заключение

Эти скрипты демонстрируют возможности Perl для автоматизации задач в Linux. Они могут быть использованы как основа для создания более сложных систем автоматизации. При использовании скриптов важно:

Для дальнейшего изучения рекомендуется:

  1. Изучить документацию по используемым модулям
  2. Добавить обработку исключений
  3. Реализовать отправку уведомлений
  4. Создать конфигурационные файлы