Estoy tratando de usar launchd para resolver lo mencionado anteriormente.
Tengo un archivo networkchange.plist
de la siguiente manera:
<?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>
Al usar sudo launchctl load -w /Library/LaunchDaemons/networkchange.plist
después de moverlo a su lugar, ejecuta mi script bash muy bien cuando cambio las redes Wi-Fi.
Mi script networkchangeaction.sh
:
#!/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
Mi problema es que el script se llama infinitamente ya que vuelve a unirse a la red después de cambiar la dirección MAC. Intenté resolver esto con un "mutex" (como se recomienda aquí ), para que solo pueda ejecutarse una instancia de este script en una vez, pero de alguna manera todavía se llama continuamente.
¿Cómo podría resolver este problema para que el script no se active por sí solo?