#1 02.01.2015 20:12:19

tnega
Administrator
Зарегистрирован: 19.04.2010
Сообщений: 196
IP-адрес

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

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

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

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

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 у меня все нормально, а вот с башем увы плохо.
буду очень признателен всем кто откликнется и поможет мне.

#2 03.01.2015 18:16:14

Bif
Administrator
Зарегистрирован: 10.11.2012
Сообщений: 239
IP-адрес

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

как то так:

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


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. Пример вызова

. /etc/enable_inet eth0 /etc/users

#3 03.01.2015 19:16:24

tnega
Administrator
Зарегистрирован: 19.04.2010
Сообщений: 196
IP-адрес

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

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]

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

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 без единички)

#4 04.01.2015 09:19:54

drBatty
Administrator
Зарегистрирован: 20.02.2010
Сообщений: 17 053
IP-адрес

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

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

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

#5 04.01.2015 15:07:29

tnega
Administrator
Зарегистрирован: 19.04.2010
Сообщений: 196
IP-адрес

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

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

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

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


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

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

#6 04.01.2015 16:20:45

drBatty
Administrator
Зарегистрирован: 20.02.2010
Сообщений: 17 053
IP-адрес

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

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

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

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

#7 04.01.2015 16:35:41

tnega
Administrator
Зарегистрирован: 19.04.2010
Сообщений: 196
IP-адрес

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

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

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

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


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

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

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

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

#8 04.01.2015 17:15:13

drBatty
Administrator
Зарегистрирован: 20.02.2010
Сообщений: 17 053
IP-адрес

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

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

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

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

#9 04.01.2015 17:19:53

drBatty
Administrator
Зарегистрирован: 20.02.2010
Сообщений: 17 053
IP-адрес

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

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

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

#10 04.01.2015 19:57:09

tnega
Administrator
Зарегистрирован: 19.04.2010
Сообщений: 196
IP-адрес

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

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

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


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

и следовательно сам скрипт:
cat base | awk '{print "iptables -I FORWARD 1 -m mac --mac-source " $3 " -s " $2 " -j "$4""}'|sh


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

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

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 а значение меняется сразу во всех строках. в чем беда?

#11 04.01.2015 20:09:49

diablopc
Administrator
Зарегистрирован: 17.09.2014
Сообщений: 1 032
IP-адрес

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

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

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

И на кой ляд вам $4 здесь:
Quote by 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

#12 04.01.2015 20:09:53

tnega
Administrator
Зарегистрирован: 19.04.2010
Сообщений: 196
IP-адрес

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

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

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


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

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

#13 04.01.2015 20:11:33

tnega
Administrator
Зарегистрирован: 19.04.2010
Сообщений: 196
IP-адрес

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

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

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

И на кой ляд вам $4 здесь:
Quote by 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


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

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


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

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

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

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

#14 04.01.2015 20:18:54

diablopc
Administrator
Зарегистрирован: 17.09.2014
Сообщений: 1 032
IP-адрес

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

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

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

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

#15 04.01.2015 20:20:44

tnega
Administrator
Зарегистрирован: 19.04.2010
Сообщений: 196
IP-адрес

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

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

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


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

#16 04.01.2015 20:21:14

drBatty
Administrator
Зарегистрирован: 20.02.2010
Сообщений: 17 053
IP-адрес

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

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

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

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

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

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

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

#17 04.01.2015 20:22:40

tnega
Administrator
Зарегистрирован: 19.04.2010
Сообщений: 196
IP-адрес

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

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

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

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

#18 04.01.2015 20:25:25

diablopc
Administrator
Зарегистрирован: 17.09.2014
Сообщений: 1 032
IP-адрес

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

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

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

#19 04.01.2015 20:27:16

drBatty
Administrator
Зарегистрирован: 20.02.2010
Сообщений: 17 053
IP-адрес

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

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

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

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

