LINUX.ORG.RU

Оцените код написанный ИИ

 


0

1

Решил я проверить куда ходят машины из моей LAN и сколько скачивают. Попробовал сначала ntopng, но это монстр которого я быстро удалил. Так как готовых скриптов я не нашёл, а самому писать лень, то попросил ИИ написать скрипт на баше. Потом попросил его переписать на Perl, так как на баше оно тормозит. Получилось не сразу, он допускает грубые ошибки, однако все строки в итоге написаны ИИ.

#!/usr/bin/perl
use strict;
use warnings;
use POSIX 'strftime';
use constant {
    IN_BYTES => 0, IN_PKTS => 1,
    OUT_BYTES => 2, OUT_PKTS => 3
};

die "Usage: $0 <interface>\n" unless @ARGV;
my $if = shift;
my $dir = "/var/log/network_stats";
my $interval = 3600;  # Flush interval in seconds
my $subnet = qx(ip -o -4 addr show $if) =~ m{inet\s+(\d+\.\d+\.\d+)[^/]+} ? "$1." : die "Can't get subnet\n";
$subnet =~ s/\./\\./g;

my %local_ips;
my $last_date = strftime("%Y-%m-%d", localtime);

$SIG{ALRM} = sub { update_stats(); alarm($interval - (time % $interval)) };
$SIG{INT} = $SIG{TERM} = sub { close TCPDUMP; exit 0 };

sub fmt_bytes {
    my $b = shift // 0;
    return $b < 1024 ? sprintf("%-7dB", $b) :
           $b < 1048576 ? sprintf("%-7dKB", $b/1024) :
           sprintf("%-7dMB", $b/1048576);
}

