¿Iniciar / detener el intercambio de Internet desde un script?

21

¿Hay alguna manera de iniciar / detener el uso compartido de Internet desde la línea de comandos o tal vez un script de Apple?

Lo que pasa es que me muevo alrededor de mi computadora portátil entre el hogar y el trabajo. En un lugar obtengo internet inalámbrico (y por lo tanto tengo que deshabilitar el uso compartido de internet), y en el otro obtengo internet de un cable de ethernet y configuro la computadora para compartir internet con otros dispositivos creando una pequeña red inalámbrica.

Pero se está volviendo un poco tedioso tener que ir a Preferencias del sistema e iniciar / detener el uso compartido de Internet cada vez que cambio de ubicación, por lo que me gustaría tener un comando rápido o script para iniciar y hacer el cambio a pedido.

¿Alguna pista o idea?

Juan A. Navarro
fuente
Mankoff, cuando ejecuto su sugerencia: sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.InternetSharing.plist parece funcionar bien e incluso la interfaz gráfica de usuario de preferencias de uso compartido se actualiza correctamente cuando se actualiza, sin embargo, la conexión en realidad no es trabajando. Si ejecuto el comando nuevamente, incluso falla porque cree que ya está cargado. Además, si ejecuto el comando "top" para ver el proceso en ejecución, no veo "InternetSharing", pero si lo inicio en la GUI de preferencias, veré el proceso "InternetSharing" en ejecución y la conexión funciona. Alguna idea de por qué estoy h
No estoy seguro de por qué tienes ese comportamiento. Veo "InternetSharing" en la parte superior (o más fácil, ps aux | grep -i internet ).
Estoy ejecutando OS X 10.6. Si tiene una versión diferente, tal vez es por eso ...
Además, esto probablemente debería ser un comentario a mi respuesta, no una respuesta en sí misma. Podría querer eliminar la respuesta ...
Sí, ciertamente debería ser un comentario a su respuesta, pero por alguna razón no puedo comentar sus respuestas a menos que alguien ya haya hecho un comentario. Quizás porque soy un nuevo usuario. Estoy ejecutando OS X 10.6.4. Otra cosa que noté es que cuando inicio el uso compartido de Internet en la interfaz gráfica de usuario de preferencias es que el proceso natd (demonio de traducción de direcciones de red) también se inicia. Me pregunto si también necesito iniciar este proceso, actualmente investigando cómo hacerlo, parece que se necesitan argumentos complejos para comenzar este proceso.

Respuestas:

19

Para iniciar el uso compartido de Internet desde la CLI:

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

Para detenerse, cambie la carga para descargar .

Tenga en cuenta que si tiene el panel de preferencias abierto cuando ejecuta esto, no verá que el cambio surta efecto de inmediato (la interfaz de usuario no se actualizará), pero funciona.


fuente
Extraño, después de un tiempo, dejó de funcionar. Si ejecuto el comando y luego abro el panel de preferencias, veo que compartir está habilitado, sin embargo, la conexión no se comparte realmente. Si detengo manualmente y empiezo a compartir en el panel de preferencias, entonces vuelve a funcionar sin problemas. ¿Alguna pista sobre lo que podría estar mal?
Juan A. Navarro
2
¡La receta de Ken funciona! Pero ... hay un error (estoy cazando). Tienes que dejar un retraso de 30 segundos después unloadde poder volver a hacerlo load. Un buen comando de verificación es ps ax | egrep '[ /](PID|boo|nat)'.
dan
1
No funciona en 10.11.2 El Capitan:/System/Library/LaunchDaemons/com.apple.InternetSharing.plist: No such file or directory
Yohaï Berreby
3
prueba: /System/Library/LaunchDaemons/com.apple.NetworkSharing.plist en su lugar;)
guerrerocarlos
1
Dado que la aplicación System Preferences no requiere autenticación, ¿cómo podemos hacerlo sin usar sudo / root?
Michele Dall'Agata
4

Una forma de hacerlo es mediante la secuencia de comandos de la GUI: las preferencias del sistema no tienen compatibilidad con Applescript de forma predeterminada.

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
fuente
3
Tal vez, pero funciona y la respuesta está dentro de las limitaciones de la pregunta del OP: "¿Hay alguna manera de iniciar / detener el intercambio de Internet desde la línea de comandos o tal vez un script de Apple ?" El voto negativo realmente debería guardarse para las respuestas realmente atroces. Gracias
Philip Regan
1
Por lo tanto, no hay voto negativo "oficial". :).
2
"funciona y está dentro de las limitaciones" me hace pensar que deberíamos tener un nuevo sitio: rubegoldberg.stackexchange.com
2
¿No es para eso que thedailywtf.com es? ;-)
Philip Regan
1
@Juan: Solo tenga en cuenta que si Apple cambia el diseño de las Preferencias del sistema y el panel Compartir con una actualización, entonces mi secuencia de comandos también tiene una ruptura potencial real porque la secuencia de comandos de la GUI se basa en parámetros muy estrictos.
Philip Regan
2

Tomé una señal de la respuesta de mankoff y la envolví en un AppleScript. Estoy usando este script de Automator para poder usarlo fácilmente como un servicio y darle un atajo de teclado.

