LinuxForum.Fans
Тема

bash одна команда много переменных

Автор: tnega 32 сообщений 3863 просмотров
02.01.2015 23:12 #407973

Приветствую Всех Форумчан!

Подтолкните меня пожалуйста, хочу сделать самопальный биллинг для своего удобства, копаю мануалы по bash но не могу ничего найти путного.

для примера команда разрешающая доступ в Интернет людям:

text
iptables -I FORWARD 1 -m mac --mac-source 10:10:10:10:10:10 -s 10.10.0.1 -j ACCEPT

1.
я хочу чтобы в отдельном файле была как бы база данных пользователей.
фамилия, мак адрес и ип адрес.
и чтобы эта одна команда проверяла записи в этой базе данных при присутствии их выполняла данный скрип, только со своими значениями (фамилию в базе я пишу просто для обозначения, так скажем для дальнейшего усовершенствования биллинга)

2.
база будет по строкам, так наверное легче все сделать, новая строка - новый абоннет.
при наличии в начале строки # - эту строчку не выполнять главным скриптом.

3.
в дальнейшем хотелось бы написать скрипт показывающий включенных и отключенных пользователей и который бы так же позволял включать их и отключать.

с iptables у меня все нормально, а вот с башем увы плохо.
буду очень признателен всем кто откликнется и поможет мне.

03.01.2015 21:16 #408030

как то так:

