Internetfreigabe über ein Skript starten/stoppen?

Gibt es eine Möglichkeit, die Internetfreigabe über die Befehlszeile oder vielleicht ein Apple-Skript zu starten/stoppen?

Die Sache ist, dass ich meinen Laptop zwischen Zuhause und der Arbeit hin und her bewege. An einem Ort bekomme ich drahtloses Internet (und muss daher die Internetfreigabe deaktivieren), und an dem anderen bekomme ich Internet über ein Ethernet-Kabel und richte den Computer so ein, dass er das Internet für andere Geräte freigibt, indem ich ein kleines drahtloses Netzwerk erstelle.

Aber es wird ein bisschen mühsam, jedes Mal, wenn ich den Standort wechsele, in die Systemeinstellungen zu gehen und die Internetfreigabe zu starten / zu stoppen, also hätte ich gerne einen schnellen Befehl oder ein Skript, um den Wechsel bei Bedarf zu starten und durchzuführen.

Irgendwelche Hinweise oder Ideen?

Mankoff, wenn ich Ihren Vorschlag ausführe: sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.InternetSharing.plist scheint es gut zu laufen und sogar die Benutzeroberfläche für die Freigabeeinstellungen wird beim Aktualisieren korrekt aktualisiert, die Verbindung jedoch nicht Arbeiten. Wenn ich den Befehl erneut ausführe, schlägt er sogar fehl, weil er denkt, dass er bereits geladen ist. Wenn ich den Befehl "top" ausführe, um den laufenden Prozess zu sehen, sehe ich "InternetSharing" nicht, aber wenn ich ihn in der Benutzeroberfläche der Einstellungen starte, sehe ich, dass der Prozess "InternetSharing" tatsächlich ausgeführt wird und die Verbindung funktioniert. Irgendwelche Ideen, warum ich h bin
Nicht sicher, warum Sie dieses Verhalten bekommen. Ich sehe "InternetSharing" oben (oder einfacher, ps aux | grep -i internet ).
Ich verwende OS X 10.6. Wenn Sie eine andere Version haben, ist das vielleicht der Grund ...
Außerdem sollte dies wahrscheinlich ein Kommentar zu meiner Antwort sein, keine Antwort an sich. Vielleicht möchten Sie die Antwort löschen ...
Ja, sicherlich sollte dies ein Kommentar zu Ihrer Antwort sein, aber aus irgendeinem Grund kann ich ihre Antworten nicht kommentieren, es sei denn, jemand hat bereits einen Kommentar abgegeben. Vielleicht, weil ich ein neuer Benutzer bin. Ich verwende OS X 10.6.4. Eine andere Sache, die mir aufgefallen ist, ist, dass beim Start der Internetfreigabe in der Benutzeroberfläche der Einstellungen der Prozess natd (Network Address Translation Daemon) ebenfalls gestartet wird. Ich frage mich, ob ich diesen Prozess auch starten muss, und untersuche derzeit, wie das geht. Es scheint komplexe Argumente zu geben, die erforderlich sind, um diesen Prozess zu starten.
Mankoff, wenn Sie den Befehl ausführen, werden auch die anderen Prozesse gestartet, wie bootpd und natd? Diese Prozesse werden gestartet, wenn ich die Internetfreigabe über die GUI starte, aber keine Prozesse starten, wenn ich den Befehl ausführe. Ich fange an zu glauben, dass der Prozess abstürzt, weil die anderen Prozesse nicht vorhanden sind. Das würde auch erklären, warum die Internetfreigabe in der GUI überprüft wird, obwohl der Prozess tatsächlich nicht ausgeführt wird.
@MikeZ: Ich habe diese für dich in Kommentare umgewandelt. Da Sie noch nicht genug Reputation haben, um an allen Stellen auf der Website zu kommentieren, können Sie eine neue Frage erstellen und hoffentlich können Ihnen andere ebenso helfen wie mankoff. Dies wird Ihnen helfen, genug Reputation zu erlangen, um überall Kommentare zu posten. Weitere Informationen zu Reputation und Privilegien finden Sie unter apple.stackexchange.com/privileges .

