Wie führen Sie ein Skript aus, nachdem eine Netzwerkschnittstelle aufgerufen wurde?

7

Gibt es eine Möglichkeit, ein Skript jedes Mal auszuführen, wenn eine Netzwerkschnittstelle fertig ist? Oder gibt es eine gleichwertige Antwort auf diese Debian-Frage unter OSX?

Matt
quelle

Antworten:

1

Ich habe diese Lösung noch nicht selbst ausprobiert, aber diesen Thread gefunden: /superuser/201478/run-script-in-os-x-10-6-on-network-connection-like -etc-network-if-up-d / 261004 # 261004

Sie sollten die Verwendung von crankd in Betracht ziehen , mit der Sie Skripts genau als Reaktion auf viele Systemereignisse wie Netzwerkänderungen, Dateisystemaktivität, Anwendungsstart usw. ausführen können.

Da ich keine vernünftige Dokumentation finden konnte, schrieb ich auch einen kleinen Blog-Beitrag über die ersten Schritte mit crankd .

Rene Larsen
quelle
Ich habe den Stackoverflow und die Googles überprüft, bin aber im Superuser nicht vorgekommen. Egal, das ist es! Vielen Dank.
Matt
"Erste Schritte mit Crankd" wurde auf nokyotsu.com/qscripts/2011/03/…
RobM
9

Das Folgende funktioniert unter Mac OS X 10.11.3 (El Capitan)

Erstellen Sie eine Datei: 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>/Users/Shared/bin/networkchange.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>

Und registrieren Sie es mit:

launchctl load networkchange.plist
launchctl start networkchange

Beachten Sie, dass das Skript von dem Benutzer ausgeführt wird, der die Liste registriert.

Laurent
quelle
Die einzige Zeile wird benötigt. <string>/private/var/run/resolv.conf</string>Andere sind nur Symlinks zu /private/var/run/resolv.conf.
IGHOR
7

Ein Launchd Agent /etc/resolv.conf, der sich umschaut, und zwei netzwerkbezogene .plist-Dateien unter /Library/Preferences/SystemConfiguration/scheinen für mich zu funktionieren (in Mac OS X 10.8.4):

<?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>ifup.ddns</string>

  <key>LowPriorityIO</key>
  <true/>

  <key>ProgramArguments</key>
  <array>
    <string>/Users/Shared/bin/ddns-update.sh</string>
  </array>

  <key>WatchPaths</key>
  <array>
    <string>/etc/resolv.conf</string>
    <string>/Library/Preferences/SystemConfiguration/NetworkInterfaces.plist</string>
    <string>/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist</string>
  </array>

  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>

Ich hatte vorher nur /etc/resolv.conf verwendet, aber es gab Fälle, in denen das nicht genug war.

mivk
quelle
watch on /Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plistarbeitet für mich am neuesten MBP mit Sierra. Vielen Dank!
Petr Újezdský
2

Ich habe dieses Skript erhalten:

#!/bin/bash

COUNTER=0
while [ $COUNTER -lt 10 ]; do
    let COUNTER=COUNTER+1

    # assign to test at each iteration otherwise the output won't be changed
    test=$(ifconfig -a inet 2>/dev/null | sed -n -e '/127.0.0.1/d' -e '/0.0.0.0/d' -e '/inet/p' | wc -l)

    if [ "${test}" -gt 0 ]; then
        # do the job here

        # exit the loop
        let COUNTER=COUNTER+10
        break
    fi

    # give a little time for a network to get up
    sleep 2
done

Es überprüft ein Netzwerk 10 Mal und das Netzwerk hat 2 * 10 Sekunden Zeit, um aufzustehen.

hsrv
quelle