Запускать / останавливать обмен интернетом из скрипта?


21

Есть ли способ запустить / остановить общий доступ к Интернету из командной строки или, может быть, сценарий Apple?

Дело в том, что я перемещаю свой ноутбук между домом и работой. В одном месте я получаю беспроводной Интернет (и, следовательно, я должен отключить общий доступ к Интернету), а в другом я получаю интернет по кабелю Ethernet и настраиваю компьютер для совместного использования интернета с другими устройствами, создав небольшую беспроводную сеть.

Но становится немного утомительно заходить в Системные настройки и запускать / останавливать общий доступ к Интернету каждый раз, когда я меняю местоположение, поэтому мне нужна быстрая команда или скрипт для запуска и выполнения переключения по требованию.

Есть намеки или идеи?


Mankoff, когда я запускаю ваше предложение: sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.InternetSharing.plist, кажется, работает нормально, и даже графический интерфейс настроек совместного использования обновляется корректно при обновлении, однако соединение на самом деле не за работой. Если я запускаю команду снова, она даже не работает, потому что думает, что она уже загружена. Кроме того, если я запускаю команду "top", чтобы увидеть процесс, запущенный, я не вижу "InternetSharing", но если я запускаю его в графическом интерфейсе настроек, я вижу, что процесс "InternetSharing" действительно работает, и соединение работает. Любые идеи, почему я ч

Не уверен, почему вы получаете такое поведение. Я вижу "InternetSharing" в верхней части (или, проще, ps aux | grep -i internet ).

Я использую OS X 10.6. Если у вас другая версия, может быть, поэтому ...

Кроме того, это, вероятно, должен быть комментарий к моему ответу, а не сам по себе ответ. Возможно, вы хотите удалить ответ ...

Да, конечно, это должен быть комментарий к вашему ответу, но по какой-то причине я не могу комментировать там ответы, если кто-то уже не сделал комментарий. Может быть, потому что я новый пользователь. Я использую OS X 10.6.4. Еще одна вещь, которую я заметил, заключается в том, что при запуске общего доступа к Интернету в графическом интерфейсе настроек также запускается процесс natd (демон преобразования сетевых адресов). Мне интересно, если мне также нужно запустить этот процесс, в настоящее время исследуя, как это сделать, кажется, есть сложные аргументы, необходимые для запуска этого процесса.

Ответы:


19

Чтобы запустить общий Интернет из интерфейса командной строки:

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

Для остановки измените нагрузку на разгрузочную .

Обратите внимание: если вы запустите эту панель, вы не увидите, что изменение вступит в силу немедленно (пользовательский интерфейс не обновится), но оно работает.


Странно, через некоторое время перестало работать. Если я запускаю команду и затем открываю предварительную панель, я вижу, что совместное использование включено, однако соединение на самом деле не является общим. Если я вручную остановлюсь и начну делиться на преф-панели, то снова будет работать без проблем. Любые подсказки о том, что может быть не так?
Хуан А. Наварро

2
Рецепт Кена работает! Но ... есть ошибка (я охота). Вы должны оставить 30 секундную задержку после того, unloadкак сможете сделать loadснова. Одна хорошая команда проверки ps ax | egrep '[ /](PID|boo|nat)'.
дан

1
Не работает на 10.11.2 El Capitan:/System/Library/LaunchDaemons/com.apple.InternetSharing.plist: No such file or directory
Йохай Берреби

3
попробуйте: /System/Library/LaunchDaemons/com.apple.NetworkSharing.plist;)
guerrerocarlos

1
Поскольку приложение «Системные настройки» не требует аутентификации, как мы можем сделать это без использования sudo / root?
Мишель Dall'Agata

4

Одним из способов сделать это является использование сценариев с графическим интерфейсом. Системные настройки по умолчанию не поддерживают Applescript.

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
Возможно, но это работает, и ответ находится в пределах ограничений вопроса ОП: «Есть ли способ запустить / остановить совместное использование Интернета из командной строки или, может быть, сценарий Apple ?» Понижающее голосование действительно должно быть сохранено для действительно вопиющих ответов. Спасибо
Филип Риган

1
Отсюда и нет «официального» даунвота. :).

2
«работает и находится в пределах ограничений» заставляет меня думать, что у нас должен быть новый сайт: rubegoldberg.stackexchange.com

2
Разве не для этого thedailywtf.com ? ;-)
Филипп Реган

1
@Juan: Просто предупредите, что если Apple изменит макет «Системных настроек» и панели «Общий доступ» с обновлением, то мой сценарий также будет иметь реальный потенциал, поскольку сценарии GUI зависят от очень строгих параметров.
Филипп Реган

2

Я взял реплику из ответа Манкова и завернул его в AppleScript. Я использую этот скрипт от Automator, чтобы я мог легко использовать его в качестве службы и назначить ему сочетание клавиш.

Toggle Internet Sharing:

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