Antworten (13)

So starten Sie die Internetfreigabe über die CLI:

sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.InternetSharing.plist

Um anzuhalten, wechseln Sie von Laden zu Entladen .

Beachten Sie, dass, wenn Sie das Pref-Fenster geöffnet haben, wenn Sie dies ausführen, die Änderung nicht sofort wirksam wird (die Benutzeroberfläche wird nicht aktualisiert), aber es funktioniert.

Seltsam, nach einer Weile funktionierte es nicht mehr. Wenn ich den Befehl ausführe und dann das Pref-Fenster öffne, sehe ich, dass die Freigabe aktiviert ist, die Verbindung jedoch nicht wirklich freigegeben wird. Wenn ich die Freigabe im Pref-Fenster manuell stoppe und starte, funktioniert es wieder ohne Probleme. Irgendwelche Hinweise, was falsch sein könnte?
Keine Ahnung warum, aber Sie können andere Antworten versuchen, sie könnten funktionieren ...
Das Rezept von Ken funktioniert! Aber ... es gibt einen Fehler (ich jage). Sie müssen eine 30-Sekunden-Verzögerung hinter unloadsich lassen, um einen loaderneuten Vorgang ausführen zu können. Ein guter Prüfbefehl ist ps ax | egrep '[ /](PID|boo|nat)'.
Funktioniert nicht auf 10.11.2 El Capitan:/System/Library/LaunchDaemons/com.apple.InternetSharing.plist: No such file or directory
versuche stattdessen: /System/Library/LaunchDaemons/com.apple.NetworkSharing.plist ;)
Da die Systemeinstellungs-App keine Authentifizierung erfordert, wie können wir dies tun, ohne sudo/root zu verwenden?
Scheint unloadnicht zu funktionieren, es sei denn, SIP wird entfernt (nichts, was ich gerne tun würde)…

Eine Möglichkeit, dies zu tun, ist das Erstellen von GUI-Skripten – die Systemeinstellungen haben standardmäßig keine Applescript-Unterstützung.

tell application "System Preferences" to set current pane to pane "com.apple.preferences.sharing"
delay 1
tell application "System Events" to tell process "System Preferences"
    click checkbox 1 of row 8 of table 1 of scroll area 1 of group 1 of window "Sharing" -- change to row 10 if you are using anything before Snow Leopard
    delay 1
    if (exists sheet 1 of window "Sharing") then
        click button "Start" of sheet 1 of window "Sharing"
    end if
end tell
ignoring application responses
    tell application "System Preferences" to quit
end ignoring
Vielleicht, aber es funktioniert und die Antwort liegt innerhalb der Einschränkungen der Frage des OP: "Gibt es eine Möglichkeit, die Internetfreigabe über die Befehlszeile oder vielleicht ein Apple-Skript zu starten / zu stoppen ?" Downvoting sollte man sich wirklich für die wirklich ungeheuerlichen Antworten sparen. Danke
Daher keine "offizielle" Ablehnung. :).
"funktioniert und liegt innerhalb der Grenzen" lässt mich denken, dass wir eine neue Website haben sollten: rubegoldberg.stackexchange.com
Ist thedailywtf.com nicht dafür da? ;-)
Ich habe meine akzeptierte Antwort darauf geändert, weil die ursprüngliche Antwort von Mankoff nicht mehr funktioniert.
@Juan: Auf welche Weise? Haben Sie Ihr Betriebssystem aktualisiert?
@Philip: Ich habe keine klare Vorstellung, aber es scheint mit einigen Upgrades des Betriebssystems zusammenzufallen. Ich hatte seit Januar einige Kommentare zur Antwort von mankoff hinzugefügt , aber erst jetzt hatte ich die Gelegenheit, das Problem ein wenig genauer zu untersuchen und meine Skripts zu ändern, um stattdessen Ihre Lösung zu verwenden.
@Juan: Seien Sie nur vorgewarnt, dass, wenn Apple das Layout der Systemeinstellungen und des Bereichs „Freigabe“ mit einem Upgrade ändert, mein Skript auch die echte potenzielle Unterbrechung hat, da das GUI-Skripting auf sehr strengen Parametern beruht.
Dies funktioniert gut unter macOS Sierra, aber mit einem Problem: Wenn ich versuche, es zu aktivieren, wenn die Systemeinstellungen geschlossen sind, erhalte ich diese Fehlermeldung: System Events got an error: Can’t get button "Start" of sheet 1 of window "Sharing" of process "System Preferences".Es funktioniert jedoch gut, wenn ich versuche, es zu deaktivieren. Das Lustige ist, wenn die Systemeinstellungen geöffnet sind und ich versuche, sie zu aktivieren, funktioniert es. Haben Sie eine Idee, warum das passieren würde?

