Avviare / interrompere la condivisione di Internet da uno script?


21

C'è un modo per avviare / interrompere la condivisione di Internet dalla riga di comando o forse uno script Apple?

Il fatto è che mi muovo attorno al mio laptop tra casa e lavoro. Da un lato ottengo Internet wireless (e quindi devo disabilitare la condivisione di Internet), dall'altro ottengo Internet da un cavo Ethernet e installo il computer per condividere Internet con altri dispositivi creando una piccola rete wireless.

Ma sta diventando un po 'noioso dover andare in Preferenze di Sistema e avviare / interrompere la condivisione di Internet ogni volta che cambio posizione, quindi vorrei avere un comando rapido o uno script da avviare e fare il passaggio su richiesta.

Qualche suggerimento o idea?


Mankoff, quando eseguo il tuo suggerimento: sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.InternetSharing.plist sembra funzionare bene e anche la GUI delle preferenze di condivisione viene aggiornata correttamente quando viene aggiornata, tuttavia la connessione in realtà non lo è lavoro. Se eseguo di nuovo il comando, fallisce anche perché pensa che sia già caricato. Inoltre, se eseguo il comando "top" per vedere il processo in esecuzione, non vedo "InternetSharing" ma se lo avvio nella GUI delle preferenze vedrò il processo "InternetSharing" effettivamente in esecuzione e la connessione funziona. Qualche idea sul perché io sia h

Non sono sicuro del motivo per cui hai questo comportamento. Vedo "InternetSharing" in alto (o più facile, ps aux | grep -i internet ).

Sto eseguendo OS X 10.6. Se hai una versione diversa forse è per questo ...

Inoltre, questo dovrebbe probabilmente essere un commento alla mia risposta, non una risposta in sé. Potrebbe voler eliminare la risposta ...

Sì, certamente questo dovrebbe essere un commento alla tua risposta, ma per qualche ragione non sono in grado di commentare le risposte lì a meno che qualcuno non abbia già fatto un commento. Forse perché sono un nuovo utente. Sto eseguendo OS X 10.6.4. Un'altra cosa che ho notato è che quando lancio la condivisione di Internet nella GUI delle preferenze è che inizia anche il processo natd (demone di traduzione dell'indirizzo di rete). Mi chiedo se devo anche avviare questo processo, attualmente sto studiando come farlo, sembrano esserci argomenti complessi necessari per avviare questo processo.

Risposte:


19

Per avviare la condivisione Internet dalla CLI:

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

Per interrompere, modificare il carico da scaricare .

Si noti che se si esegue il riquadro pref durante l'esecuzione, non si vedrà immediatamente la modifica (l'interfaccia utente non verrà aggiornata), ma funziona.


Strano, dopo un po ', ha smesso di funzionare. Se eseguo il comando e quindi apro il riquadro pref, vedo che la condivisione è abilitata, tuttavia la connessione non viene effettivamente condivisa. Se mi fermo manualmente e inizio la condivisione nel riquadro pref, allora funziona di nuovo senza problemi. Qualche indizio su cosa potrebbe esserci di sbagliato?
Juan A. Navarro,

2
La ricetta di Ken funziona! Ma ... c'è un bug (sto cacciando). Devi lasciare un ritardo di 30 secondi dopo il unloadper poterlo fare di loadnuovo. Un buon comando di controllo è ps ax | egrep '[ /](PID|boo|nat)'.
dan

1
Non funziona il 10.11.2 El Capitan:/System/Library/LaunchDaemons/com.apple.InternetSharing.plist: No such file or directory
Yohaï Berreby,

3
provare: /System/Library/LaunchDaemons/com.apple.NetworkSharing.plist;)
guerrerocarlos

1
Poiché l'app Preferenze di Sistema non richiede autenticazione, come possiamo farlo senza usare sudo / root?
Michele Dall'Agata

4

Un modo per farlo è tramite lo scripting della GUI: le Preferenze di Sistema non hanno alcun supporto per Applescript per impostazione predefinita.

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

3
Forse, ma funziona e la risposta è entro i limiti della domanda del PO: "Esiste un modo per avviare / interrompere la condivisione di Internet dalla riga di comando o forse uno script Apple ?" Il downvoting dovrebbe davvero essere salvato per le risposte davvero egregie. Grazie
Philip Regan,

1
Quindi nessun downvote "ufficiale". :).

2
"funziona ed è nei limiti" mi fa pensare che dovremmo avere un nuovo sito: rubegoldberg.stackexchange.com

2
Non è per questo che thedailywtf.com ? ;-)
Philip Regan,

1
@Juan: Basta essere avvisati che se Apple modifica il layout di Preferenze di Sistema e il riquadro Condivisione con un aggiornamento, anche il mio script ha la vera interruzione potenziale perché lo scripting della GUI si basa su parametri molto rigidi.
Philip Regan,

2

Ho preso spunto dalla risposta di Mankoff e l'ho racchiuso in un AppleScript. Sto usando questo script di Automator in modo da poterlo usare facilmente come servizio e dargli una scorciatoia da tastiera.

