Ponekad nam je u scriptama potrebno znati u kojoj smo mrezi, da li smo sa laptopom kod kuce, na poslu ili u kafiću. Detekcija nije previshe komplikovana, ali ako želimo proveriti sve mogućnosti onda to već nije jedna komanda. Sa WIFIem je relativno jednostavno ali ako detektujete i ethernet konekciju onda to još dodatko komplikuje situaciju.
Meni je pre jednog godinu dana bilo potrebno da mogu da radim predprocesiranje ssh config fajla kako bih mogao da podesim IP adrese servera zavisno da li sam u LANu u jednoj firmi ili u drugoj ili kod kuće. Pa sam napakovao scriptu koja pokušava da detektuje sve situacije i korisniku dostavi jednostavan string iz koga grepom može da proveri skoro sve mogucnosti u samo par linija.
#!/bin/bash
# Fake ifupdown environment
export IFACE="$1"
export LOGICAL="$1"
[ "$2" != 'up' ] && exit 0
[ "$IFACE" != "lo" ] || exit 0
(
IPADDR=$(/sbin/ifconfig $IFACE | sed -e '/inet addr:/!d;s/^.*inet addr:\([0-9\.]\+\) .*$/\1/')
ESSID=$(/sbin/iwconfig $IFACE 2> /dev/null | sed -e '/ESSID:/!d;s/^.*ESSID:"\([^"]*\)".*$/\1/')
APMAC=$(/sbin/iwconfig $IFACE 2> /dev/null | sed -e '/Access Point:/!d;s/^.*Access Point:\s*\(.*\)\s*$/\1/' -e 's/\s*$//' | tr 'A-Z' 'a-z')
GATEWAY=$(/sbin/route -n | egrep '^0\.0\.\0\.0 ' | sed -e 's/ \+/ /g' | cut -d ' ' -f 2)
GATEWAYMAC=""
if ping -n -w 3 -c 3 $GATEWAY > /dev/null 2>&1; then
GATEWAYMAC=$(/usr/sbin/arp -n $GATEWAY | tail -1 | sed -e 's/ \+/ /g' | cut -d ' ' -f 3 | sed -e '/^[A-Za-z0-9:]\+$/!d' | tr 'A-Z' 'a-z')
fi
CONNPARM=";IPADDR=${IPADDR};ESSID=${ESSID};APMAC=${APMAC};GATEWAY=${GATEWAY};GATEWAYMAC=${GATEWAYMAC};"
sudo -u zsteva bash -c "echo '${CONNPARM}' > /home/zsteva/.connparam"
) &
exit 0
U liniji sudo -u treba zameniti svoj username i lokaciju gde će nam se nalaziti connparam fajl, u kojem će biti snimljeni parametri koje kasnije možemo gde god nam je potrebno da iskoristimo. A samu scriptu postaviti u /etc/NetworkManager/dispatcher.d/ kako bi je NetworkManager pozvao kad se nakačimo na neku mrežu.
U .connparam fajlu završi linija nalik:
;IPADDR=192.168.1.152;ESSID=HG532e-1EFF19;APMAC=4c:8b:ef:06:d9:d8;GATEWAY=192.168.1.1;GATEWAYMAC=4c:8b:ef:06:d9:d2;
Običnim case blokom u bash-u možemo proveriti bilo koji elemenat u ovoj liniji i tako prepoznati mrežu u kojoj smo.
Primer:
CONNPARAM=$(cat ~/.connparam)
(
case "$CONNPARAM" in
*\;ESSID=wifi.yyy\;*)
echo "#define LOC_LOC4 1"
echo "#define LOC_LOC5 1"
;;
*\;ESSID=wifi.xxx\;*)
echo "#define LOC_LOC1 1"
;;
*\;GATEWAYMAC=11:22:33:44:55:66\;*)
echo "#define LOC_LOC2 1"
;;
esac
cat ~/.ssh/config_template
) | cpp > ~/.ssh/config
Ovo je primer kojim predprocesiram ssh config template fajl.