На самом деле не работает на Lion для меня. Он отображает сообщение об успешном рычании и переключает опцию в системных настройках, но символ WiFi не меняется на общий доступ (и другие устройства не могут видеть, что Wi-Fi используется совместно, поэтому я думаю, что он не включен :(
alopix

2

У меня были намного лучшие результаты (для уже настроенной настройки общего доступа) на 10.11.6 с простыми вариантами ...

sudo launchctl start com.apple.NetworkSharing

а также

sudo launchctl stop com.apple.NetworkSharing

соответственно.


1

Окончательный обходной путь к постоянному разделению Wi-Fi в MacosX

Я нашел систему, которая, наконец, работает, и когда реже работает общий доступ к Wi-Fi, ему удается восстановить ее автоматически за минуту.

Решение - это ~/Library/LaunchAgents/com.me.wifisharingup.plistдемон со следующим содержимым:

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

Как видите, каждую минуту запускается простой скрипт, который следует. Будьте осторожны, чтобы предыдущий plist принадлежал пользователю root и запустите его:

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

Сценарий, который он запускает каждую минуту (не забудьте сделать его исполняемым):

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

Я думаю, что простой периодический (каждую минуту) вызов ipconfig getifaddr en1обновляет что-то в том, что является демоном общего доступа Wi-Fi. Что бы это ни было, в любой момент, когда общий доступ к Wi-Fi завершается неудачно, он теряет сам назначенный IP-адрес, а затем ipconfig getifaddr en1отказывает, поэтому мой сценарий полностью сбрасывает Wi-Fi, восстанавливая его прежнее состояние и восстанавливая общий доступ к Wi-Fi.

До сих пор он работал уже несколько дней в MacMini без клавиатуры, мыши или монитора, но только подключен к Ethernet и дает моим гаджетам wifi доступ к миру.


0

Действительно простой способ сделать это - объединить ответ @ Филиппа с приложением NetworkLocation . NL может определить ваше местоположение и автоматически запустить AppleScript, когда обнаружит, что вы изменили местоположение.

Я думаю, что это требуется программное обеспечение, если у вас есть ноутбук - в противном случае это PITA, чтобы всегда приходилось вручную сбрасывать несколько настроек каждый раз, когда я меняю местоположение.


Похоже на Марко Поло ( symonds.id.au/marcopolo ), но без стероидов Марко Поло. :)
Ян С.

@Ian - На этой странице сказано, что у MP были проблемы со Snow Leopard. Группа Google говорит: «Проект MarcoPolo сам по себе не мертв, но он разрабатывается очень медленно. Не ожидайте новой версии в ближайшее время». В репозитории показывает не обновление с сентябрем 2009 года Звуков мне как стероиды не может быть догоняет с кем - то ... ;-)
Дори

Не могу сказать, что у меня были какие-то проблемы с этим на SL, за исключением BlueTooth. Я просто не использую функцию включения / выключения / обнаружения BT, и она работает довольно блестяще. (Но точка зрения принята)
Ян С.

0

Немного отличается от других опубликованных Jabscript (я думаю, что лучше, но ...). Наличие вариантов иногда может помочь.

 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

Поскольку опубликованное ранее решение для создания сценариев с графическим интерфейсом требует, чтобы иностранные пользователи настраивали имена окон и кнопок, я предложил версию, которая работает с любым языком системы. Это также работает для другого варианта совместного использования и дает локализованный отзыв о состоянии общего доступа. Я использую две разные службы Automator, основанные на этом, один для переключения общего доступа к файлам и один для переключения общего доступа к Интернету.

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

Перед / после любой конфигурации интерфейс или интерфейсы, участвующие в совместном использовании, должны быть выключены / включены с помощью:

networksetup -setairportpower en1 off

Затем на. ( networksetup -setairportpower en1 on)

Мой Wi-Fi был указан как en1, для поиска твоего использования networksetup -listnetworkserviceorder. Более того, при запуске общего доступа к Интернету вам нужно будет добавить более подробные функции NAT, чем просто установить бит включения.

NAT включается / выключается с помощью бита: -int 0= off -int 1= on

Единственное, что написано в /Library/Preferences/SystemConfiguration/com.apple.nat.plistс

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>

Вам нужно будет изменить ваш файл plist, чтобы он выглядел следующим образом:

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

Как вы видите мой файл plist NAT может потребовать небольшой настройки в соответствии с вашими потребностями.


0

Я использую следующий скрипт для переключения общего доступа к Интернету в MacBook Pro / 10.11.3 El Capitan в начале 2011 года, поэтому с новым оборудованием вы можете избежать коротких задержек. Он принимает идеи из нескольких скриптов, опубликованных для этой цели (локализация, включение / выключение Wi-Fi networksetup, закрытие, System Preferencesкогда закончите).

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

0

Возможно, вы захотите взглянуть на этот (возможно, не по теме переполнение стека) вопрос и его ответ: Как запустить / остановить общий доступ к Интернету с помощью AppleScript .

do shell script "/bin/launchctl load -w /System/Library/LaunchDaemons/com.apple.InternetSharing.plist" with administrator privileges

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.