Имеем dhcp-relay. Сервер имеет ip:10.99.215.7. Шлюз имеет: 10.99.200.11. Клиент с dhcp получает 10.99.100.10/32. Задача: получить сетевой интерфейс за которым скрывается клиент. На данный момдет она решается так:
LANDEV=$(arp -n|grep $ETHER|gawk '{print $5}')
Единственное, это конструкция периодически лагает, потому то необходимо чтобы этот mac был в arp. Как обойтись без arp?
Полный код скрипта:
root@debian-01:~# cat /srv/cgi/cgi-bin/ip.cgi
#!/bin/bash
# Global script param
# RTABLE=100
# LANDEV=eth1
PROTO=dhcp
# Header to WWW
echo "Content-Type: text/html"
echo ""
# Internal parametrs (no change)
PASSKEY_1=/srv/cgi/passkey
CMD_LINE=$(echo $QUERY_STRING|tr '&' ' ')
ACTION=$(echo $CMD_LINE|gawk '{print $1}')
ADDR=$(echo $CMD_LINE|gawk '{print $2}')
# PASSKEY=$(echo $CMD_LINE|gawk '{print $3}')
ETHER=$(echo $CMD_LINE|gawk '{print $3}')
PASSKEY=$(echo $CMD_LINE|gawk '{print $4}')
PASSKEY_LD=$(cat $PASSKEY_1)
# Getting interface data
LANDEV=$(arp -n|grep $ETHER|gawk '{print $5}')
# Chack passkey
if [ "$PASSKEY_LD" == "$PASSKEY" ]
then
# Setup to action
case $ACTION in
# Add route
ADD)
ip route add $ADDR dev $LANDEV proto $PROTO
# Check state from ip route add
if [ "$?" -eq "0" ]
then
STATE=SUCCESS
else
STATE=FAIL
fi
;;
# Remove route
DEL)
ip route del $ADDR proto $PROTO # dev $LANDEV
# Check state from ip route del
if [ "$?" -eq "0" ]
then
STATE=SUCCESS
else
STATE=FAIL
fi
;;
# Exit
esac
else
# State to invalid
STATE=INVALID_PKEY
fi
# Display internal state
echo "IPROUTE: ACTION=$ACTION HOST=$ADDR ETHER=$ETHER STATE=$STATE"
# End
dhcp сервером запускается скрипт, который через curl отправляет данные на роутер.