mrsaygo Posted August 29, 2013 Posted August 29, 2013 (edited) Не пойму в чем загвоздка... Был скрипт на баш по типу : #!/bin/bash/ wget куда надо http://domain.com/ips.txt FOR каждая строчка файла $ip do ipset add ....... $ip done из-за проблемной работы решил все переписать на perl (давно собирался, а тут еще и это....) Проблема такова - при запуске вручную данные нового файла подхватываются (ipset -L | grep что нужно) А вот при запуске по крону - нет. Причем в папке лежит новый файл (соответственно скрипт запускается нормально) На perl - такое же поведение Идей уже нет... Edited August 29, 2013 by mrsaygo Вставить ник Quote
Negator Posted August 29, 2013 Posted August 29, 2013 Попробуйте указать полные пути в скриптах. Вставить ник Quote
mrsaygo Posted August 29, 2013 Author Posted August 29, 2013 (edited) Попробуйте указать полные пути в скриптах. И так полные указаны... Edited August 29, 2013 by mrsaygo Вставить ник Quote
QWE Posted August 29, 2013 Posted August 29, 2013 может быть не хватает какой нибудь переменной окружения Вставить ник Quote
mrsaygo Posted August 29, 2013 Author Posted August 29, 2013 может быть не хватает какой нибудь переменной окружения Может ))) Знать бы какой... Вставить ник Quote
srg555 Posted August 29, 2013 Posted August 29, 2013 mrsaygo залогируйте стандартный поток вывода и поток ошибок в файл Вставить ник Quote
Neko-san Posted August 29, 2013 Posted August 29, 2013 Почему-то кажется, что файл разбивается не на строки, а на отдельные слова. У меня сделано как-то так: LIST=`cat file.txt | awk -F, '{print $1 $3}' | sed 's/[^[:alnum:]^+ .-]//g' | sed 's/^[ \t\n]*//'` IFS=$'\n' for item in $LIST do echo $item done Вставить ник Quote
mrsaygo Posted August 29, 2013 Author Posted August 29, 2013 Почему-то кажется, что файл разбивается не на строки, а на отдельные слова. У меня сделано как-то так: LIST=`cat file.txt | awk -F, '{print $1 $3}' | sed 's/[^[:alnum:]^+ .-]//g' | sed 's/^[ \t\n]*//'` IFS=$'\n' for item in $LIST do echo $item done Как тогда объяснить нормальную работу при запуске вручную? #!/usr/bin/perl -w #use strict; use Term::ANSIColor; $basedir='/home/base/gw_perl'; $points=20; @files=(['SB','192','eth2'],['PB','10','eth0'],['CH','172','eth4']); #Поочередное открытие файлов system "clear"; foreach $file (@files){ print colored ['bold green'], "@$file[0]\n"; if(!system("wget -O $basedir/files/@$file[0] http://domain.com/files/@$file[0]")){ print "OK\n"; open FILENAME, $basedir.'/files/'.@$file[0]; } while (defined (my $line = <FILENAME>)) { $i+=1; ($date_all,$ip) = split(/\*/,$line); $date_exp = join('',split('-',$date_all)); chomp($ip); $date_current = `date +%Y%m%d`; # ALLOW DATE SECTION if( $date_exp >= $date_current){ # ALLOW NAT IP if ($ip =~ m/^@$file[1]/){ system "ipset del test_hash_deny $ip > /dev/null 2>&1"; system "ipset add test_hash $ip > /dev/null 2>&1"; } #ALLOW REAL IP else{ system "ipset del test_hash_deny $ip > /dev/null 2>&1"; system "ipset add test_hash $ip > /dev/null 2>&1"; } } # DENY DATE SECTION else{ # DENY NAT IP if ($ip =~ m/^@$file[1]/){ system "ipset del test_hash $ip > /dev/null 2>&1"; system "ipset add test_hash_deny $ip > /dev/null 2>&1"; } # DENY REAL IP else{ system "ipset del test_hash $ip > /dev/null 2>&1"; system "ipset add test__hash_deny $ip > /dev/null 2>&1"; } } if (!($i%$points)){print ".";} }#END WHILE close FILENAME; print colored ['bold blue'] , "\n\nNAT :[$nat_allow - $nat_deny]\n", colored ['bold red'],"REAL:[$real_allow - $real_deny]\n\n"; } exit 0; Вот собственно виновник торжества со всякими выводами для удобства. Вставить ник Quote
NiTr0 Posted August 29, 2013 Posted August 29, 2013 PATH окружение отличается. Из крона доступны только /bin, /sbin... Вставить ник Quote
sexst Posted August 29, 2013 Posted August 29, 2013 Вообще всегда и во всех скриптах нужно ко всем бинарникам и файлам указывать полные пути. Вставить ник Quote
mrsaygo Posted August 30, 2013 Author Posted August 30, 2013 Это я понимаю.. вот только как исправить не пойму. У меня же вроде все с абсолютными путями... Вставить ник Quote
agr Posted August 30, 2013 Posted August 30, 2013 Это я понимаю.. вот только как исправить не пойму. У меня же вроде все с абсолютными путями... Не все, исполняемые файлы - wget и ipset - без путей. Вставить ник Quote
QWE Posted August 30, 2013 Posted August 30, 2013 use Term::ANSIColor; попробуйте убрать модуль из скрипта и те команды которые его использут. и перенаправьте в файл все системные команды с результатом. попробуйте заменить system "ipset del test_hash $ip > /dev/null 2>&1"; на $command = "ipset del test_hash $ip"; $result = `$command`; open (OF,"/tmp/file"); printf OF "$command : $result"; close OF; в /tmp/file все ок? Это я понимаю.. вот только как исправить не пойму. У меня же вроде все с абсолютными путями... Не все, исполняемые файлы - wget и ipset - без путей. вот вот Вставить ник Quote
mrsaygo Posted August 30, 2013 Author Posted August 30, 2013 use Term::ANSIColor; попробуйте убрать модуль из скрипта и те команды которые его использут. и перенаправьте в файл все системные команды с результатом. попробуйте заменить system "ipset del test_hash $ip > /dev/null 2>&1"; на $command = "ipset del test_hash $ip"; $result = `$command`; open (OF,"/tmp/file"); printf OF "$command : $result"; close OF; в /tmp/file все ок? Это я понимаю.. вот только как исправить не пойму. У меня же вроде все с абсолютными путями... Не все, исполняемые файлы - wget и ipset - без путей. вот вот Выручили! )))) Самое оно.. теперь осталось осознать почему так))) Обычно так и делаю типа ipset=/usr/sbin/ipset но делал скорее от того, что так положено.... Вставить ник Quote
srg555 Posted August 30, 2013 Posted August 30, 2013 теперь осталось осознать почему так потому что PATH окружение отличается. Из крона доступны только /bin, /sbin... Вставить ник Quote
snark Posted August 31, 2013 Posted August 31, 2013 Из крона доступны только /bin, /sbin... Разве уже запрещено делать как нить так? PATH=/bin:/sbin:/some/path1:/some/path2 ТС, введите в ком. строке: man 5 crontab и почитайте, что там написано. Вставить ник Quote
srg555 Posted August 31, 2013 Posted August 31, 2013 Разве уже запрещено делать как нить так? PATH=/bin:/sbin:/some/path1:/some/path2 Очевидно, что говорилось о переменной PATH в кроне, выставленной по умолчанию в популярных дистрибутивах Вставить ник Quote
snark Posted August 31, 2013 Posted August 31, 2013 Не знаю, какие сейчас популярные, но в CentOS так: # grep PATH /etc/crontab PATH=/sbin:/bin:/usr/sbin:/usr/bin Вставить ник Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.