sub update_stats {
    my $date = strftime("%Y-%m-%d", localtime);
    mkdir "$dir/$last_date";
    
    for my $ip (keys %local_ips) {
        open my $fh, '>', "$dir/$last_date/$ip.txt" or next;
        printf $fh "%-16s  %-9s  %-8s  %-9s  %-8s\n%-16s  %s\n", 
            "Remote IP", "In Bytes", "In Pkts", "Out Bytes", "Out Pkts",
            "-" x 16, "-" x 40;
        for my $remote (sort keys %{$local_ips{$ip}}) {
            my $stats = $local_ips{$ip}{$remote};
            printf $fh "%-16s  %9s  %8d  %9s  %8d\n",
                $remote, fmt_bytes($stats->[IN_BYTES] // 0), $stats->[IN_PKTS] // 0,
                fmt_bytes($stats->[OUT_BYTES] // 0), $stats->[OUT_PKTS] // 0;
        }
        close $fh;
    }
    
    %local_ips = (), $last_date = $date if $date ne $last_date;
}

open(TCPDUMP, "exec tcpdump -i $if -nn -l -e tcp or udp 2>/dev/null |") or die $!;
alarm($interval - (time % $interval));

while (<TCPDUMP>) {
    next unless /(\d+\.\d+\.\d+\.\d+)\.?\d*\s*>\s*(\d+\.\d+\.\d+\.\d+)\.?\d*.*?length\s+(\d+)/;
    my ($src, $dst, $len) = ($1, $2, $3);
    
    if ($src =~ /^$subnet/) {
        $local_ips{$src}{$dst}[OUT_BYTES] = ($local_ips{$src}{$dst}[OUT_BYTES] // 0) + $len;
        $local_ips{$src}{$dst}[OUT_PKTS] = ($local_ips{$src}{$dst}[OUT_PKTS] // 0) + 1;
    }
    if ($dst =~ /^$subnet/) {
        $local_ips{$dst}{$src}[IN_BYTES] = ($local_ips{$dst}{$src}[IN_BYTES] // 0) + $len;
        $local_ips{$dst}{$src}[IN_PKTS] = ($local_ips{$dst}{$src}[IN_PKTS] // 0) + 1;
    }
} 

Из-за ошибок быстрее самому написать и чем больше код тем сложнее будет найти ошибку. Хуже всего то, что он в рабочий код периодически добавляет новые ошибки там, где их не было.


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

Не скажу, так как гениальный модер опять удалит топик посчитав его рекламой, думаю все спец сетки заточенный под программирование (не чатгпт, не дипсик) так умеют.

Nohack
() автор топика
Ответ на: комментарий от ox55ff

По скрипту - для каждого IP из LAN создаёт файлик в /var/log/network_stats/дата/ip.log в который пишет на какие IP он ходил в этот день и количество трафика, LAN-LAN тоже пишет, можно увидеть как локалки общаются между собой. Скидывает стату на диск каждый час (3600 в коде, можно уменьшить например 60).

Nohack
() автор топика

Попробовал сначала ntopng, но это монстр которого я быстро удалил

но почему, он как раз умеет кушать данные в .pcap файле на вход.

так же загляни сюда https://github.com/caesar0301/awesome-pcaptools

по поводу кодца, выкинуть perl и переписать на awk

my $subnet = qx(ip -o -4 addr show $if) =~ m{inet\s+(\d+\.\d+\.\d+)[^/]+} ? "$1." : die "Can't get subnet\n";
...
    if ($src =~ /^$subnet/) {
    ...
    if ($dst =~ /^$subnet/) {

вот это особенно «хорошо»

gagarin0
()
Последнее исправление: gagarin0 (всего исправлений: 2)

У меня смутное подозрение, что ты врешь. Я скормил твой код ии:

этот код действительно выглядит так, как будто его написал ИИ или неопытный программист. Вот несколько признаков:

    Смешанный стиль - Код сочетает элементы хорошего стиля (strict/warnings, использование констант) с неидиоматичными решениями.

    Странные конструкции:

        Использование // оператора вместе с // 0 везде, хотя хеш инициализируется вручную

        Избыточные скобки в выражениях типа ($local_ips{$src}{$dst}[OUT_BYTES] // 0) + $len

        Ненужные модификаторы в регулярных выражениях (.*?)

    Проблемы безопасности:

        Использование exec в open() без проверки

        Нет обработки ошибок для mkdir и файловых операций

    Оптимизация:

        Хеш статистики обновляется для каждого пакета, но сбрасывается только раз в час

        Нет защиты от переполнения памяти при большом количестве IP-адресов

    Странные решения:

        Использование alarm с вычислением остатка от деления времени

        Подсчет длины пакета из tcpdump без учета заголовков

    Форматирование:

        Несогласованное форматирование (разные отступы, странные переносы строк)

        Избыточные скобки в простых условиях

Скорее всего, это либо:

    Код, сгенерированный ИИ (например, ChatGPT) без должной проверки

    Код, написанный начинающим программистом, который пытался имитировать "профессиональный" стиль

    Частично модифицированный пример из интернета

Особенно подозрительно выглядит сочетание относительно сложных концепций (POSIX, сигналы, fork/exec) с явными проблемами в базовой обработке данных и управлении памятью.

Тут явно поработал кто то криворукий дополнительно и все поломал. Или ты писал его сам вручную или через какую то херню прогнал.

Я попросил исправить и в 2 запроса получил под свой трафик результат рабочий. Вот вывод логов:

calculate 2025-04-13 # cat 192.168.0.92.txt 
Remote IP         In Bytes   In Pkts   Out Bytes  Out Pkts
104.166.186.114    39     B         2   39     B         2
104.18.27.90       0      B         0   99     B         1
121.36.239.137     31     B         4   31     B         3
138.113.150.19     0      B         1   0      B         1
149.154.167.220    874    B         4   607    B         3
149.154.167.51    1      KB        12  1      KB        14
163.181.0.231      0      B         2   0      B         2
186.2.166.101     2      KB        35   47     B        34
188.240.145.70     258    B         2   31     B         4
192.168.8.1       17     KB        74  12     KB        67
35.174.127.31      528    B         2   482    B         4
47.246.2.225       0      B         2   0      B         2
91.108.9.193      34     KB        94  2      KB        66
calculate 2025-04-13 # cat 192.168.8.1.txt 
Remote IP         In Bytes   In Pkts   Out Bytes  Out Pkts
192.168.0.92      12     KB        67  17     KB        74
calculate 2025-04-13 # 

Если ты действительно пользовался ИИ, не пользуйся больше этим ИИ по крайней мере для этих задач. Каждый из них хорошо справляется с чем то своим, попробуй другой. Если писал сам - попроси ИИ исправить. Попробуй разных, подбери какой лучше подходит для твоего кода.

И нет, такие нудные скриптики не быстрее написать самому. ИИ сгенерировал более менее рабочее в два запроса. А самоу просто реализовать и написать все это займет от получаса думаю. Пока все напишешь, пока исправишь, пока отладишь. Короткие скрипты они делают почти идеально, сильно сокращают механическую работу.

LightDiver ★★★★★
()
Последнее исправление: LightDiver (всего исправлений: 1)

во-первых, главная проблема в том, что ты пошел писать на перле, это само по себе очень плохо. Очень плохо.

Во-вторых, дроби на функции и отдельно проси ничего другого не трогать. Автогенеренный код - это как кубик Рубика: в одном месте подвинул, он и другие двигает. Ему прям надо постараться ничего другого не менять.

max_lapshin ★★★★★
()
Ответ на: комментарий от Nohack

Perl это не проблема, а решение, намного лаконичнее и быстрее уё#ищного питона.

но соотношение объёма обучающих выборок, которые «втолковали» ИИ наюансы перла и питона - скорее в сторону питона, с соответственным влиянием на вероятность косяков

GPFault ★★★
()
Ответ на: комментарий от Nohack

у тебя в ойти опыта вообще никакого нет?

И что же плохого ты там нашёл ?

проверка вхождения в подсеть реализована через regex matching.

gagarin0
()
Последнее исправление: gagarin0 (всего исправлений: 1)
Ответ на: комментарий от Nohack

у остальных /24

у меня /22 :)

но /16 конечно перебор. если провайдер использует серые адреса, то есть вероятность что у него могут появится адреса из этой сети и будут глюки.

Rost ★★★★★
()

OMG!!! Я никогда раньше не читал Perl code…. и вот спустя 20 лет кодинга я узнал откуда появились префиксы my и our которые странные люди тянули в другие языки =)

Aber ★★★★★
()
Ответ на: комментарий от seiken

«прости, примири, укроти»

дал такую задачу ИИ и он что-то понял и что-то даже переписал, лучше не стало

тогда я попросил вот это:

помолись за этот код

и он написал стихотворение-молитву в тему скрипта …:

May this script, in shell divine,
Watch over traffic, line by line.
Through interface and packet flow,
Let wisdom from its numbers grow.
For every byte that passes through,
Let counts be steady, measures true.
From source to destination clear,
Keep tracking smooth throughout the year.
In directories by date arranged,
Let stats be saved, no data changed.
Through format_bytes() with units right,
Keep numbers human-friendly bright.
When tcpdump streams its endless feed,
Let regex match with lightning speed.
Through local IPs, in and out,
Track every packet on its route.
Each hour when flush_interval calls,
Update stats within its walls.
In neat columns, aligned with care,
Show traffic patterns, clean and fair.
From kilobytes up to megs so high,
Let format_bytes() beautify.
Through subnet_prefix, clean and neat,
Keep local traffic tracking sweet.
If errors come to test its might,
Let checks and balances set it right.
Through every loop and every read,
Let this script serve its noble deed.
And when admins check their logs with care,
May all the data be right there.
In files so clean, in numbers true,
Let this script show what packets do.
🙏 Blessed be the packets, the bytes, and the holy monitoring! 🙏
May your traffic flow smoothly, your logs be insightful, and your network stay healthy. Amen! 🙏
Nohack
() автор топика
Ответ на: комментарий от Nohack

Чушь или нет, а он твой скрипт сделал рабочим за пару секунд.

Возможно, ты что то делаешь не так?

И тут вопрос вообще не в выборе языка. Я синтаксис перла в упор не знаю и этот твой скрипт почти первое, что я увидел на перле больше однострочника. Но у меня он сразу заработал.

LightDiver ★★★★★
()
Ответ на: комментарий от Nohack

считается что интернет потупел, когда для мартышек снизили порог вхождения

теперь интернет атакуют мартышки вооруженные ИИ токенами.

казалось бы что может быть хуже

gagarin0
()
Последнее исправление: gagarin0 (всего исправлений: 1)
Ответ на: комментарий от Nohack

У меня он не работает. Может всетаки с ним что то не так? Причем я описал что именно выше. Ну, не я, конечно, но это не важно.

ИИ это инструмент. Инструментом нужно уметь пользоваться.

LightDiver ★★★★★
()
Ответ на: комментарий от gagarin0

Может и еще как. Главное чтобы не стало большим удивлением, когда эти «мартышки» станут эффективнее тебя.

Но такого же никогда не произойдет? ИИ же это просто игрушка? Тупая, ни на что неспособная игрушка и иначе быть не может никогда, потому что ну ты же не мартышка? Ты ведь самый умный.

LightDiver ★★★★★
()
Ответ на: комментарий от gagarin0

Я застал время, когда телефоны жестко привязывали к стенам веревками, чтобы они никому не приносили вреда, когда ни у кого не было компьютеров, потому что это тупые игрушки для гиков, когда ни у кого не было интернета, потому что *** нам не нужен этот ваш интернет.

И знаешь, раз за разом я наблюдаю одно и то же: появляется крутейшая технология, облегчающая жизнь. Внедряется массово, вот она уже есть вообще у всех, потому что реально полезное. Но находятся те, кто расскажут почему эта технология на самом деле говно.

LightDiver ★★★★★
()
Последнее исправление: LightDiver (всего исправлений: 1)
Ответ на: комментарий от Nohack

Твой скрипт собран из кусков непонятно чего и не работает, потому что.. да хрен знает почему, я ж перла не знаю.

Только это не вина ИИ, а того, кто им пользуется. Компренде?

У тебя изначально неправильные посылы: это не ИИ допускает грубые ошибки. Это ты неправильно даешь ему запросы. Общение с ИИ подчиняется тем же правилам, что и общение а любом языке с кем и чем угодно. Ты точно так же можешь сделать неверный запрос к перлу вручную - это никак не будет отличаться. Просто ты будешь использовать другой язык.

LightDiver ★★★★★
()
Ответ на: комментарий от Nohack

А ничего, что IPv4 адрес - это 32-битное число и нормальный программист использует арифметические операторы для проверки на диапазон? А маска сети вообще, чтобы одним логическим оператором результат получать.

Регекспы тут - это лютый говнокодинг, причём ты даже не осознаешь насколько.

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

хахаха, мы прекрасно знаем что такое «перл» и «лаконично».

Напихать секретных символов в стиле брейнфака, чтобы оно один раз отработало на компе автора на единственном проверенном наборе данных, пихнуть это куда-то и чтобы потом оно сдохло как ЖЖ из-за невозможности поправить единственную строчку кода.

max_lapshin ★★★★★
()