Ich hatte weitaus bessere Ergebnisse (für ein bereits konfiguriertes Sharing-Setup) auf 10.11.6 mit den einfachen Variationen ...

sudo launchctl start com.apple.NetworkSharing

und

sudo launchctl stop com.apple.NetworkSharing

beziehungsweise.

Endgültige Problemumgehung für den ständigen Zusammenbruch der WLAN-Freigabe in MacosX

Ich habe ein System gefunden, das endlich funktioniert und wenn, weniger häufig, die WLAN-Freigabe unterbrochen wird, kann es es automatisch in einer Minute wiederherstellen.

Die Lösung ist ein ~/Library/LaunchAgents/com.me.wifisharingup.plistDaemon mit folgendem Inhalt:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>com.juanfal.wifisharingup</string>

  <key>ProgramArguments</key>
  <array>
    <string>/Users/mi/bin/wifisharingup.sh</string>
  </array>
  <key>Nice</key>
  <integer>1</integer>

  <key>StartInterval</key>
  <integer>60</integer>

  <key>RunAtLoad</key>
  <true/>

  <key>StandardErrorPath</key>
  <string>/Users/me/Library/Logs/wifisharingup.err</string>

  <key>StandardOutPath</key>
  <string>/Users/me/Library/Logs/wifisharingup.out</string>
</dict>
</plist>

Sie können sehen, dass jede Minute das folgende einfache Skript ausgeführt wird. Achten Sie darauf, dass die vorherige Plist dem Stamm gehört, und starten Sie sie mit:

sudo chown root com.me.wifisharingup.plist
sudo launchctl load /Users/me/Library/LaunchAgents/com.me.wifisharingup.plist

Das Skript, das jede Minute gestartet wird (vergessen Sie nicht, es ausführbar zu machen), lautet:

#!/bin/sh

if [[ ! `ipconfig getifaddr en1` ]]; then
    /usr/sbin/networksetup -setairportpower en1 off
    /usr/sbin/networksetup -setairportpower en1 on
    echo `date` >> "/Users/me/Library/Logs/wifisharingup.err"
else
    touch "/Users/me/Library/Logs/wifisharingup.out"
fi

Ich denke, der einfache periodische (jede Minute) Aufruf ipconfig getifaddr en1aktualisiert etwas in dem, was der WLAN-Sharing-Daemon ist. Was auch immer es ist, in jedem Moment, in dem die WLAN-Freigabe fehlschlägt, verliert sie die selbst zugewiesene IP-Adresse und schlägt dann ipconfig getifaddr en1fehl, sodass mein Skript das WLAN vollständig zurücksetzt, wodurch es seinen vorherigen Status wiederherstellt und die WLAN-Freigabe wiederherstellt.

Es funktioniert bisher seit Tagen in einem MacMini ohne Tastatur, Maus oder Monitor, sondern nur am Ethernet angeschlossen und verschafft meinen WLAN-Gadgets Zugang zur Welt.

