LinuxForum.Fans
Тема

Помогите написать скрипт

Автор: warp 21 сообщений 5295 просмотров
#135261

Здравствуйте, помогите дописать скрипт. Дело в том, что на предприятии внедряют DHCP, и нужно чтобы Linux-сервер с помощью скрипта собирал по сети mac-адреса и имена машин по ip-адресу по средствам nmblookup и сохранял их в файл. Скрипт написали, работает, сохраняет данные в файл под названием dhcp.conf, но возникла следующая проблема - сохранять, то он сохраняет, но он просто дописывает данные в файл dhcp.conf и при каждом запуске скрипта файл увеличивается в размерах, а нужно чтобы скрипт заменял ранее собранные данные на вновь собранные, так сказать - работал динамически. Скрипт прикрепил. Помогите, я не силен в Bash, а скрипт писать нужно :) Заранее благодарен.

[console]
#!/bin/bash
#Create user share
status="No"
dir="/root"
if [ -d $dir ]; then
echo "directory suces"
for ((i=0;i < 15;i++));
do
name_pc=`nmblookup -A 192.168.20.$i | awk '{print $1}' | awk '(NR == 2)'`
ip=192.168.20.$i
mac_pc=`nmblookup -A 192.168.20.$i | grep MAC | awk '{print $4}' | awk '(NR == 1)'`
if [ $name_pc == $status ]; then
# echo `date` "no macc is "192.168.20.$i "adress" >> /var/log/create_user_share.log
echo "no mac is "192.168.20.$i "adress"
else
echo "Host" $name_pc "{" >> /root/dhcp.conf
echo " Hardware ethernet" $mac_pc >> /root/dhcp.conf
echo " fixed-address" $ip >> /root/dhcp.conf
echo "}" >> /root/dhcp.conf
fi
done
else exit1
fi

[/console]

#135288

Насколько я понимаю, вам нужно заменить даные в dhcp.conf. Для этого можно попробывать в начале скрипта добавить вот такую конструкцыю, nолько я не знаю будет ли она работать из скрипта, из консоли она работает
[console]> /root/dhcp.conf[/console]
Но эта команда полностью очистит файл, а как я понял это конфиг dhcp, так что вам не пойдёт. Вам нужно создать отдельный файл с прописаными айпи и именами и както подключить его к основному конфигу. В настройке dhcp не силён так что вам прийдётса самому разобратса.
А добавить эту строку надо вначале скрипта.
Или можно просто после очистки конфига прописать занесение стандартных настроек сервера вначале скрипта, перед цыклом, а цыклом уже запишутса айпишки и имена.
Вот у меня такие 2 идеи.

#135290

проще всего стереть часть файла ПОСЛЕ заголовка, и написать туда всё по новой. Для указания места, после которого стираем используйте маркер, спец-комментарий

text
#MARK#

Стирание
[console]sed -ni "1,/#MARK#/p' /root/dhcp.conf[/console]

#135293
kisil написал:
nолько я не знаю будет ли она работать

будет.

kisil написал:
Вот у меня такие 2 идеи.

четвёртая: сгенерировать начало конфига прямо внути скрипта используя <<
http://poplinux.ru/adv-bash/chapter-17.0.html#HERE-DOCS

text

(
cat <<EOF
# тут начало конфига

EOF ) >dhcp.conf # теперь пишем новые строчки

#137123

Вобщем написал я скрипт, сколько мучился не спрашивайте :D Теперь возникла проблема, с которой у меня никак не получается разобраться самостоятельно. Скрипт работает так: он сканирует сеть по заданному IP-адресу и возвращает MAC-адрес и Имя машины, и просто дописывает к существующему списку нужные, а имеющиеся записи просто пропускает. Проблема в том, что "старые" записи не обновляются. В одном из постов drBatty писал про команду sed, может с помощью неё что получится?

#137124

Вот скрипт:

[console]
#!/bin/bash
#Create user share
status="No"
dir="/root"
if [ -d $dir ]; then
echo "directory suces"
for ((i=0;i < 15;i++));
do
name_pc=`nmblookup -A 192.168.20.$i | awk '{print $1}' | awk '(NR == 2)'`
ip=192.168.20.$i
mac_pc=`nmblookup -A 192.168.20.$i | grep MAC | awk '{print $4}' | awk '(NR == 1)'`
if [ $name_pc == $status ]; then
# echo `date` "no macc is "192.168.20.$i "adress" >> /var/log/create_user_share.log
echo "no mac is "192.168.20.$i "adress"
else
check=`grep -rl $name_pc /root/dhcp.conf`
if [ $check ]; then
echo "Даные уже есть."

else
echo "Host" $name_pc "{" >> /root/dhcp.conf
echo " Hardware ethernet" $mac_pc >> /root/dhcp.conf
echo " fixed-address" $ip >> /root/dhcp.conf
echo "}" >> /root/dhcp.conf
#echo "Данные добавлены"
fi
fi
done
else exit1
fi
fi
[/console]

#137143
warp написал:
В одном из постов drBatty писал про команду sed, может с помощью неё что получится?

предположим, формат списка такой:

text
00:11:6b:93:f3:57 192.168.1.17

т.е. в одной строчке сначала идёт МАК, потом один (это важно!) пробел, потом IP.
предположим так-же, что вы просканировали этот $IP и выяснили, что там новый $MAC. Что-бы сменить мак в списке, сделайте:
[console]sed "s/.* $IP$/$MAC $IP/" list.txt[/console]

#137145
warp написал:
Вот скрипт:

сделайте пожалуйста отступы нормальные - читать невозможно :(
(Hint: используйте специальные кодерские редакторы - консольный vim или гуёвую kate. Есть ещё 100500 разных).

#153331

Всем привет!
У меня вопрос похожего характера.
Внедряем в сеть DHCP
Установили DHCP на Ububtu 10.10
Необходим скрипт который бы сканировал сеть-сопоставлял мак адрес с ip адресами и резервировал их dhcp.conf
Это необходимо для того чтобы перевести все машины (их около 300) на DHCP постепенно
Потом (как я думаю) при добавлении новой машины в сеть можно зарезервировать ручками...

Прошу вашей помощи подсказок советов и т.д.
Скрипт предложенный warp хороший. но только он не умеет определять маки если у хоста нет имени (реализовать бы возможность добавлять произвольные, если имени нет) и не понимает если подсеть из маски 255.255.252.0 а только количества хостов которые уажешь сам

#153363
ramms написал:
Необходим скрипт который бы сканировал сеть-сопоставлял мак адрес с ip адресами и резервировал их dhcp.conf
Это необходимо для того чтобы перевести все машины (их около 300) на DHCP постепенно
Потом (как я думаю) при добавлении новой машины в сеть можно зарезервировать ручками...

вообще-то DHCP сервер обычно сам этим занимается. Велосипед вы строите. :(

#153456
drBatty написал:
[quote=ramms]Необходим скрипт который бы сканировал сеть-сопоставлял мак адрес с ip адресами и резервировал их dhcp.conf
Это необходимо для того чтобы перевести все машины (их около 300) на DHCP постепенно
Потом (как я думаю) при добавлении новой машины в сеть можно зарезервировать ручками...

вообще-то DHCP сервер обычно сам этим занимается. Велосипед вы строите. :([/quote]

Ну подскажите пожалуйста как это сделать?

#153464

Блин, да поймите же, сервер dhcp настроен, необходимо ему зарезервировать все ip которые уже настроены у клиентов на статику, после этого включить раздачу пула, и новым машинам уже раздавать оставшийся диапозон, а после резервировать каждую новую подключенную.
Так как много машин и чтобы не забивать вручную нужен скрипт

#153473

ramms, собрать мак-адреса вы сможете только если у вас все устройства в одной подсети и сеть на коммутаторах. Через маршрутизатор вы не увидите мак. По крайней мере в скрипте.

С помощью nmap можно сканировать подсети на открытые порты, но он еще и мак устройства показывает. Посмотрите в этом направлении.

#153484
ramms написал:
диапозон, а после резервировать каждую новую подключенную.
Так как много машин и чтобы не забивать вручную нужен скрипт

а...
дайте мне плз строчку из /var/log/message dhcp-server'а, в которой написано след: "клиент с маком хх:хх:хх:хх:хх получил IP х.х.х.х", и я вам покажу, как составить такой список. Потом этот список сунете в dhcpd.conf, и он этим макам будет давать их IP, а всем остальным - из пулла. А сколько всего маков для нас без разницы, 2 или 200.

#153487
elve написал:
Через маршрутизатор вы не увидите мак.

ну и что? за то их увидит маршрутизатор. Правда я не знаю, что с ним делать, ибо сервер увидит мак маршутизатора, а не клиента. В этом случае подойдёт IP по запросу DHCP-client'а. Естественно, сервер может ошибится, и дать чужой IP не тому. Но тут ничего уже не поделать... В смысле - сложно.

короче - данных о топологии мало

#153488

elve, Все верно все устройства в одной подсети, сеть на коммутаторах, программа у меня есть которая может сопоставить мак и ip (список маков и их ip уже готов). Дело не в этом. Я хочу себе максимально упростить работу, и хочу перевести машины со статики на DHCP. Чтобы это сделать, нужно:
1. Зарезервировать все существующие статические ip и их Маки в dhcp-сервере
2. С оставшегося пула адресов выдавать DHCP и при появлении новой машины резервировать это ручками(по крайней мере другого способа не вижу)
Тем самым резервирования делается для того, чтобы знать в каком месте находится машина.
Количество компов в сети около 300-350
Если забивать все в ручную это очень долго получится

Сам я не программист, конечно, писать скрипты не умею(что очень жаль).
warp- написал скрипт, красава, но он не подходит, так как берет запросы с нэтбиоса и сопоставления маков естественно не 100%, даже не 50%. Может как то можно его переделать?

#153492
ramms написал:
1. Зарезервировать все существующие статические ip и их Маки в dhcp-сервере

список => конфиг
Это задача для sed. Ну или ручками, дело ваше.

ramms написал:
2. С оставшегося пула адресов выдавать DHCP и при появлении новой машины резервировать это ручками(по крайней мере другого способа не вижу)

а это задача DHCP-server'а.
опять-таки - можно и в ручную.

#153494
ramms написал:
Может как то можно его переделать?

да что там переделывать? у вас есть полный список мак/ip? да/нет? если есть - дайте 1 строчку. dhcpd.conf я помню как настраивать. зачем тут скрипт, если это одной командой делается?
вот вам готовый конфиг
[console]# sed 's/^#.*//;/^$/d' /etc/dhcpd.conf
ddns-update-style ad-hoc;
option domain-name "bx";
option domain-name-servers 192.168.1.1;
default-lease-time 600;
max-lease-time 7200;
authoritative;
subnet 192.168.1.0 netmask 255.255.255.0 {
option domain-name "bx";
option broadcast-address 192.168.1.254;
option domain-name-servers 192.168.1.1;
option subnet-mask 255.255.255.0;
option routers 192.168.1.1;
range 192.168.1.50 192.168.1.60;
default-lease-time 600;
max-lease-time 7200;

host aranei {
hardware ethernet 00:80:48:46:98:15;
fixed-address 192.168.1.10;
}[/console]
http://linuxforum.ru/viewtopic.php?id=6611
он даёт одному статический IP а всем остальным динамический из пула. Что ещё надо то?

#153502

ramms, если список с сопоставленными маком и ип есть, то скрипт написать можно =).

Алгоритм такой:
1. Берем строку из файла
2. Берем из строки ип, пишем в конфиг
3. Берем из строки мак, пишем в конфиг
4. Если строки не кончились, то переход к п.1

Пункты 2,3 можно реализовать с помощью echo и awk.
Остальное стандартными средствами bash.


Хотя сдается мне, что вы хотите не чтобы вам помогли, а чтобы за вас все сделали =).

Войдите или зарегистрируйтесь, чтобы ответить.