Alternar el uso compartido de 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
fuente
Realmente no funciona en Lion para mí. Muestra el mensaje de éxito gruñido y alterna la opción en las preferencias del sistema, pero el símbolo WiFi no cambia a compartir (y otros dispositivos no pueden ver que el wifi se comparte, así que creo que no está encendido :(
alopix
2

Tuve resultados mucho mejores (para una configuración de uso compartido ya configurada) en 10.11.6 con las variaciones simples ...

sudo launchctl start com.apple.NetworkSharing

y

sudo launchctl stop com.apple.NetworkSharing

respectivamente.

alex grey
fuente
1

Solución definitiva para el uso compartido de wifi que se descompone constantemente en MacosX

He encontrado un sistema que finalmente funciona y cuando, con menos frecuencia, se rompe el uso compartido de wifi, logra recuperarlo automáticamente en un minuto.

La solución es un ~/Library/LaunchAgents/com.me.wifisharingup.plistdemonio con los siguientes contenidos:

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

Puedes ver, cada minuto ejecuta el script simple que sigue. Tenga cuidado de hacer que el plist anterior sea propiedad de la raíz y ejecútelo con:

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

El script que se inicia cada minuto (no olvide hacer que sea ejecutable) es:

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

Creo que la simple llamada periódica (cada minuto) para ipconfig getifaddr en1actualizar algo en lo que es el demonio para compartir wifi. Sea lo que sea, en cualquier momento el uso compartido de wifi falla, pierde la dirección IP auto asignada y luego ipconfig getifaddr en1falla, por lo que mi script restablece totalmente el wifi, lo que hace que reconstruya su estado anterior y recupere el uso compartido de wifi.

Ha estado funcionando durante días hasta ahora dentro de un MacMini sin teclado, mouse o monitor, pero solo conectado a Ethernet y dando acceso a mis dispositivos wifi al mundo.

juanfal
fuente
0

La forma realmente fácil de hacerlo es combinar la respuesta de @ Philip con la aplicación NetworkLocation . NL puede decir dónde se encuentra y ejecutar automáticamente un AppleScript cuando detecta que ha cambiado de ubicación.

Creo que se requiere software si tiene una computadora portátil; de lo contrario, es un PITA tener que restablecer manualmente varias configuraciones cada vez que cambio de ubicación.

Dori
fuente
Suena como Marco Polo ( symonds.id.au/marcopolo ) pero sin los esteroides Marco Polo. :)
Ian C.
@ Ian - Esa página dice que MP ha conocido problemas con Snow Leopard. El grupo de Google dice que "el proyecto MarcoPolo no está muerto, per se, pero se está desarrollando muy lentamente. No hay que esperar una nueva versión pronto." El repositorio de git no muestra ninguna actualización desde septiembre de 2009. Me parece que los esteroides podrían ponerse al día con alguien ... ;-)
Dori
No puedo decir que haya tenido problemas con él en SL, salvo BlueTooth. Simplemente no uso la función de habilitar / deshabilitar / detectar BT y funciona de manera brillante. (Pero punto tomado)
Ian C.
0

Ligeramente diferente al otro applecript publicado (creo que de una mejor manera pero ...). Tener opciones a veces puede ayudar.

 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
fuente
0

Dado que la solución de secuencias de comandos GUI publicada anteriormente requiere que los usuarios internacionales ajusten los nombres de las ventanas y los botones, se me ocurrió una versión que funciona con cualquier idioma del sistema. También funciona para la otra opción de uso compartido y ofrece comentarios localizados sobre el estado de uso compartido. Utilizo dos servicios diferentes de Automator basados ​​en esto, uno para alternar el uso compartido de archivos y otro para alternar el uso compartido de 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
fuente
0

Antes / después de cualquier configuración, la interfaz o las interfaces involucradas en el intercambio deben apagarse / encenderse con:

networksetup -setairportpower en1 off

entonces en ( networksetup -setairportpower en1 on)

Mi wifi figuraba como en1, para buscar el suyo networksetup -listnetworkserviceorder. Más concretamente, cuando comience a compartir Internet, deberá agregar una funcionalidad NAT más detallada y luego solo configurar el bit habilitado.

NAT se activa / desactiva con bit: -int 0= desactivado -int 1= activado

Lo único que está escrito /Library/Preferences/SystemConfiguration/com.apple.nat.plistcon

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

es

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

Deberá cambiar su archivo plist para que tenga el siguiente aspecto:

<!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 puede ver, mi archivo NAT plist puede necesitar un poco de personalización para adaptarse a sus necesidades.

Paul
fuente
0

Utilizo el siguiente script para alternar el uso compartido de Internet en una MacBook Pro / 10.11.3 El Capitan de principios de 2011, por lo que con el hardware más nuevo podría salirse con demoras más cortas. Adopta ideas de varios scripts publicados para este propósito (localización, activación / desactivación de wifi usando networksetup, cierre System Preferencescuando haya terminado).

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
fuente
-1
/usr/bin/defaults write /Library/Preferences/SystemConfiguration/com.apple.nat NAT -dict Enabled -int 0
Jason Bush
fuente
¿Esto alterna el intercambio?
Greenonline