Ich habe mich an Mankoffs Antwort orientiert und sie in ein AppleScript verpackt. Ich verwende dieses Skript von Automator, damit ich es einfach als Dienst verwenden und ihm eine Tastenkombination zuweisen kann.

Internetfreigabe umschalten:

register_growl()

try
    if isRunning("InternetSharing") then
        do shell script "launchctl unload -w /System/Library/LaunchDaemons/com.apple.InternetSharing.plist" with administrator privileges

        if isRunning("InternetSharing") then
            error "Internet Connection Sharing was Not Disabled"
        else
            my growlnote("Success", "Internet Connection Sharing Disabled")
        end if

    else
        do shell script "launchctl load -w /System/Library/LaunchDaemons/com.apple.InternetSharing.plist" with administrator privileges

        if isRunning("InternetSharing") then
            my growlnote("Success", "Internet Connection Sharing Enabled")
        else
            error "Internet Connection Sharing was Not Enabled"
        end if

    end if

on error errMsg
    my growlnote("Error", errMsg)

end try

on isRunning(processName)
    try
        return 0 < length of (do shell script "ps ax | grep -v grep | grep " & processName)
    on error
        return false
    end try
end isRunning

on register_growl()
    try
        tell application "GrowlHelperApp"
            set the notificationsList to {"Success", "Warning", "Error"}
            register as application "Toggle Internet Connection Sharing" all notifications notificationsList default notifications notificationsList icon of application "Sharing"
        end tell
    end try
end register_growl

on growlnote(growltype, str)
    try
        tell application "GrowlHelperApp"
            notify with name growltype title growltype description str application name "Toggle Internet Connection Sharing"
        end tell
    end try
end growlnote
Funktioniert bei mir nicht wirklich auf Lion. Es zeigt die Growl-Erfolgsmeldung an und schaltet die Option in den Systemeinstellungen um, aber das WLAN-Symbol ändert sich nicht zum Teilen (und andere Geräte können nicht sehen, dass das WLAN geteilt wird, also denke ich, dass es nicht eingeschaltet ist :(

Ich verwende das folgende Skript, um die Internetfreigabe auf einem MacBook Pro von Anfang 2011 / 10.11.3 El Capitan umzuschalten, sodass Sie mit neuerer Hardware möglicherweise mit kürzeren Verzögerungen davonkommen. Es übernimmt Ideen aus mehreren Skripten, die zu diesem Zweck veröffentlicht wurden (Lokalisierung, WLAN ein-/ausschalten mit networksetup, schließen, System Preferenceswenn fertig).

tell application "System Preferences"
    activate
    reveal (pane id "com.apple.preferences.sharing")
    set localized_window to the localized name of the current pane
end tell

tell application "System Events" to tell process "System Preferences"
    delay 1
    repeat with r in rows of table 1 of scroll area 1 of group 1 of window localized_window
        if (value of static text of r as text) starts with "Internet" then
            set sharingBool to value of checkbox of r as boolean
            select r
            if sharingBool is true
              do shell script "/usr/sbin/networksetup -setairportpower en1 off"
            else
              do shell script "/usr/sbin/networksetup -setairportpower en1 on"
            end if
            click checkbox of r
        end if
    end repeat
    delay 1

    if (exists sheet 1 of window localized_window) then
      click button "Start" of sheet 1 of window localized_window
    end if

end tell

ignoring application responses
  tell application "System Preferences" to quit
end ignoring

Der wirklich einfache Weg, dies zu tun, besteht darin, die Antwort von @Philip mit der NetworkLocation - Anwendung zu kombinieren. NL kann erkennen, wo Sie sich befinden, und automatisch ein AppleScript ausführen, wenn es feststellt, dass Sie den Standort gewechselt haben.

Ich denke, es ist eine erforderliche Software, wenn Sie einen Laptop haben – ansonsten ist es eine PITA, immer mehrere Einstellungen manuell zurücksetzen zu müssen, wenn ich den Standort wechsele.

Klingt wie Marco Polo ( symonds.id.au/marcopolo ), aber ohne die Marco-Polo-Steroide. :)
@Ian - Auf dieser Seite steht, dass MP bekannte Probleme mit Snow Leopard hat. Die Google Group sagt: "Das MarcoPolo-Projekt ist per se nicht tot, aber es entwickelt sich sehr langsam. Erwarten Sie nicht bald eine neue Version." Das Git-Repository zeigt kein Update seit September 2009. Klingt für mich so, als würden die Steroide jemanden einholen… ;-)
Ich kann nicht sagen, dass ich irgendwelche Probleme damit auf SL hatte , außer für BlueTooth. Ich verwende die BT-Aktivierungs- / Deaktivierungs- / Erkennungsfunktion einfach nicht und sie funktioniert ziemlich hervorragend. (Aber Punkt genommen)

