Iniciar / parar o compartilhamento da Internet a partir de um script?


21

Existe uma maneira de iniciar / parar o compartilhamento da Internet na linha de comando ou talvez um script da apple?

A coisa é que eu movo meu laptop entre casa e trabalho. Em um lugar, acesso à Internet sem fio (e, portanto, tenho que desativar o compartilhamento da Internet); no outro, acesso à Internet a partir de um cabo Ethernet e configuro o computador para compartilhar a Internet com outros dispositivos, criando uma pequena rede sem fio.

Mas está ficando um pouco tedioso ter que entrar nas Preferências do Sistema e iniciar / parar o compartilhamento da Internet toda vez que eu mudar de local, então eu gostaria de ter um comando ou script rápido para iniciar e fazer a troca sob demanda.

Alguma dica ou idéia?


Mankoff, quando executo sua sugestão: sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.InternetSharing.plist parece funcionar bem e até mesmo a interface de preferências de compartilhamento é atualizada corretamente quando atualizada, no entanto, a conexão não é realmente trabalhando. Se eu executar o comando novamente, ele até falha porque acha que já está carregado. Além disso, se eu executar o comando "top" para ver o processo em execução, não vejo "InternetSharing", mas se o iniciar na guia de preferências, verei o processo "InternetSharing" realmente em execução e a conexão funcionará. Alguma idéia de por que eu sou h

Não sei por que você recebe esse comportamento. Eu vejo "InternetSharing" na parte superior (ou mais fácil, ps aux | grep -i internet ).

Estou executando o OS X 10.6. Se você tem uma versão diferente, talvez por isso ...

Além disso, isso provavelmente deve ser um comentário para minha resposta, não uma resposta em si. Pode querer excluir a resposta ...

Sim, certamente isso deve ser um comentário para sua resposta, mas, por algum motivo, não posso comentar as respostas, a menos que alguém já tenha feito um comentário. Talvez porque eu seja um novo usuário. Estou executando o OS X 10.6.4. Outra coisa que notei é que, quando inicio o compartilhamento da Internet no gui de preferências, o processo natd (daemon de tradução de endereços de rede) também é iniciado. Gostaria de saber se também preciso iniciar esse processo, atualmente investigando como fazer isso, parece haver argumentos complexos necessários para iniciar esse processo.

Respostas:


19

Para iniciar o compartilhamento da Internet a partir da CLI:

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

Para parar, altere a carga para descarregar .

Observe que, se você tiver o painel de preferências aberto ao executar isso, não verá a alteração entrar em vigor imediatamente (a interface do usuário não será atualizada), mas funcionará.


Estranho, depois de um tempo, parou de funcionar. Se eu executar o comando e abrir o painel de preferências, vejo que o compartilhamento está ativado, mas a conexão não está sendo compartilhada. Se eu parar manualmente e começar a compartilhar no painel de prefixos, ele funcionará novamente sem problemas. Alguma pista sobre o que poderia estar errado?
Juan A. Navarro

2
A receita de Ken funciona! Mas ... há um bug (estou caçando). Você deve deixar um atraso de 30 segundos depois unloadpara poder fazer loadnovamente. Um bom comando de verificação é ps ax | egrep '[ /](PID|boo|nat)'.
dan

1
Não funciona em 10.11.2 El Capitan:/System/Library/LaunchDaemons/com.apple.InternetSharing.plist: No such file or directory
Yohaï Berreby 15/01

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

1
Como o aplicativo System Preferences não requer autenticação, como podemos fazer isso sem usar o sudo / root?
Michele Dall'Agata

4

Uma maneira de fazer isso é por meio de scripts da GUI - as Preferências do Sistema não têm suporte a Applescript por padrão.

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
Talvez, mas funcione e a resposta esteja dentro das restrições da pergunta do OP: "Existe uma maneira de iniciar / parar o compartilhamento da Internet a partir da linha de comando ou talvez um script da apple ?" O voto negativo realmente deve ser guardado para as respostas realmente flagrantes. Obrigado
Philip Regan

1
Portanto, nenhum voto "oficial". :).

2
"funciona e está dentro de restrições" me faz pensar que deveríamos ter um novo site: rubegoldberg.stackexchange.com

2
Não é para isso que serve thedailywtf.com ? ;-)
Philip Regan

1
@ Juan: Apenas esteja avisado que, se a Apple alterar o layout das Preferências do Sistema e o painel Compartilhamento com uma atualização, meu script terá uma potencial quebra real, pois os scripts da GUI se baseiam em parâmetros muito rigorosos.
Philip Regan

2

Peguei uma sugestão da resposta de mankoff e a envolvi em um AppleScript. Estou usando esse script do Automator para poder usá-lo facilmente como um serviço e fornecer um atalho de teclado.

Alternar compartilhamento da 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

Realmente não funciona no Lion para mim. Ele exibe a mensagem de sucesso do rosnado e alterna a opção nas preferências do sistema, mas o símbolo WiFi não muda para o compartilhamento (e outros dispositivos não conseguem ver que o wifi é compartilhado, então acho que não está ligado :(
alopix

2

Eu tive resultados muito melhores (para uma configuração de compartilhamento já configurada) no 10.11.6 com as variações simples ...

sudo launchctl start com.apple.NetworkSharing

e

sudo launchctl stop com.apple.NetworkSharing

respectivamente.


1

Solução definitiva para a constante quebra de compartilhamento de Wi-Fi no MacosX

Eu encontrei um sistema que finalmente funciona e, quando, com menos frequência, o compartilhamento de wifi é interrompido, ele consegue recuperá-lo automaticamente em um minuto.

A solução é um ~/Library/LaunchAgents/com.me.wifisharingup.plistdaemon com o próximo conteúdo:

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

Você pode ver, a cada minuto, ele executa o script simples a seguir. Tenha cuidado para que o plist anterior seja de propriedade da raiz e inicie-o com:

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

O script que ele lança a cada minuto (não se esqueça de torná-lo executável) é:

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

Acho que a simples chamada periódica (a cada minuto) ipconfig getifaddr en1atualiza algo no que é o daemon de compartilhamento wifi. Seja o que for, a qualquer momento que o compartilhamento wifi falhe, ele perde o endereço IP auto-atribuído e, em seguida,ipconfig getifaddr en1 falha, então meu script redefine totalmente o wifi, fazendo com que ele reconstrua seu status anterior e recupere o compartilhamento wifi.

Ele está trabalhando há dias até agora dentro de um MacMini sem teclado, mouse ou monitor, mas apenas conectado à Ethernet e dando aos meus aparelhos wifi acesso ao mundo.


0

A maneira mais fácil de fazer isso é combinar a resposta do @ Philip com o aplicativo NetworkLocation . O NL pode dizer onde você está e executar automaticamente um AppleScript quando detectar que você mudou de local.

Eu acho que é necessário software se você tiver um laptop - caso contrário, é uma PITA sempre ter que redefinir manualmente várias configurações sempre que eu mudar de local.


Soa como Marco Polo ( symonds.id.au/marcopolo ), mas sem os esteróides Marco Polo. :)
Ian C.

@Ian - Essa página diz que o MP tem problemas com o Snow Leopard. O Google Group diz que "o projeto MarcoPolo não está morto, por si só, mas está sendo desenvolvido muito lentamente. Não espere uma nova versão em breve". Os repositório git mostra nenhuma atualização desde setembro de 2009. Parece-me que os esteróides podem ser aproximar-se com alguém ... ;-)
Dori

Não posso dizer que tive problemas com o SL, exceto o BlueTooth. Eu simplesmente não uso o recurso ativar / desativar / detectar o BT e ele funciona de maneira brilhante. (Mas, ponto de vista)
Ian C.

0

Um pouco diferente do que o outro texto publicado (acho que de uma maneira melhor, mas ...). Ter opções às vezes pode ajudar.

 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

Como a solução de script da GUI postada anteriormente exige que usuários internacionais ajustem os nomes de janelas e botões, criei uma versão que funciona com qualquer idioma do sistema. Ele também funciona para a outra opção de compartilhamento e fornece feedback localizado sobre o estado de compartilhamento. Eu uso dois serviços diferentes do Automator com base nisso, um para alternar o compartilhamento de arquivos e outro para alternar o compartilhamento da 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

Antes / depois de qualquer configuração, a interface ou as interfaces envolvidas no compartilhamento precisam ser ativadas / desativadas com:

networksetup -setairportpower en1 off

em seguida. (networksetup -setairportpower en1 on )

Meu wifi foi listado como en1 , para pesquisar seu usonetworksetup -listnetworkserviceorder . Mais ao ponto, ao iniciar o compartilhamento na Internet, você precisará adicionar funcionalidades NAT mais detalhadas e depois definir o bit ativado.

O NAT é ativado / desativado com o bit: -int 0= off -int 1 = on

A única coisa que está escrita /Library/Preferences/SystemConfiguration/com.apple.nat.plistcom

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>

Você precisará alterar seu arquivo plist para ter a seguinte aparência:

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

Como você pode ver, meu arquivo NAT plist pode precisar de uma pequena personalização para atender às suas necessidades.


0

Eu uso o script a seguir para alternar o compartilhamento da Internet em um MacBook Pro / 10.11.3 El Capitan do início de 2011, portanto, com o hardware mais novo, você pode se atrasar mais rapidamente. Adota idéias de vários scripts publicados para esse fim (localização, ativar / desativar o wifi usando networksetup, fechar System Preferencesquando terminar).

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


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.