Sto cercando di usare launchd per risolvere il problema sopra menzionato.
Ho un file networkchange.plist
come segue:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" \
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>NetworkChange</string>
<key>LowPriorityIO</key>
<true/>
<key>ProgramArguments</key>
<array>
<string>*some path*/networkchangeaction.sh</string>
</array>
<key>WatchPaths</key>
<array>
<string>/etc/resolv.conf</string>
<string>/var/run/resolv.conf</string>
<string>/private/var/run/resolv.conf</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
Usando sudo launchctl load -w /Library/LaunchDaemons/networkchange.plist
dopo averlo spostato nella sua posizione, esegue correttamente il mio script bash quando cambio le reti Wi-Fi.
Il mio networkchangeaction.sh
script:
#!/bin/bash
lock="/tmp/networkchange.lock"
triggerssid="someSSID"
macaddress="7c:c5:d7:f2:09:23"
ssid=$(networksetup -getairportnetwork en0 | awk -F": " '{print $2}')
if mkdir "$lock"; then # my attempt at solving the infinite call loop
trap 'sudo rm -rf "$lock"' 0 # $lock is kinda like a mutex
if [ "$ssid" == "$triggerssid" ]; then
sudo ifconfig en0 ether $macaddress # change MAC address
sudo ifconfig en0 down # restart wifi interface
sudo ifconfig en0 up
sleep 2 # wait for it to restart, then join $triggerssid
sudo networksetup -setairportnetwork en0 $triggerssid *wifi wpa2*
fi
else
exit 0
fi
Il mio problema è che lo script è chiamato infinitamente quando si ricongiunge alla rete dopo aver cambiato l'indirizzo MAC. Ho provato a risolverlo con un "mutex" (come raccomandato qui ), in modo che solo un'istanza di questo script possa essere eseguita su un tempo, ma in qualche modo viene ancora chiamato continuamente.
Come potrei risolvere questo problema , in modo che lo script non si attivi da solo?