Etwas anders als das andere gepostete Applescript (ich denke auf eine bessere Art, aber …). Optionen zu haben kann manchmal helfen.

 tell application "System Preferences"
   activate
   reveal (pane id "com.apple.preferences.sharing")
 end tell

 tell application "System Events"
   tell process "System Preferences"
     try
       click checkbox of row 11 of table 1 of scroll area of group 1 of window "Sharing"

       if checkbox of row 11 of table 1 of scroll area of group 1 of window "Sharing" is equal to 1 then
         repeat until sheet of window 1 exists
           delay 0.5
         end repeat
       end if

       if (sheet of window 1 exists) then
         click button "Start" of sheet of window 1
       end if

       tell application "System Preferences" to quit
       activate (display dialog "Internet Sharing preferences sucessfully flipped")

     on error     
       activate
       display dialog "something went wrong in automation but you are probably in the right menu…"
       return false
     end try
   end tell
 end tell

Da die zuvor gepostete GUI-Scripting-Lösung erfordert, dass internationale Benutzer die Fenster- und Schaltflächennamen anpassen, habe ich eine Version entwickelt, die mit jeder Systemsprache funktioniert. Es funktioniert auch für die andere Freigabeoption und gibt lokalisiertes Feedback zum Freigabestatus. Ich verwende darauf basierend zwei verschiedene Automator-Dienste, einen zum Umschalten der Dateifreigabe und einen zum Umschalten der Internetfreigabe.

tell application "System Preferences"
    set current pane to pane "com.apple.preferences.sharing"
    set localized_window to the localized name of the current pane
    set localized_app to (localized string "System Preferences")
    set localized_ok to {localized string "OK"} -- File sharing
    set localized_start to {localized string "START"} -- Internet sharing
end tell
delay 0.3
tell application "System Events"
tell process "System Preferences"
    click checkbox 1 of row 8 of table 1 of scroll area 1 of group 1 of window localized_window
    delay 0.2
    select row 8 of table 1 of scroll area 1 of group 1 of window localized_window
    -- change row numbers to the service you want toggled
    if (exists sheet 1 of window localized_window) then
        try
            click button (localized_ok as string) of sheet 1 of window localized_window
        on error
            click button (localized_start as string) of sheet 1 of window localized_window
        end try
    end if
    set sharing_state to the value of item 1 of static text of group 1 of window localized_window
end tell

tell application "System Preferences" to quit
display notification sharing_state with title localized_app
--  display notification exists since OS 10.9, for older systems use: 
--  display dialog sharing_state buttons {localized_ok} default button 1 with title localized_app giving up after 1.5
end tell

Vor/nach jeder Konfiguration müssen die an der Freigabe beteiligten Schnittstellen aus-/eingeschaltet werden mit:

networksetup -setairportpower en1 off

dann weiter. ( networksetup -setairportpower en1 on)