1. Список - файл /etc/users (можно использовать комментарии #)[console]
# Простые пользователи.
#192.168.0.100
#192.168.0.101 #Маркетинг
192.168.0.103 #Бухгалтерия
192.168.0.104 #Секретарь
[/console]

2. Сам скрипт на баше /etc/enable_inet

text

cat "$2" | while read line
do
  # Обрезать строку до символа #
  es1=$(echo $line | grep -o '^[^#]*')
  # Выкинуть конечные пробелы
  es2=$(echo $es1)
  if [ -n "$es2" ]; then
    iptables -A FORWARD -i "$1" -s "$es2" -j ACCEPT
  fi
done

3. Пример вызова

text

. /etc/enable_inet eth0 /etc/users
03.01.2015 22:16 · отредактировано #408046

Bif, большое спасибо за ответ и за помощь!

Пол дня копался в инете, читал и решил сделать таким образом.

база выглядит так: (имя файла - base, имя пользователя, ип адрес и мак адрес)
[console]user1 10.10.0.1 00:00:00:00:00:00
user2 10.10.0.2 11:11:11:11:11:11
user3 10.10.0.3 22:22:22:22:22:22[/console]

Включаем (или отключаем кое что сами знаете что поменяв) пользователей таким скриптом:

text
while [ 1 ]
do
echo "Введите абонента:"
read name
ip=`sed /$name/p -n base | cut -d" " -f2`
mac=`sed /$name/p -n base | cut -d" " -f3`
iptables -I FORWARD 1 -m mac --mac-source $mac -s $ip -j ACCEPT
exit
done

подскажите, направьте меня. как сделать так, чтобы мне можно было бы одной командой при старте системы включить всех незакоментированных пользователей из базы данных? а закоментированных не включать.
(отключаю пользователей такой командой - iptables -D FORWARD -m mac --mac-source $mac -s $ip -j DROP) (просто FORWARD без единички)

04.01.2015 12:19 #408143

tnega, работайте с базой в виде двух ассоциацивных массивов, которые индексированны именем юзера..

Bif, просил жеж не публиковать быдлокод.

04.01.2015 18:07 · отредактировано #408205

читая примеры по ipset я наткнулся на полезный скрипт, который и был мне нужен:

подстроил его под себя:

text
file=$(cat base | cut -d" " -f2)
for ip in $file
do
iptables -I FORWARD 1 -s $ip -j ACCEPT
done

попрошу о помощи - доработать скрипт.

Как вы видите скрипт будет брать второй значение из каждой строки нашей базы данных, а именно - ип адрес.
Мне хотелось бы, чтобы он брал еще и третье значение - макс адрес. шаманю сейчас со скриптом, так скажем методом тыка, пока ничего не получается.

04.01.2015 19:20 #408217

на кой ляд тут вообще переменная? While read name ip mac; do ...; done <filename

Пишу с планшета, но думаю идея ясна.

Кошку засуньте в...

04.01.2015 19:35 #408218
drBatty написал:
на кой ляд тут вообще переменная? While read name ip mac; do ...; done <filename

Пишу с планшета, но думаю идея ясна.

Кошку засуньте в...

не совсем вас понял.
разве что про кошку.

этой самой кошкой я смотрю содержимое базы, отсекаю ненужное cut`ом.
куда и вставляется эта переменная.

скрипт позволяет мне одних махом включить в работу всех абонентов, но там как видите одна переменная - ip, только ип адрес. мне нужно доработать этот скрипт, чтобы была еще одна переменная - mac - мак адрес.
я не знаю всех этих тонкостей, копаюсь уже весь вечер, пробую, эксперементирую.

Мне просто нужно чтобы помимо ип адреса этот скрипт брал из базы еще одну, вторую переменную - мак адреса.

04.01.2015 20:15 #408221

Я вам рабочий код написал, help read прочитайте.

Метод тыка оставьте в маздае, он не нужен.

Команда cat тут вообще не нужна,а cut не к месту. Сувать в переменную апотом переменную в цикл - просто идиотизм, не нужно так делать. Сразу направьте файл в read в цикле, и оно всё само распарсит.

04.01.2015 20:19 #408223

Да, сколько можно готовый код писать? Вы ведь скажите "спасибо" а потом будете советывать другим своюкошку в конвейере.

Зыж вот уродский андроид, прошу прощения за орфографию.

04.01.2015 22:57 #408290
drBatty написал:
Да, сколько можно готовый код писать? Вы ведь скажите "спасибо" а потом будете советывать другим своюкошку в конвейере.

Зыж вот уродский андроид, прошу прощения за орфографию.

Да, я действительно скажу Вам спасибо за помощь.
Но советовать мне нечего да и некому, так как нет у меня знакомых не в реальной жизни, ни в глобальной сети с кем бы я мог чем-то поделиться или что-то посоветовать, и во вторых мы все же не понимаем друг друга.
Я хотел все запихнуть в одну команду и мне повезло - подсказал один человек на другой форуме мне вот что:

text
cat base | awk '{print "iptables -I FORWARD 1 -m mac --mac-source " $3 " -s " $2 " -j ACCEPT"}'|sh

и всего делов то!

Этой командой выполняются все строки в базе, и берутся 2 и 3 слова в качестве переменных.

Для себя я сделал так скажем дополнительный столбец в качестве 4 слова а именно ACCEPT или DROP

то есть, база:
[console]User1 10.10.0.1 00:11:22:33:44:55:66 ACCEPT
User1 10.10.0.2 00:11:22:33:44:55:77 DROP[/console]
и т.д.

и следовательно сам скрипт:

text
cat base | awk '{print "iptables -I FORWARD 1 -m mac --mac-source " $3 " -s " $2 " -j "$4""}'|sh

теперь же, все же хочу допилить скрипт отключения и подключения пользователей.

А именно - в файле базы менять значение 4 слова определенной строки, написал скрипт:

text
while [ 1 ]
do
echo "Введите абонента:"
read name
status=$(sed /$name/p -n base | cut -d" " -f4)
sed -i 's/'$status'/DROP/g' **base
exit
done

Ввожу абонента User1 а значение меняется сразу во всех строках. в чем беда?

04.01.2015 23:09 · отредактировано #408294
"tnega" написал:
Ввожу абонента User1 а значение меняется сразу во всех строках. в чем беда?

Да вы издеваетесь...

И на кой ляд вам $4 здесь:

"tnega" написал:
cat base | awk '{print "iptables -I FORWARD 1 -m mac --mac-source " $3 " -s " $2 " -j "$4""}'|sh

и, соответственно, последняя колонка в базе, а еще по две записи на одного юзверя?????
Втыкните сюда значение из переменной, по принципу:
#/etc/enable_inet user1 on пользователя1 включить
Ну а переменная должна устанавливаться соответственно: on=ACCEPT; off=DROP

04.01.2015 23:09 #408295

Все тот же человечек допилил скрипт, в новом скрипте закоментированный строки в базе обрабатываться не будут.

text
cat base |grep -v "^#" | awk '{print "iptables -I FORWARD 1 -m mac --mac-source  " $3 " -s " $2 " -j ACCEPT"}'|sh 

Опять же хотелось бы допилить скрипт включения и отключения пользователей, который вы увидите в предыдущем сообщении, чтобы при вводе абонента - User1, к его строчке в базе в самое начало добавлялся символ - #
:-)

хотя хотелось бы посмотреть, для своего же опыта, как будут выглядеть скрипты в обоих вариантах.

04.01.2015 23:11 · отредактировано #408296
diablopc написал:
[quote="tnega"]Ввожу абонента User1 а значение меняется сразу во всех строках. в чем беда?

Да вы издеваетесь...

И на кой ляд вам $4 здесь:

"tnega" написал:
cat base | awk '{print "iptables -I FORWARD 1 -m mac --mac-source " $3 " -s " $2 " -j "$4""}'|sh

?????
Втыкните сюда значение из переменной, по принципу:
#/etc/enable_inet user1 on пользователя1 включить
Ну а переменная должна устанавливаться соответственно: on=ACCEPT; off=DROP[/quote]

Вашу мысль понял по поводу on и off! сейчас буду ковырять

я просто хочу так скажем уместить все в один скрипт, и не выполнять команды такого вида:

text
#/etc/enable_inet user1 on

я хочу сделать все по принципу:

1: Список пользователей
2. Включить пользователя
3. Отключить пользоваетеля
и т.п.

Легко и быстро переключаться между меню набирая цифры, это у меня все есть...
просто я не очень силен в awk, cut, sed и т.п. вещах

Хотелось бы легко и быстро изменять слова в определенных строках.

04.01.2015 23:18 #408298

tnega, Я вот одного не понял:
откуда вот это:

text
cat base | awk '{print "iptables -I FORWARD 1 -m mac --mac-source " $3 " -s " $2 " -j "$4""}'|sh

знает какую строку из базы читать?????

04.01.2015 23:20 #408299
diablopc написал:
tnega, Я вот одного не понял:
откуда вот это:
text
cat base | awk '{print "iptables -I FORWARD 1 -m mac --mac-source " $3 " -s " $2 " -j "$4""}'|sh

знает какую строку из базы читать?????

вот это читает все строки из базы, что мне и нужно было

04.01.2015 23:21 #408300

Вам ерунду посоветовали.

И вы сами видите, в чём проблема, это write only быдлокод, который один раз пишут методом тыка, а потом его только в /dev/null.

Ещё раз: пишу я с планшета, да и вообще мне лень готовый код давать. Подход изначально неправильный у вас, вам нужно просто прочитать три переменные командой read.

Если имя начинается с #, то пропускаем, иначе проверяем имя, и добавляем правило в iptables.

И да, в одну строку пишут только школьники, опытные люди так код не пишут.

Что до sed, то там что-то типа sed -ri*~ "/^$username/s/\S+$/$status/" basename

04.01.2015 23:22 #408301

Повторюсь, сейчас хотелось бы попробовать допилить скрипт Включения и отключения пользователя:

while [ 1 ]
do
echo "Введите абонента:"
read name
...........
exit
done

при котором я ввожу имя абонента и в строке абонента менялось бы 4 слово на нужное.

04.01.2015 23:25 #408302
"tnega" написал:
вот это читает все строки из базы, что мне и нужно было

И как оно должно реагировать на ./command user1 some_action
Откуда оно должно знать какого пользователя врубить или вырубить???

04.01.2015 23:27 #408303

tnega написал:
Повторюсь, сейчас хотелось бы попробовать допилить скрипт Включения и отключения пользователя:

while [ 1 ]
do
echo "Введите абонента:"
read name
...........
exit
done

при котором я ввожу имя абонента и в строке абонента менялось бы 4 слово на нужное.
спросите у того школьника, который ЭТО написал.

Особенно доставляет exit;done, вы вообще голову включаете?
04.01.2015 23:32 #408307
diablopc написал:
[quote="tnega"]вот это читает все строки из базы, что мне и нужно было

И как оно должно реагировать на ./command user1 some_action
Откуда оно должно знать какого пользователя врубить или вырубить???[/quote]

text
while [ 1 ]
do
echo "Введите абонента:"
read name #ввожу имя абонента
ip=`sed /$name/p -n base | cut -d" " -f2`
mac=`sed /$name/p -n base | cut -d" " -f3`
iptables -I FORWARD 1 -m mac --mac-source $mac -s $ip -j ACCEPT
exit
done

И вуаля, наш абонент в сети.

А потом вдруг мне захотелось отключить нашего абонента: (но при этом мне хотелось бы, чтобы его запись в базе с ACCEPT поменялась на DROP, так как при следующем старте, или допустим перезагрузки сервера все правила я включу своим скриптом, который каждую строку в базе выполнит:

text
cat base | awk '{print "iptables -I FORWARD 1 -m mac --mac-source " $3 " -s " $2 " -j "$4""}'|sh

и этот отключенный пользователь, так же останется отключенным. понимаете о чем я?)

text

while [ 1 ]
do
echo "Введите абонента:"
read name #ввожу имя абонента
ip=`sed /$name/p -n base | cut -d" " -f2`
mac=`sed /$name/p -n base | cut -d" " -f3`
iptables -R FORWARD 1 -m mac --mac-source $mac -s $ip -j DROP
exit
done
Войдите или зарегистрируйтесь, чтобы ответить.