Starten / Stoppen der Internetfreigabe von einem Skript aus?

21

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

Die Sache ist, dass ich mich mit meinem Laptop zwischen zu Hause und der Arbeit bewege. An einem Ort erhalte ich kabelloses Internet (und daher muss ich die Internetfreigabe deaktivieren) und am anderen erhalte ich das Internet über ein Ethernet-Kabel und richte den Computer so ein, dass das Internet für andere Geräte freigegeben wird, indem ein kleines kabelloses Netzwerk erstellt wird.

Es wird jedoch etwas langweilig, die Systemeinstellungen aufzurufen und die Internetfreigabe bei jedem Standortwechsel zu starten / zu stoppen. Daher hätte ich gerne einen schnellen Befehl oder ein Skript, um die Systemeinstellungen bei Bedarf zu starten und zu ändern.

Irgendwelche Tipps oder Ideen?

Juan A. Navarro
quelle
Mankoff, wenn ich Ihren Vorschlag mache: sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.InternetSharing.plist es scheint gut zu laufen und sogar die GUI der Freigabeeinstellungen wird korrekt aktualisiert, wenn sie aktualisiert wird, jedoch ist die Verbindung tatsächlich 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 zu sehen, ob der Prozess ausgeführt wird, wird "InternetSharing" nicht angezeigt. Wenn ich ihn jedoch in den Einstellungen starte, wird der "InternetSharing" -Prozess tatsächlich ausgeführt 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 ...
Auch sollte dies wahrscheinlich ein Kommentar zu meiner Antwort sein, keine Antwort an sich.
Ja, sicherlich sollte dies ein Kommentar zu Ihrer Antwort sein, aber aus irgendeinem Grund kann ich dort keine Kommentare abgeben, 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 der Prozess natd (Network Address Translation Daemon) ebenfalls gestartet wird, wenn ich die Internetfreigabe in der Einstellungs-GUI starte. Ich frage mich, ob ich diesen Prozess auch starten muss. Derzeit wird untersucht, wie dies zu tun ist. Es scheint komplexe Argumente zu geben, die erforderlich sind, um diesen Prozess zu starten.

Antworten:

19

So starten Sie die Internetfreigabe über die CLI:

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

Ändern Sie zum Stoppen die Ladung in Entladen .

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


quelle
Seltsam, nach einer Weile hörte es auf zu funktionieren. Wenn ich den Befehl ausführe und dann den Einstellungsbereich öffne, wird angezeigt, dass die Freigabe aktiviert ist, die Verbindung jedoch nicht tatsächlich freigegeben wird. Wenn ich die Freigabe im Einstellungsfenster manuell stoppe und starte, funktioniert sie wieder ohne Probleme. Irgendwelche Hinweise, was falsch sein könnte?
Juan A. Navarro
2
Das Rezept von Ken funktioniert! Aber ... es gibt einen Bug (ich bin auf der Jagd). Sie müssen eine Verzögerung von 30 Sekunden einhalten unload, um einen loaderneuten Vorgang durchführen zu können . Ein guter Prüfbefehl ist ps ax | egrep '[ /](PID|boo|nat)'.
Dan
1
Funktioniert nicht am 10.11.2 El Capitan:/System/Library/LaunchDaemons/com.apple.InternetSharing.plist: No such file or directory
Yohaï Berreby
3
Versuchen Sie stattdessen: /System/Library/LaunchDaemons/com.apple.NetworkSharing.plist;)
guerrerocarlos
1
Da die App "Systemeinstellungen" keine Authentifizierung erfordert, wie können wir dies ohne Verwendung von sudo / root tun?
Michele Dall'Agata
4

Eine Möglichkeit hierfür ist das Erstellen von GUI-Skripten: In den Systemeinstellungen wird standardmäßig kein Applescript unterstützt.

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
Philip Regan
quelle
3
Vielleicht, aber es funktioniert und die Antwort ist innerhalb der Grenzen der Frage des OP: „Gibt es eine Möglichkeit Start / Stopp - Internet - Sharing von der Kommandozeile oder vielleicht ein Apfel Skript ?“ Downvoting sollte wirklich für die wirklich ungeheuren Antworten gespeichert werden. Vielen Dank
Philip Regan
1
Daher keine "offizielle" Ablehnung. :).
2
"funktioniert und befindet sich innerhalb von Beschränkungen" lässt mich denken, dass wir eine neue Website haben sollten: rubegoldberg.stackexchange.com
2
Ist das nicht das, wofür thedailywtf.com ist? ;-)
Philip Regan
1
@ Juan: Seien Sie nur gewarnt, dass wenn Apple das Layout der Systemeinstellungen und des Freigabebereichs durch ein Upgrade ändert, mein Skript auch das echte Potenzial hat, da GUI-Skripte auf sehr strengen Parametern beruhen.
Philip Regan
2

