Nowe posty

Autor Wątek: Bash pobieranie 2 zmiennych  (Przeczytany 2176 razy)

kaju007

  • Gość
Bash pobieranie 2 zmiennych
« dnia: 2012-01-26, 19:13:04 »
Witam
Próbuję sobie ułatwić życie z generowaniem configów do firewalla.
A ze względu że nie uczyłem sie tego nigdy i już straciłem pomysły lub z braku niewiedzy mi nie wychodzi więc proszę was o pomoc.
Mam tak plik z firewallem i osobny plik o nazwie sieci z takimi wartościami
np:
ADRES_PODSIECI;ADRES_IP
192.168.0.0/24;10.0.1.1
192.168.1.0/24;10.0.2.1
...

te dane potrzebował bym umieścić w tej regułce
/usr/sbin/ip ro a table wan1 ADRES_PODSIECI dev eth1 src ADRES_IP

Jedynie co wyczytałem i udało mi się uruchomić to pobieranie danych z pliku w ten sposób.
INTDEV1= 192.168.0.1 192.168.2.1
for i in $INTDEV1
      do
$IPTABLES -A INPUT -s $i -m state --state NEW -p tcp --sport 1024: --dport 53 -j ACCEPT
done

Proszę o pomoc jak zrobić to żeby pobierać z danego pliku 2 wartości oddzielone np ;

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 3071
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
Bash pobieranie 2 zmiennych
« Odpowiedź #1 dnia: 2012-01-26, 20:26:11 »
To zadanie raczej dla AWKa niż BASHa, ale można na przykład tak:
Plik baza.txt
ADRES_PODSIECI;ADRES_IP
192.168.0.0/24;10.0.1.1
192.168.1.0/24;10.0.2.1
Plik setup.sh:
#!/bin/bash

# Magia - mówisz, że ; jest separatorem rekordów dla READ
IFS=';'

while read SIEC BRAMA
do
    # Omijamy naglowek
    if [ "$SIEC" != "ADRES_PODSIECI" ]
    then
        # W "roboczym" skrypcie zdejmujesz echo... :)
        echo "ip ro a table wan1 $SIEC dev eth1 src $BRAMA"
    fi
done < baza.txt
Wynik:

ip ro a table wan1 192.168.0.0/24 dev eth1 src 10.0.1.1
ip ro a table wan1 192.168.1.0/24 dev eth1 src 10.0.2.1
Paweł Kraszewski
~Arch/Void/Gentoo/FreeBSD/OpenBSD/Specjalizowane customy

kaju007

  • Gość
Bash pobieranie 2 zmiennych
« Odpowiedź #2 dnia: 2012-01-26, 21:21:43 »
Hej
Dzięki za odp.
Błąd nie wyskakuje ale regułka nie wykonuje się.
Może od początku mam taki plik
#!/bin/sh
#
#. /etc/rc_siec
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

/usr/sbin/ip a a 192.168.100.254/24 brd 192.168.100.255 dev eth1
/usr/sbin/ip a a 192.168.101.254/24 brd 192.168.101.255 dev eth1
/usr/sbin/ip a a 192.168.102.254/24 brd 192.168.102.255 dev eth1
/usr/sbin/ip a a 10.0.0.254/24 brd 10.0.0.255 dev eth1
/usr/sbin/ip link set eth1 up
#/usr/sbin/ip a a 10.0.98.30/24 brd 10.0.98.255 dev eth2
#/usr/sbin/ip link set eth2 up
/usr/sbin/pppoe-server -I eth1 -L 192.168.100.254 -N 1000 -k
/usr/local/sbin/pptpd
/var/v-smart/daemon/_daemon/vsmart-lmsd
/serwer/start_all
/etc/init.d/bind9 start

# trasy dla tabeli wan1
/usr/sbin/ip ro a table wan1 78.8.37.0/25 dev eth0 src 78.8.37.15
/usr/sbin/ip ro a table wan1 10.0.98.0/24 dev eth2 src 10.0.98.30



IFS=';'

while read SIEC BRAMA
do
    # Omijamy naglowek
    if [ "$SIEC" != "ADRES_PODSIECI" ]
    then
        # W "roboczym" skrypcie zdejmujesz echo... :)
         /usr/sbin/ip ro a table wan1 $SIEC dev eth1 src $BRAMA
    fi
done < rc_siec
#/usr/sbin/ip ro a table wan1 $ip dev eth1 src $mac

exit 0
wynik po wykonaniu tego pliku

RTNETLINK answers: File exists
RTNETLINK answers: File exists
RTNETLINK answers: File exists
RTNETLINK answers: File exists
Starting domain name service...: bind9.
RTNETLINK answers: File exists
RTNETLINK answers: File exists
Error: an inet prefix is expected rather than "#!/bin/sh".
RTNETLINK answers: Invalid argument
RTNETLINK answers: Invalid argument
RTNETLINK answers: File exists
RTNETLINK answers: File exists
RTNETLINK answers: File exists
RTNETLINK answers: File exists
RTNETLINK answers: File exists
przy tym wpisie występuje error i inwalid argument