Mein WLAN wurde als aufgeführt en1, um Ihres zu suchen networksetup -listnetworkserviceorder. Genauer gesagt, wenn Sie mit der Internetfreigabe beginnen, müssen Sie eine detailliertere NAT-Funktionalität hinzufügen und dann nur das aktivierte Bit setzen.

NAT wird mit Bit ein-/ausgeschaltet: -int 0= aus -int 1= ein

Das einzige, was mit geschrieben /Library/Preferences/SystemConfiguration/com.apple.nat.plistist

defaults write /Library/Preferences/SystemConfiguration/com.apple.nat\
    NAT -dict Enabled -int 0

ist

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>NAT</key>
        <dict>
                </dict>
                <key>Enabled</key>
                <integer>1</integer>
        </dict>
</dict>
</plist>

Sie müssen Ihre Plist-Datei so ändern, dass sie wie folgt aussieht:

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>NAT</key>
        <dict>
                <key>AirPort</key>
                <dict>
                        <key>40BitEncrypt</key>
                        <integer>1</integer>
                        <key>Channel</key>
                        <integer>0</integer>
                        <key>Enabled</key>
                        <integer>0</integer>
                        <key>NetworkName</key>
                        <string>FancyHostNome</string>
                        <key>NetworkPassword</key>
                        <data>
                        </data>
                </dict>
                <key>Enabled</key>
                <integer>1</integer>
                <key>NatPortMapDisabled</key>
                <false/>
                <key>PrimaryInterface</key>
                <dict>
                        <key>Device</key>
                        <string>en4</string>
                        <key>Enabled</key>
                        <integer>0</integer>
                        <key>HardwareKey</key>
                        <string></string>
                        <key>PrimaryUserReadable</key>
                        <string>InfiniBand</string>
                </dict>
                <key>PrimaryService</key>
                <string>XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX</string>
                <key>SharingDevices</key>
                <array>
                        <string>en1</string>
                </array>
        </dict>
</dict>
</plist>

Wie Sie sehen können, muss meine Plist-NAT-Datei möglicherweise etwas an Ihre Bedürfnisse angepasst werden.

Vielleicht möchten Sie sich diese (möglicherweise Off-Topic für Stack Overflow) Frage und ihre Antwort ansehen: How to start/stop Internet Sharing using AppleScript .

do shell script "/bin/launchctl load -w /System/Library/LaunchDaemons/com.apple.InternetSharing.plist" with administrator privileges

Eines der obigen Skripte geändert, um die Internetfreigabe auf OSX MOJAVE (10.14) umzuschalten, es funktioniert:

tell application "System Preferences"
    activate
    reveal (pane id "com.apple.preferences.sharing")
    delay 0.3
    set current pane to pane "com.apple.preferences.sharing"
    delay 0.3
    set localized_window to the localized name of the current pane
    set localized_app to (localized string "System Preferences")
    set localized_ok to {localized string "OK"} -- File sharing
    set localized_start to {localized string "START"} -- Internet sharing
end tell
delay 0.3
tell application "System Events"
    tell process "System Preferences"
        click checkbox 1 of row 7 of table 1 of scroll area 1 of group 1 of window localized_window
        delay 0.2
        select row 8 of table 1 of scroll area 1 of group 1 of window localized_window
        -- change row numbers to the service you want toggled
        if (exists sheet 1 of window localized_window) then
            try
                click button (localized_ok as string) of sheet 1 of window localized_window
            on error
                click button (localized_start as string) of sheet 1 of window localized_window
            end try
        end if
        set sharing_state to the value of item 1 of static text of group 1 of window localized_window
    end tell
    
    tell application "System Preferences" to quit
    display notification sharing_state with title localized_app
    --  display notification exists since OS 10.9, for older systems use: 
    --  display dialog sharing_state buttons {localized_ok} default button 1 with title localized_app giving up after 1.5
end tell
/usr/bin/defaults write /Library/Preferences/SystemConfiguration/com.apple.nat NAT -dict Enabled -int 0
Schaltet dies die Freigabe um?