Ich habe mich an Mankoffs Antwort orientiert und sie in ein AppleScript eingepackt. Ich verwende dieses Skript von Automator, damit ich es einfach als Dienst verwenden und ihm eine Tastenkombination geben 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
Prestaul
quelle
Arbeitet nicht wirklich an Lion für mich. Es zeigt die Growl-Erfolgsmeldung an und schaltet die Option in den Systemeinstellungen um, aber das WiFi-Symbol ändert sich nicht in die Freigabe (und andere Geräte können nicht sehen, dass das WiFi freigegeben ist, also denke ich, dass es nicht eingeschaltet ist :(
alopix
2

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

sudo launchctl start com.apple.NetworkSharing

und

sudo launchctl stop com.apple.NetworkSharing

beziehungsweise.

alex grau
quelle
1

Endgültige Problemumgehung für die ständige Unterbrechung der WLAN-Nutzung in MacosX

Ich habe ein System gefunden, das endlich funktioniert und das es schafft, es automatisch in einer Minute wiederherzustellen, wenn die WLAN-Freigabe seltener unterbrochen wird.

Die Lösung ist ein ~/Library/LaunchAgents/com.me.wifisharingup.plistDaemon mit dem nächsten 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 Liste der Root 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, die einfache periodische (jede Minute) Aufforderung, ipconfig getifaddr en1etwas in dem Wifi-Sharing-Daemon zu aktualisieren. Was auch immer es ist, sobald die WLAN-Freigabe fehlschlägt, verliert es die selbst zugewiesene IP-Adresse und ipconfig getifaddr en1schlägt dann fehl, sodass mein Skript das WLAN vollständig zurücksetzt, so dass es seinen vorherigen Status wiederherstellt und die WLAN-Freigabe wiederherstellt.

Es funktioniert seit Tagen in einem MacMini ohne Tastatur, Maus oder Monitor, ist jedoch nur an das Ethernet angeschlossen und ermöglicht meinen WLAN-Geräten den Zugriff auf die Welt.

Juanfal
quelle
0

Die einfachste Möglichkeit besteht darin, die Antwort von @ Philip mit der NetworkLocation- Anwendung zu kombinieren . NL erkennt, wo Sie sich befinden, und führt automatisch ein AppleScript aus, wenn festgestellt wird, dass Sie den Standort geändert haben.

Ich denke, es ist Software erforderlich, wenn Sie einen Laptop haben - ansonsten ist es ein PITA, immer mehrere Einstellungen manuell zurücksetzen zu müssen, wenn ich den Standort ändere.

Dori
quelle
Klingt nach Marco Polo ( symonds.id.au/marcopolo ), aber ohne die Steroide von Marco Polo. :)
Ian C.
@ Ian - Auf dieser Seite heißt es, dass MP Probleme mit Snow Leopard hat. Die Google-Gruppe sagt, "das MarcoPolo-Projekt ist per se nicht tot, aber es wird sehr langsam entwickelt. Erwarten Sie keine baldige neue Version." Das Git-Repository zeigt kein Update seit September 2009. Klingt für mich so, als würden die Steroide jemanden einholen ... ;-)
Dori
Ich kann nicht sagen, dass ich Probleme mit SL hatte , abgesehen von BlueTooth. Ich benutze die BT-Aktivierungs- / Deaktivierungs- / Erkennungsfunktion einfach nicht und sie funktioniert ziemlich brillant. (Aber Punkt getroffen)
Ian C.
0

Etwas anders als das andere veröffentlichte Applescript (ich denke besser, aber ...). Optionen können 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
Dori
quelle
0

Da für die zuvor veröffentlichte GUI-Skriptlösung internationale Benutzer die Namen von Fenstern und Schaltflächen anpassen müssen, habe ich eine Version entwickelt, die mit jeder beliebigen Systemsprache funktioniert. Es funktioniert auch für die andere Freigabeoption und gibt lokalisiertes Feedback zum Freigabestatus. Darauf aufbauend verwende ich 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
r0mer0
quelle
0

Vor / nach jeder Konfiguration müssen die Schnittstelle (n), die an der Freigabe beteiligt sind, mit den folgenden Schritten aktiviert / deaktiviert werden:

networksetup -setairportpower en1 off

dann weiter. ( networksetup -setairportpower en1 on)

Mein WLAN wurde als aufgeführt en1, um Ihre Nutzung nachzuschlagen networksetup -listnetworkserviceorder. Um es auf den Punkt zu bringen, müssen Sie beim Starten der Internetfreigabe detailliertere NAT-Funktionen hinzufügen und dann nur das aktivierte Bit setzen.

NAT wird mit bit: -int 0= off -int 1= on ein- / ausgeschaltet

Das einzige, was /Library/Preferences/SystemConfiguration/com.apple.nat.plistmit eingeschrieben ist

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 folgendermaßen ändern:

<!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 ein wenig an Ihre Bedürfnisse angepasst werden.

Paul
quelle
0

Ich verwende das folgende Skript, um die Internetfreigabe auf einem MacBook Pro / 10.11.3 El Capitan von Anfang 2011 umzuschalten, sodass Sie mit neuerer Hardware möglicherweise mit kürzeren Verzögerungen davonkommen. Es übernimmt Ideen aus mehreren Skripten, die für diesen Zweck veröffentlicht wurden (Lokalisierung, Aktivieren / Deaktivieren von WLAN mit networksetup, Schließen, System Preferenceswenn dies abgeschlossen ist).

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
Bernhard Wagner
quelle
0

Vielleicht möchten Sie sich diese (möglicherweise nicht zum Thema Stack Overflow gehörende) Frage und ihre Antwort ansehen: So starten / stoppen Sie die Internetfreigabe mit AppleScript .

do shell script "/bin/launchctl load -w /System/Library/LaunchDaemons/com.apple.InternetSharing.plist" with administrator privileges
Martin Marconcini
quelle
-1
/usr/bin/defaults write /Library/Preferences/SystemConfiguration/com.apple.nat NAT -dict Enabled -int 0
Jason Bush
quelle
Schaltet dies das Teilen um?
Greenonline