Démarrer / arrêter le partage Internet à partir d'un script?

21

Existe-t-il un moyen de démarrer / arrêter le partage Internet à partir de la ligne de commande ou peut-être d'un script Apple?

Le truc, c'est que je déplace mon ordinateur portable entre la maison et le travail. À un endroit, j'obtiens Internet sans fil (et donc je dois désactiver le partage Internet), et à l'autre, j'obtiens Internet à partir d'un câble Ethernet et configure l'ordinateur pour partager Internet avec d'autres appareils en créant un petit réseau sans fil.

Mais cela devient un peu fastidieux de devoir aller dans les Préférences Système et de démarrer / arrêter le partage Internet chaque fois que je change d'emplacement, donc je voudrais avoir une commande ou un script rapide pour lancer et faire le changement à la demande.

Des conseils ou des idées?

Juan A. Navarro
la source
Mankoff, lorsque j'exécute votre suggestion: sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.InternetSharing.plist il semble fonctionner correctement et même l'interface graphique des préférences de partage est correctement mise à jour lors de l'actualisation, mais la connexion n'est en fait pas travail. Si j'exécute à nouveau la commande, elle échoue même car elle pense qu'elle est déjà chargée. De plus, si j'exécute la commande "top" pour voir le processus en cours, je ne vois pas "InternetSharing" mais si je le démarre dans les préférences, je verrai le processus "InternetSharing" en cours d'exécution et la connexion fonctionne. Toutes les idées pour lesquelles je suis h
Je ne sais pas pourquoi vous obtenez ce comportement. Je vois "InternetSharing" en haut (ou plus facilement, ps aux | grep -i internet ).
J'utilise OS X 10.6. Si vous avez une version différente, c'est peut-être pourquoi ...
En outre, cela devrait probablement être un commentaire à ma réponse, pas une réponse en soi. Pourrait vouloir supprimer la réponse ...
Oui, cela devrait certainement être un commentaire à votre réponse, mais pour une raison quelconque, je ne suis pas en mesure de commenter ces réponses à moins que quelqu'un n'ait déjà fait un commentaire. Peut-être parce que je suis un nouvel utilisateur. J'utilise OS X 10.6.4. Une autre chose que j'ai remarquée, c'est que lorsque je lance le partage Internet dans les préférences, c'est que le processus natd (démon de traduction d'adresse réseau) démarre également. Je me demande si je dois également lancer ce processus, en train d'étudier comment le faire, il semble y avoir des arguments complexes nécessaires pour démarrer ce processus.

Réponses:

19

Pour démarrer le partage Internet à partir de la CLI:

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

Pour arrêter, modifiez la charge à décharger .

Notez que si vous avez le volet pref ouvert lorsque vous l'exécutez, vous ne verrez pas la modification prendre effet immédiatement (l'interface utilisateur ne sera pas mise à jour), mais cela fonctionne.


la source
Étrange, après un certain temps, il a cessé de fonctionner. Si j'exécute la commande puis ouvre le volet pref, je vois que le partage est activé, mais la connexion n'est pas réellement partagée. Si j'arrête et commence manuellement le partage dans le volet pref, cela fonctionne à nouveau sans problème. Des indices sur ce qui pourrait mal se passer?
Juan A. Navarro
2
La recette de Ken fonctionne! Mais ... il y a un bug (je chasse). Vous devez laisser un délai de 30 secondes après le unloadpour pouvoir loadrecommencer. Une bonne commande de vérification est ps ax | egrep '[ /](PID|boo|nat)'.
dan
1
Ne fonctionne pas le 10.11.2 El Capitan:/System/Library/LaunchDaemons/com.apple.InternetSharing.plist: No such file or directory
Yohaï Berreby le
3
essayez plutôt: /System/Library/LaunchDaemons/com.apple.NetworkSharing.plist;)
guerrerocarlos
1
Étant donné que l'application Préférences Système ne nécessite pas d'authentification, comment pouvons-nous le faire sans utiliser sudo / root?
Michele Dall'Agata
4

Une façon de le faire est de créer des scripts GUI — Les Préférences Système ne prennent pas en charge Applescript par défaut.

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
la source
3
Peut-être, mais cela fonctionne et la réponse est dans les limites de la question du PO: "Existe-t-il un moyen de démarrer / arrêter le partage Internet à partir de la ligne de commande ou peut-être d'un script Apple ?" Le vote en aval devrait vraiment être épargné pour les réponses vraiment flagrantes. Merci
Philip Regan
1
D'où pas de downvote "officiel". :).
2
"fonctionne et est dans les limites" me fait penser que nous devrions avoir un nouveau site: rubegoldberg.stackexchange.com
2
N'est-ce pas à cela que sert thedailywtf.com ? ;-)
Philip Regan
1
@Juan: Sachez simplement que si Apple modifie la disposition des Préférences Systèmes et du volet Partage avec une mise à niveau, alors mon script a également le potentiel de rupture car les scripts GUI reposent sur des paramètres très stricts.
Philip Regan
2

Je me suis inspiré de la réponse de mankoff et l'ai enveloppé dans un AppleScript. J'utilise ce script d'Automator pour pouvoir l'utiliser facilement en tant que service et lui donner un raccourci clavier.

