Добрый день.
Наверное простой вопрос, но никак не могу его решить.
Нужно направить на вход скрипта содержимое файла.
Скрипт, для урощения:#cat /var/_echo
#!/bin/bash
echo [$1-$2-$3]
exit 0Содержимое файла:
#cat /var/test.txt
1162629715 0 5
1162629715 0 5
1162629715 0 5
1162629715 0 5Пробую запускать:
# /var/_echo < /bin/cat /var/test.txt
[/var/arpwatch/test.txt--]Если так:
# /var/_echo < /var/test.txt
[--]А само содержимое, построчно, так и не передаеться.
Как выполнить задачу ?
>А само содержимое, построчно, так и не передаеться.
>Как выполнить задачу ?Ну так вы и передавайте файл построчно, с помощью конструкции cat | while read
или while read < test.txtP. S. А вы вообще хоть что-нибудь по предмету читали или только пиво пили да лекции
прогуливали? ;-)
Сюда вот загляните: http://gazette.linux.ru.net/rus/articles/index-abs-guide.html
>P. S. А вы вообще хоть что-нибудь по предмету читали или только
>пиво пили да лекции
>прогуливали? ;-)
>Сюда вот загляните: http://gazette.linux.ru.net/rus/articles/index-abs-guide.htmlЗа ссылку спасибо.
По поводу лекций - так и не было у меня программирования (10 лекций паскаля не в счет...)Можно еще вопрос:
В общем виде ситуация следующая. Есть arpwatch, сидящий на многих интерфейсах сервера ( в основном на вланах). Каждый экземпляр arpwatch выдает свою инфу, иногда они дублируеться. Я написал скрипт, который обрабатывает инфу от arpwatch и пишет все в один файл. Но есть проблема, как запустить arpwatch, перенаправив все с stdout на обработку моему скрипту.
Я запускаю arpwatch с параметрами:# /usr/local/sbin/arpwatch -i eth0 -p -m 2 -f /var/arpwatch/arp0.dat
# Format: timestamp,delta,action,hostname,ip,mac,oldmac,vendor
# actions: 0=new activity,1=new station,2=reused old mac,3=changed mac,4=dec flipflop,5=bogon,6=ether broadcast,7=ether mismatch,8=ether too short,9=ether bad format,10=ether wrong type_ip,11=ether bad length,12=ether wrong op,13=ether wrong RARP,14=ether wrong type,
1162722918,0,5,<UNKNOWN>,192.168.28.7,0:6:29:f1:13:57,0:6:29:f1:13:57,IBM
1162722918,0,5,<UNKNOWN>,192.168.28.7,0:6:29:f1:13:57,0:6:29:f1:13:57,IBM
1162722919,0,5,<UNKNOWN>,192.168.28.7,0:6:29:f1:13:57,0:6:29:f1:13:57,IBM
1162722919,0,5,<UNKNOWN>,192.168.28.7,0:6:29:f1:13:57,0:6:29:f1:13:57,IBM
1162722919,0,5,<UNKNOWN>,192.168.214.241,0:6:29:f1:13:57,0:6:29:f1:13:57,IBM
1162722919,0,5,<UNKNOWN>,192.168.214.241,0:6:29:f1:13:57,0:6:29:f1:13:57,IBM
1162722919,0,5,<UNKNOWN>,192.168.214.247,0:11:95:63:fe:d2,0:11:95:63:fe:d2,D-Link
1162722919,0,1,<UNKNOWN>,172.18.7.24,0:b:5d:72:38:34,0:0:0:0:0:0,Fujitsu Limited
1162722919,0,5,<UNKNOWN>,192.168.28.10,0:13:d4:80:29:a7,0:13:d4:80:29:a7,Asustek Computer
1162722919,0,5,<UNKNOWN>,192.168.28.10,0:13:d4:80:29:a7,0:13:d4:80:29:a7,Asustek Computer
...
Вот этот вывод мне и надо направить на обработку моему скрипту.
Пробовал:
#/var/arpwatch/arpwatch_compare < /usr/local/sbin/arpwatch -i eth0 -p -m 2 -f /var/arpwatch/arp0.dat
Record not exist. Add it [ -p - 2 - -f ]
Т.е. он первый ключ оставляет для arpwatch (-i eth0) а следующий уже в скрипт переправляет. А нужно с этими параметрами запустить arpwatch и пока он будет работать, весь вывод направлять в скрипт.Пробовал:
#/var/arpwatch/arpwatch_compare < `/usr/local/sbin/arpwatch -i eth0 -p -m 2 -f /var/arpwatch/arp0.dat`процесс работает, но никаких данных в скрипт не передает.
Буду очень признателен, если подскажите какое-то решение :)
>Буду очень признателен, если подскажите какое-то решение :)
Покажите, пожалуйста, текст скрипта. Для большей ясности.
>Покажите, пожалуйста, текст скрипта. Для большей ясности.Не вопрос:
-------------------------------------------
# cat ./arpwatch_compare
#!/bin/bash
LOG="/var/arpwatch/arp.log"
echo -----------$1 >> $LOGSTRING=`echo $1 | sed 's/,/ /g'`
STRING=`echo $STRING | sed 's/<//g'`
STRING=`echo $STRING | sed 's/>//g'`
set $STRING
cur_date=`date \+\%Y_\%m_\%d_\%H_\%M`
PID="/var/arpwatch/arp.pid"
timestamp=$1
delta=$2
action=$3
hostnam=$4
ip=$5
mac=$6
oldmac=$7
vendor=$8
#Функция проверяет наличие файла arp.pid. Если такой есть - значит не отработал еще предыдущий вызов скрипта и нужно подождать, что бы не было дублированных записей
func_check_pid () {
if [ ! -f $PID ] # Проверка существования файла.
#echo $1 $2 $3 $4 $5 $6 $7 $cur_date $8 $9
then
func_work
else
echo "wait 1 second..." >> $LOG
sleep 1
func_check_pid
exit
fi
}# В общем виде Уникальным являеться составной ключ MAC+IP. По нему и делаеться выборка, #если такой записи нет - то добавляем.
#В любом случае любой результат пишем в лог и на консоль.func_work () {
echo "pid" > $PID
file="/var/arpwatch/arp.txt"
REC_EXIST=`cat $file | awk '{if ($5 == "'$ip'" && $6 == "'$mac'") {print $1} }'`
if [ "$REC_EXIST" != "" ]
then
echo "Record exist" [ $action - $ip - $mac ] >> $LOG
echo "Record exist" [ $action - $ip - $mac ]
else
echo "Record not exist. Add it " [ $action - $ip - $mac ] >> $LOG
echo "Record not exist. Add it " [ $action - $ip - $mac ]
echo $timestamp $delta $action $hostnam $ip $mac $oldmac $cur_date $vendor >> $file
fi
echo -n ""
# удаляем файл PID, что бы другой вызов скрипта отработал.
rm $PID
exit 0
}func_check_pid
--------------------------------------------------------Скрипт - черновик. Еще доделывать и оптимизировать. Но прежде хотелось запустить всю связку. В том числе и обработку входных параметров на правильность и целостность нужно добавить обязательно.
Приму любые советы.
>Приму любые советы.Вот вам слегка доработанный скрипт.
=========================================================================================
#!/bin/bashLOG="/var/arpwatch/arp.log"
PID="/var/arpwatch/arp.pid"
cur_date=`date \+\%Y_\%m_\%d_\%H_\%M`
echo -----------$cur_date >> $LOGwhile read STRING
do
STRING=`echo $STRING | sed -e 's/,/ /g' -e 's/<//g' -e 's/>//g'`
timestamp=`echo $STRING | awk '{print $1}'`
delta=`echo $STRING | awk '{print $2}'`
action=`echo $STRING | awk '{print $3}'`
hostnam=`echo $STRING | awk '{print $4}'`
ip=`echo $STRING | awk '{print $5}'`
mac=`echo $STRING | awk '{print $6}'`
oldmac=`echo $STRING | awk '{print $7}'`
vendor=`echo $STRING | awk '{print $8}'`
# Функция проверяет наличие файла arp.pid. Если такой есть - значит не отработал еще предыдущий вызов скрипта
# и нужно подождать, чтобы не было дублированных записей
func_check_pid()
{
if [ ! -f $PID ] # Проверка существования файла.
then
func_work
else
echo "wait 1 second..." >> $LOG
sleep 1
func_check_pid
exit
fi
}
# В общем виде уникальным является составной ключ MAC+IP. По нему и делается выборка,
# если такой записи нет - то добавляем.
# В любом случае любой результат пишем в лог и на консоль.
func_work()
{
echo "pid" > $PID
file="/var/arpwatch/arp.txt"
REC_EXIST=`cat $file | awk '{if ($5 == "'$ip'" && $6 == "'$mac'") {print $1} }'`
if [ "$REC_EXIST" != "" ]
then
echo "Record exist [ $action - $ip - $mac ]" | tee -a $LOG
else
echo "Record not exist. Add it [ $action - $ip - $mac ]" | tee -a $LOG
echo "$timestamp $delta $action $hostnam $ip $mac $oldmac $cur_date $vendor" >> $file
fi
# удаляем файл PID, чтобы другой вызов скрипта отработал.
rm $PID
}
func_check_piddone
=========================================================================================Работает все так:
/usr/local/sbin/arpwatch -i eth0 -p -m 2 -f /var/arpwatch/arp0.dat | arpwatch_compare.sh
Большое человеческое спасибо за работающий скрипт и за Ваше потраченное время!
:)