The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Перенаправление на вход bash скрипта"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Перенаправление на вход bash скрипта"  
Сообщение от Susanin_ email(ok) on 05-Ноя-06, 01:34 
Добрый день.
Наверное простой вопрос, но никак не могу его решить.
Нужно направить на вход скрипта содержимое файла.
Скрипт, для урощения:

#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
[--]

А само содержимое, построчно, так и не передаеться.
Как выполнить задачу ?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]


1. "Перенаправление на вход bash скрипта"  
Сообщение от allez (ok) on 05-Ноя-06, 08:04 
>А само содержимое, построчно, так и не передаеться.
>Как выполнить задачу ?

Ну так вы и передавайте файл построчно, с помощью конструкции cat | while read
или while read < test.txt

P. S. А вы вообще хоть что-нибудь по предмету читали или только пиво пили да лекции
прогуливали? ;-)
Сюда вот загляните: http://gazette.linux.ru.net/rus/articles/index-abs-guide.html


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "Перенаправление на вход bash скрипта"  
Сообщение от Susanin_ email(ok) on 05-Ноя-06, 13:53 
>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`

процесс работает, но никаких данных в скрипт не передает.
Буду очень признателен, если подскажите какое-то решение :)


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "Перенаправление на вход bash скрипта"  
Сообщение от allez (ok) on 05-Ноя-06, 20:38 
>Буду очень признателен, если подскажите какое-то решение :)


Покажите, пожалуйста, текст скрипта. Для большей ясности.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "Перенаправление на вход bash скрипта"  
Сообщение от Susanin_ email(ok) on 05-Ноя-06, 20:52 
>Покажите, пожалуйста, текст скрипта. Для большей ясности.

Не вопрос:
-------------------------------------------
# cat ./arpwatch_compare
#!/bin/bash
LOG="/var/arpwatch/arp.log"
echo -----------$1 >> $LOG

STRING=`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
--------------------------------------------------------

Скрипт - черновик. Еще доделывать и оптимизировать. Но прежде хотелось запустить всю связку. В том числе и обработку входных параметров на правильность и целостность нужно добавить обязательно.

Приму любые советы.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "Перенаправление на вход bash скрипта"  
Сообщение от allez (ok) on 05-Ноя-06, 22:10 
>Приму любые советы.

Вот вам слегка доработанный скрипт.
=========================================================================================
#!/bin/bash

LOG="/var/arpwatch/arp.log"
PID="/var/arpwatch/arp.pid"
cur_date=`date \+\%Y_\%m_\%d_\%H_\%M`
echo -----------$cur_date >> $LOG

while 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_pid

done
=========================================================================================

Работает все так:
/usr/local/sbin/arpwatch -i eth0 -p -m 2 -f /var/arpwatch/arp0.dat | arpwatch_compare.sh

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

6. "Перенаправление на вход bash скрипта"  
Сообщение от Susanin_ email(ok) on 06-Ноя-06, 13:10 
Большое человеческое спасибо за работающий скрипт и за Ваше потраченное  время!
:)


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру