Використання запуску для зміни MAC-адреси під час приєднання до певної мережі Wi-Fi


1

Я намагаюся використовувати launchd для вирішення вищезгаданого.

Я маю networkchange.plist файл наступним чином:

<?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>

Використання sudo launchctl load -w /Library/LaunchDaemons/networkchange.plist після перенесення його на це місце він виконує моє bash скрипт просто чудово, коли я перемикаю мережі Wi-Fi.

Мій 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

Моя проблема полягає в тому, що скрипт викликається нескінченно, оскільки він знову приєднується до мережі після зміни MAC-адреси. Я спробував вирішити цю проблему за допомогою "mutex" (як рекомендується) тут ), так що тільки один екземпляр цього сценарію може працювати одночасно, але так чи інакше він викликається постійно.

Як я можу вирішити цю проблему , так що скрипт не спрацьовує сам?


Наявність безперервного скрипту (знову і знову) відрізняється від використання мьютекса для запобігання паралельного виконання. Яку проблему ви намагаєтеся вирішити тут?
nohillside

Також я припускаю, що працює ifconfig змінить деякі файли, що переглядаються, що знову викликає скрипт.
nohillside

@patrix роз'яснив це питання. Безумовно, проблема полягає в тому, що скрипт спрацьовує сам. Я припустив, що launchd викликає скрипт, поки перший екземпляр все ще працює, і таким чином я спробував рішення mutex.
krispet krispet
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.