Basculer le partage Internet:

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
la source
Ne fonctionne pas vraiment sur Lion pour moi. Il affiche le message de succès de grognement et bascule l'option dans les préférences système, mais le symbole WiFi ne change pas en partage (et d'autres appareils ne peuvent pas voir que le wifi est partagé, donc je pense qu'il n'est pas activé :(
alopix
2

J'ai eu de bien meilleurs résultats (pour une configuration de partage déjà configurée) sur 10.11.6 avec les variantes simples ...

sudo launchctl start com.apple.NetworkSharing

et

sudo launchctl stop com.apple.NetworkSharing

respectivement.

gris alex
la source
1

Solution de contournement définitive à la constante de partage Wi-Fi en panne dans MacosX

J'ai trouvé un système qui fonctionne enfin et quand, moins fréquemment, le partage wifi s'arrête, il parvient à le récupérer automatiquement en une minute.

La solution est un ~/Library/LaunchAgents/com.me.wifisharingup.plistdémon avec le contenu suivant:

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

Vous pouvez voir, chaque minute, il exécute le script simple qui suit. Veillez à ce que le plist précédent soit la propriété de la racine et lancez-le avec:

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

Le script qu'il lance chaque minute (n'oubliez pas de le rendre exécutable) est:

#!/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

Je pense que le simple appel périodique (chaque minute) pour ipconfig getifaddr en1rafraîchir quelque chose dans ce qu'est le démon de partage wifi. Quoi qu'il en soit, à tout moment le partage wifi échoue, il perd l'adresse IP auto-attribuée, puis ipconfig getifaddr en1échoue, donc mon script réinitialise totalement le wifi, ce qui lui fait reconstruire son état précédent et récupère le partage wifi.

Cela fonctionne depuis des jours à l'intérieur d'un MacMini sans clavier, souris ou moniteur, mais uniquement branché sur Ethernet et donnant à mes gadgets wifi un accès au monde.

juanfal
la source
0

La manière la plus simple de le faire est de combiner la réponse de @ Philip avec l' application NetworkLocation . NL peut dire où vous vous trouvez et exécuter automatiquement un AppleScript lorsqu'il détecte que vous avez changé d'emplacement.

Je pense que c'est un logiciel requis si vous avez un ordinateur portable - sinon, c'est un PITA qui doit toujours réinitialiser manuellement plusieurs paramètres chaque fois que je change d'emplacement.

Dori
la source
Sonne comme Marco Polo ( symonds.id.au/marcopolo ) mais sans les stéroïdes Marco Polo. :)
Ian C.
@Ian - Cette page indique que MP a des problèmes connus avec Snow Leopard. Le groupe Google affirme que "le projet MarcoPolo n'est pas mort en soi, mais il se développe très lentement. N'attendez pas une nouvelle version bientôt." Le dépôt git ne montre aucune mise à jour depuis septembre 2009. Il me semble que les stéroïdes pourraient rattraper quelqu'un… ;-)
Dori
Je ne peux pas dire que j'ai eu des problèmes avec SL sauf pour BlueTooth. Je n'utilise tout simplement pas la fonction BT activer / désactiver / détecter et cela fonctionne plutôt bien. (Mais remarque faite)
Ian C.
0

Légèrement différent de l'autre applescript posté (je pense d'une meilleure façon mais…). Avoir des options peut parfois aider.

 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
la source
0

Étant donné que la solution de script GUI publiée précédemment nécessite que les utilisateurs internationaux ajustent les noms des fenêtres et des boutons, j'ai proposé une version qui fonctionne avec n'importe quelle langue du système. Il fonctionne également pour l'autre option de partage et fournit des commentaires localisés sur l'état de partage. J'utilise deux services Automator différents basés sur cela, l'un pour basculer le partage de fichiers et l'autre pour basculer le partage Internet.

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
la source
0

Avant / après toute configuration, l'interface ou les interfaces impliquées dans le partage doivent être désactivées / activées avec:

networksetup -setairportpower en1 off

puis sur. ( networksetup -setairportpower en1 on)

Mon wifi a été répertorié comme en1, pour rechercher le vôtre networksetup -listnetworkserviceorder. Plus précisément, lors du démarrage du partage Internet, vous devrez ajouter des fonctionnalités NAT plus détaillées, puis simplement définir le bit activé.

NAT est activé / désactivé avec le bit: -int 0= off -int 1= on

La seule chose qui est écrite /Library/Preferences/SystemConfiguration/com.apple.nat.plistavec

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

est

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

Vous devrez modifier votre fichier plist pour qu'il ressemble à ceci:

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

Comme vous pouvez le voir, mon fichier NAT plist peut nécessiter une petite personnalisation pour répondre à vos besoins.

Paul
la source
0

J'utilise le script suivant pour basculer le partage Internet sur un MacBook Pro / 10.11.3 El Capitan début 2011, donc avec un matériel plus récent, vous pourriez vous en sortir avec des délais plus courts. Il adopte des idées à partir de plusieurs scripts publiés à cet effet (localisation, activer / désactiver le wifi à l'aide networksetup, fermer une System Preferencesfois terminé).

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
la source
-1
/usr/bin/defaults write /Library/Preferences/SystemConfiguration/com.apple.nat NAT -dict Enabled -int 0
Jason Bush
la source
Est-ce que cela fait basculer le partage?
Greenonline