Attiva / disattiva condivisione 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

Non funziona davvero su Lion per me. Visualizza il messaggio di successo del ringhio e attiva l'opzione nelle preferenze di sistema, ma il simbolo WiFi non cambia nella condivisione (e altri dispositivi non possono vedere che il wifi è condiviso, quindi penso che non sia attivo :(
alopix,

2

Ho ottenuto risultati molto migliori (per una configurazione di condivisione già configurata) il 10.11.6 con le semplici variazioni ...

sudo launchctl start com.apple.NetworkSharing

e

sudo launchctl stop com.apple.NetworkSharing

rispettivamente.


1

Soluzione definitiva alla suddivisione costante della condivisione wifi in MacosX

Ho trovato un sistema che finalmente funziona e quando, meno frequentemente si interrompe la condivisione wifi, riesce a recuperarlo automaticamente in un minuto.

La soluzione è un ~/Library/LaunchAgents/com.me.wifisharingup.plistdemone con i seguenti contenuti:

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

Puoi vedere ogni minuto che esegue il semplice script che segue. Fai attenzione a far sì che il plist precedente sia di proprietà del root e avvialo con:

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

Lo script che avvia ogni minuto (non dimenticare di renderlo eseguibile) è:

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

Penso che la semplice chiamata periodica (ogni minuto) per ipconfig getifaddr en1aggiornare qualcosa in quello che è il demone di condivisione wifi. Qualunque cosa sia, in qualsiasi momento la condivisione del wifi non riesce, perde l'indirizzo IP assegnato automaticamente e quindi ipconfig getifaddr en1fallisce, quindi il mio script reimposta totalmente il wifi, facendogli ricostruire il suo stato precedente e ripristinare la condivisione del wifi.

Ha funzionato per giorni all'interno di un MacMini senza tastiera, mouse o monitor, ma solo collegato a Ethernet e dando ai miei gadget wifi accesso al mondo.


0

Il modo davvero semplice per farlo è combinare la risposta di @ Philip con l' applicazione NetworkLocation . NL può dire dove ti trovi ed eseguire automaticamente un AppleScript quando rileva che hai cambiato posizione.

Penso che sia necessario un software se si dispone di un laptop, altrimenti è un PITA che deve sempre ripristinare manualmente diverse impostazioni ogni volta che cambio posizione.


Sembra Marco Polo ( symonds.id.au/marcopolo ) ma senza gli steroidi Marco Polo. :)
Ian C.

@Ian - Quella pagina dice che MP ha riscontrato problemi con Snow Leopard. Il gruppo Google afferma che "il progetto MarcoPolo non è morto di per sé, ma è stato sviluppato molto lentamente. Non aspettatevi una nuova versione presto". Il repository git non mostra alcun aggiornamento da settembre 2009. Mi sembra che gli steroidi stiano raggiungendo qualcuno ... ;-)
Dori,

Non posso dire di aver avuto problemi con esso su SL, salvo per BlueTooth. Semplicemente non uso la funzione di abilitazione / disabilitazione / rilevazione BT e funziona in modo piuttosto brillante. (Ma punto preso)
Ian C.

0

Leggermente diverso dall'altro AppleScript (penso in modo migliore ma ...). Avere opzioni a volte può aiutare.

 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

0

Poiché la soluzione di scripting della GUI pubblicata in precedenza richiede agli utenti internazionali di modificare i nomi delle finestre e dei pulsanti, mi è venuta in mente una versione che funziona con qualsiasi linguaggio di sistema. Funziona anche con l'altra opzione di condivisione e fornisce feedback localizzati sullo stato di condivisione. Uso due diversi servizi di Automator basati su questo, uno per attivare la condivisione dei file e uno per attivare la condivisione di 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

0

Prima / dopo qualsiasi configurazione, l'interfaccia o le interfacce coinvolte nella condivisione devono essere disattivate / attivate con:

networksetup -setairportpower en1 off

poi su. ( networksetup -setairportpower en1 on)

Il mio wifi è stato elencato come en1, per cercare il tuo uso networksetup -listnetworkserviceorder. Inoltre, quando si avvia la condivisione di Internet è necessario aggiungere funzionalità NAT più dettagliate, quindi impostare semplicemente il bit abilitato.

NAT è attivato / disattivato con bit: -int 0= off -int 1= on

L'unica cosa che è scritto in /Library/Preferences/SystemConfiguration/com.apple.nat.plistcon

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

è

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

Dovrai cambiare il tuo file plist in modo che assomigli a quanto segue:

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

Come puoi vedere, il mio file NAT potrebbe richiedere una piccola personalizzazione per soddisfare le tue esigenze.


0

Uso il seguente script per attivare la condivisione di Internet su un MacBook Pro / 10.11.3 El Capitan del 2011, quindi con un hardware più recente potresti evitare ritardi più brevi. Adotta idee da diversi script pubblicati a questo scopo (localizzazione, attivazione / disattivazione del wifi utilizzando networksetup, chiusura System Preferencesal termine).

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


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

Questo attiva o disattiva la condivisione?
Greenonline,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.