Особенно доставляет exit;done, вы вообще голову включаете?

#20 04.01.2015 20:32:12

tnega
Administrator
Зарегистрирован: 19.04.2010
Сообщений: 196
IP-адрес

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

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

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


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, так как при следующем старте, или допустим перезагрузки сервера все правила я включу своим скриптом, который каждую строку в базе выполнит:
cat base | awk '{print "iptables -I FORWARD 1 -m mac --mac-source " $3 " -s " $2 " -j "$4""}'|sh

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

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

#21 04.01.2015 20:33:20

tnega
Administrator
Зарегистрирован: 19.04.2010
Сообщений: 196
IP-адрес

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

Exit и done, это просто так скажем наброски, для удобства тестирования скрипта)

#22 04.01.2015 20:35:26

drBatty
Administrator
Зарегистрирован: 20.02.2010
Сообщений: 17 053
IP-адрес

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

tnega, какой смысл в этом идиотском цикле, что вы приводите? Может вы что-то скрываете?

#23 04.01.2015 20:36:53

drBatty
Administrator
Зарегистрирован: 20.02.2010
Сообщений: 17 053
IP-адрес

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

Exit и done, это просто так скажем наброски, для удобства тестирования скрипта)
все остальное тоже шизофазия.

#24 04.01.2015 20:39:24

tnega
Administrator
Зарегистрирован: 19.04.2010
Сообщений: 196
IP-адрес

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

tnega, какой смысл в этом идиотском цикле, что вы приводите? Может вы что-то скрываете?


да, вы правы! смысла нет в цикле, это я только сейчас понял. все работало и без него, просто голова забита не этим была :-)

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

#25 04.01.2015 20:44:27

diablopc
Administrator
Зарегистрирован: 17.09.2014
Сообщений: 1 032
IP-адрес

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

Quote by tnega
замене четвертого слова в строке определенного пользователя.
та можно и не заменять:
Просто в команде писать: ./command some_user {ACCEPT,DROP}
Если в базе по две записи на одного юзверя держать - это полнейшая, как сказал доктор, шизофазия.

#26 04.01.2015 20:47:36

tnega
Administrator
Зарегистрирован: 19.04.2010
Сообщений: 196
IP-адрес

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

Quote by tnega
замене четвертого слова в строке определенного пользователя.
та можно и не заменять:
Просто в команде писать: ./command some_user {ACCEPT,DROP}


я Вашу мысль понял :-) но запись то нужно сделать в таблицу? чтобы при перезагрузке нашего биллинга этот абонент снова включится или будет отключен :-)

#27 04.01.2015 20:50:15

diablopc
Administrator
Зарегистрирован: 17.09.2014
Сообщений: 1 032
IP-адрес

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

Quote by tnega
? чтобы при перезагрузке нашего биллинга этот абонент снова включится или будет отключен :-)
Оппа чирик.
Новая задача
Да вы до ума доведите то что в стартовом посте написано....
Ессно не учитывая раздел "в будущем"

#28 04.01.2015 20:57:04

tnega
Administrator
Зарегистрирован: 19.04.2010
Сообщений: 196
IP-адрес

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

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

#29 04.01.2015 20:58:43

diablopc
Administrator
Зарегистрирован: 17.09.2014
Сообщений: 1 032
IP-адрес

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

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

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

#30 04.01.2015 21:07:14

tnega
Administrator
Зарегистрирован: 19.04.2010
Сообщений: 196
IP-адрес

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

да, либо таким образом.

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


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

в этом случае отпадает использовании 4 столбца с DROP и ACCEPT
но все равно нужно, чтобы при включении или отключении абонента снимался или ставился знак # в базе данных с начала строки определенного абонента. на будущее :-)

Команды включения и отключения Вы видите, их нужно просто допилить :-)

я конечно могу закоментировать пользователей и ручками :-) просто хотелось бы чтобы был своеобразный автоматизм :-)

Board footer