Usando launchd per cambiare l'indirizzo MAC quando si entra in una specifica rete Wi-Fi

1

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?

    
posta krispet krispet 16.02.2017 - 21:52
fonte

0 risposte

Leggi altre domande sui tag