Linux за българи: Форуми

Linux секция за начинаещи => Настройка на програми => Темата е започната от: KPETEH в Feb 21, 2007, 19:38



Титла: Грешка в скрипт
Публикувано от: KPETEH в Feb 21, 2007, 19:38
Ето го и скрипта,който съм преработил за slackware:
Примерен код

#!/usr/bin/perl -w
use Sys::Syslog;

$max=10; # maximum permited atempts
$watchfile=         '/var/log/messages';
$iptables=          '/usr/sbin/iptables';
$iptables_save=     '/usr/sbin/iptables-save';
$iptables_restore=  '/usr/sbin/iptables-restore';
$cfgfile=           '/etc/ipkungfu/custom.conf';


open(LFILE, "<$watchfile");

%tries=();      # number of attempts per ip
%blocked=();    # already blocked ip's

# restore iptables configuration
`$iptables_restore < $cfgfile`;

# load currently blocked ips from iptable list
open(IPTPIPE, "$iptables -L -v -n|");
$blockChain=0;
while (<IPTPIPE>){
  $blockChain=1 if (/^Chain block \(\d+ references\)$/);
  next unless $blockChain;
  last if (/^$/ );
  $blocked{$1}=1 if (/(\d+\.\d+\.\d+\.\d+)/);
}
close IPTPIPE;

$blk_ips=join(", ",keys(%blocked));
syslog('warning',"sshwatch.pl started. currently blocked ip's are: $blk_ips");

# watch the messages file
while (1) {
  for ($curpos = tell(LFILE); $_ = <LFILE>; $curpos = tell(LFILE)) {
    if (/sshd\[\d+\]: Failed password for .+ from \D+(\d+\.\d+\.\d+\.\d+)/) {
      $ip=$1;
      next if defined($blocked{$ip});
      $tries{$ip}+=1;
      if ($tries{$ip} eq $max){
         `$iptables -I block -s $ip -j DROP; $iptables_save > $cfgfile`;
         $blocked{$ip}=1;
         syslog('warning', "IP $ip has been blocked !");
      }
    }
  }
  sleep 1;
  seek(LFILE, $curpos, 0);
}

След изпълнение на командата
# perl sshwatch.pl
iptables-restore: line 20 failed
не мога да разбера къде е грешката при положение че
съществува /usr/sbin/iptables-restore ?


Титла: Грешка в скрипт
Публикувано от: PERMANENT в Feb 21, 2007, 20:05
аз съм със slackware и като изпълня iptables-restore програмата си свършва работата но не се затвяря просто си седи така.Виж как при теб стоят нещата


Титла: Грешка в скрипт
Публикувано от: neter в Feb 21, 2007, 20:14
А я пробвай да замениш
`$iptables_restore < $cfgfile`;
с
printf FILE_OUT "$iptables_restore < $cfgfile \n";
и
`$iptables -I block -s $ip -j DROP; $iptables_save > $cfgfile`;
с
printf FILE_OUT "$iptables -I block -s $ip -j DROP \n";
printf FILE_OUT "$iptables_save > $cfgfile \n";
да видим какво ще стане.

edit: Възможно е и PERMANENT да е прав. Да се наложи в скрипта да зададеш край на изпълнението.





Титла: Грешка в скрипт
Публикувано от: KPETEH в Feb 21, 2007, 20:24
Това че така си стои е ясно но идеята е че ми дава грешката :
iptables-restore: line 20 failed


Титла: Грешка в скрипт
Публикувано от: KPETEH в Feb 21, 2007, 20:31
Замених ги както ми каза и се получава грешка
printf() on unopened filehandle FILE_OUT at sshwatch.pl line 18.


Титла: Грешка в скрипт
Публикувано от: PERMANENT в Feb 21, 2007, 21:17
printf не преобразува ли подадените му числа в различни броини системи
пример
printf "%x",10 което изписва a тоест 0xa

edit
сетих се че при php-то ставаше нещо подобно.просто там като не може да се изпълни някаква операция за определено време(дефалта беше 30 секунди) изкарваше едно хубаво ерорче а до колкото съм чувал php-то и perl-а си приличат в доста отношения





Титла: Грешка в скрипт
Публикувано от: KPETEH в Feb 21, 2007, 21:34
Добре не знам аз този скрипт съм го взел от оригиналния
и нищо не разбирам от perl,хайде някой с различна дистрибуция от slackware да пробва дали ще работи,но естествено с променени пътища за iptables.


Титла: Грешка в скрипт
Публикувано от: neter в Feb 21, 2007, 21:35
:crazy: Съжалявам, разсеях се и пиша глупости. printf се използва за извеждане на текст. Както echo в bash например. Сега ще разгледам нещата по-спокойно и, ако стигна до отговор, ще го постна тук.