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?

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 .


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.


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.


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.