Здравствуйте, помогите дописать скрипт. Дело в том, что на предприятии внедряют 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]
Помогите написать скрипт
Насколько я понимаю, вам нужно заменить даные в dhcp.conf. Для этого можно попробывать в начале скрипта добавить вот такую конструкцыю, nолько я не знаю будет ли она работать из скрипта, из консоли она работает
[console]> /root/dhcp.conf[/console]
Но эта команда полностью очистит файл, а как я понял это конфиг dhcp, так что вам не пойдёт. Вам нужно создать отдельный файл с прописаными айпи и именами и както подключить его к основному конфигу. В настройке dhcp не силён так что вам прийдётса самому разобратса.
А добавить эту строку надо вначале скрипта.
Или можно просто после очистки конфига прописать занесение стандартных настроек сервера вначале скрипта, перед цыклом, а цыклом уже запишутса айпишки и имена.
Вот у меня такие 2 идеи.
проще всего стереть часть файла ПОСЛЕ заголовка, и написать туда всё по новой. Для указания места, после которого стираем используйте маркер, спец-комментарий
#MARK#Стирание
[console]sed -ni "1,/#MARK#/p' /root/dhcp.conf[/console]
nолько я не знаю будет ли она работать
будет.
Вот у меня такие 2 идеи.
четвёртая: сгенерировать начало конфига прямо внути скрипта используя <<
http://poplinux.ru/adv-bash/chapter-17.0.html#HERE-DOCS
(
cat <<EOF
# тут начало конфига
EOF
) >dhcp.conf
# теперь пишем новые строчки
Вобщем написал я скрипт, сколько мучился не спрашивайте :D Теперь возникла проблема, с которой у меня никак не получается разобраться самостоятельно. Скрипт работает так: он сканирует сеть по заданному IP-адресу и возвращает MAC-адрес и Имя машины, и просто дописывает к существующему списку нужные, а имеющиеся записи просто пропускает. Проблема в том, что "старые" записи не обновляются. В одном из постов drBatty писал про команду sed, может с помощью неё что получится?
Вот скрипт:
[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]
В одном из постов drBatty писал про команду sed, может с помощью неё что получится?
предположим, формат списка такой:
00:11:6b:93:f3:57 192.168.1.17т.е. в одной строчке сначала идёт МАК, потом один (это важно!) пробел, потом IP.
предположим так-же, что вы просканировали этот $IP и выяснили, что там новый $MAC. Что-бы сменить мак в списке, сделайте:
[console]sed "s/.* $IP$/$MAC $IP/" list.txt[/console]
Вот скрипт:
сделайте пожалуйста отступы нормальные - читать невозможно :(
(Hint: используйте специальные кодерские редакторы - консольный vim или гуёвую kate. Есть ещё 100500 разных).
Всем привет!
У меня вопрос похожего характера.
Внедряем в сеть DHCP
Установили DHCP на Ububtu 10.10
Необходим скрипт который бы сканировал сеть-сопоставлял мак адрес с ip адресами и резервировал их dhcp.conf
Это необходимо для того чтобы перевести все машины (их около 300) на DHCP постепенно
Потом (как я думаю) при добавлении новой машины в сеть можно зарезервировать ручками...
Прошу вашей помощи подсказок советов и т.д.
Скрипт предложенный warp хороший. но только он не умеет определять маки если у хоста нет имени (реализовать бы возможность добавлять произвольные, если имени нет) и не понимает если подсеть из маски 255.255.252.0 а только количества хостов которые уажешь сам
Необходим скрипт который бы сканировал сеть-сопоставлял мак адрес с ip адресами и резервировал их dhcp.conf
Это необходимо для того чтобы перевести все машины (их около 300) на DHCP постепенно
Потом (как я думаю) при добавлении новой машины в сеть можно зарезервировать ручками...
вообще-то DHCP сервер обычно сам этим занимается. Велосипед вы строите. :(
[quote=ramms]Необходим скрипт который бы сканировал сеть-сопоставлял мак адрес с ip адресами и резервировал их dhcp.conf
Это необходимо для того чтобы перевести все машины (их около 300) на DHCP постепенно
Потом (как я думаю) при добавлении новой машины в сеть можно зарезервировать ручками...
вообще-то DHCP сервер обычно сам этим занимается. Велосипед вы строите. :([/quote]
Ну подскажите пожалуйста как это сделать?
Блин, да поймите же, сервер dhcp настроен, необходимо ему зарезервировать все ip которые уже настроены у клиентов на статику, после этого включить раздачу пула, и новым машинам уже раздавать оставшийся диапозон, а после резервировать каждую новую подключенную.
Так как много машин и чтобы не забивать вручную нужен скрипт
ramms, собрать мак-адреса вы сможете только если у вас все устройства в одной подсети и сеть на коммутаторах. Через маршрутизатор вы не увидите мак. По крайней мере в скрипте.
С помощью nmap можно сканировать подсети на открытые порты, но он еще и мак устройства показывает. Посмотрите в этом направлении.
диапозон, а после резервировать каждую новую подключенную.
Так как много машин и чтобы не забивать вручную нужен скрипт
а...
дайте мне плз строчку из /var/log/message dhcp-server'а, в которой написано след: "клиент с маком хх:хх:хх:хх:хх получил IP х.х.х.х", и я вам покажу, как составить такой список. Потом этот список сунете в dhcpd.conf, и он этим макам будет давать их IP, а всем остальным - из пулла. А сколько всего маков для нас без разницы, 2 или 200.
Через маршрутизатор вы не увидите мак.
ну и что? за то их увидит маршрутизатор. Правда я не знаю, что с ним делать, ибо сервер увидит мак маршутизатора, а не клиента. В этом случае подойдёт IP по запросу DHCP-client'а. Естественно, сервер может ошибится, и дать чужой IP не тому. Но тут ничего уже не поделать... В смысле - сложно.
короче - данных о топологии мало
elve, Все верно все устройства в одной подсети, сеть на коммутаторах, программа у меня есть которая может сопоставить мак и ip (список маков и их ip уже готов). Дело не в этом. Я хочу себе максимально упростить работу, и хочу перевести машины со статики на DHCP. Чтобы это сделать, нужно:
1. Зарезервировать все существующие статические ip и их Маки в dhcp-сервере
2. С оставшегося пула адресов выдавать DHCP и при появлении новой машины резервировать это ручками(по крайней мере другого способа не вижу)
Тем самым резервирования делается для того, чтобы знать в каком месте находится машина.
Количество компов в сети около 300-350
Если забивать все в ручную это очень долго получится
Сам я не программист, конечно, писать скрипты не умею(что очень жаль).
warp- написал скрипт, красава, но он не подходит, так как берет запросы с нэтбиоса и сопоставления маков естественно не 100%, даже не 50%. Может как то можно его переделать?
1. Зарезервировать все существующие статические ip и их Маки в dhcp-сервере
список => конфиг
Это задача для sed. Ну или ручками, дело ваше.
2. С оставшегося пула адресов выдавать DHCP и при появлении новой машины резервировать это ручками(по крайней мере другого способа не вижу)
а это задача DHCP-server'а.
опять-таки - можно и в ручную.
Может как то можно его переделать?
да что там переделывать? у вас есть полный список мак/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 а всем остальным динамический из пула. Что ещё надо то?
ramms, если список с сопоставленными маком и ип есть, то скрипт написать можно =).
Алгоритм такой:
1. Берем строку из файла
2. Берем из строки ип, пишем в конфиг
3. Берем из строки мак, пишем в конфиг
4. Если строки не кончились, то переход к п.1
Пункты 2,3 можно реализовать с помощью echo и awk.
Остальное стандартными средствами bash.
Хотя сдается мне, что вы хотите не чтобы вам помогли, а чтобы за вас все сделали =).