Почати / зупинити обмін в Інтернеті зі сценарію?


21

Чи є спосіб запустити / зупинити обмін в Інтернеті з командного рядка чи, можливо, яблучний сценарій?

Річ у тім, що я пересуваюся між своїм ноутбуком між домом та роботою. В одному місці я отримую бездротовий Інтернет (і, таким чином, мені потрібно відключити обмін в Інтернеті), а в іншому я отримую Інтернет від кабелю Ethernet і налаштовую комп'ютер для обміну Інтернетом на інші пристрої, створивши невелику бездротову мережу.

Але стає трохи стомлювальним входити в системні налаштування та запускати / зупиняти обмін в Інтернеті щоразу, коли я перемикаю місця, тому я хотів би мати швидку команду чи сценарій, щоб запустити та зробити перемикання на вимогу.

Якісь підказки чи ідеї?


Менкофф, коли я запускаю вашу пропозицію: sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.InternetSharing.plist, здається, працює нормально, і навіть gui налаштування обміну оновлюється правильно, коли оновляється, однак зв’язку насправді немає робочий. Якщо я запускаю команду ще раз, вона навіть виходить з ладу, оскільки вважає, що її вже завантажено. Крім того, якщо я запускаю команду "top", щоб побачити запущений процес, я не бачу "InternetSharing", але якщо я запускаю його в gui налаштуваннях, я побачу, що процес "InternetSharing" фактично працює і з'єднання працює. Будь-які ідеї, чому я h

Не впевнений, чому ви отримуєте таку поведінку. Я бачу "InternetSharing" вгорі (або простіше, ps aux | grep -i Інтернет ).

У мене працює ОС X 10.6. Якщо у вас інша версія, можливо, саме тому ...

Також це, мабуть, має бути коментарем до моєї відповіді, а не самою відповіддю. Ви можете видалити відповідь ...

Так, звичайно, це має бути коментар до вашої відповіді, але я чомусь не в змозі коментувати відповіді, якщо хтось уже не зробив коментар. Можливо тому, що я новий користувач. У мене працює ОС X 10.6.4. Ще одна річ, яку я помітив, що коли я запускаю обмін в Інтернеті в налаштуваннях gui, це те, що процес natd (демон перекладу мережевих адрес) також починається. Мені цікаво, чи мені також потрібно запустити цей процес, в даний час досліджуючи, як це зробити, мабуть, є складні аргументи, необхідні для запуску цього процесу.

Відповіді:


19

Щоб розпочати спільний доступ до Інтернету з CLI:

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
Yohaï Berreby

3
спробуйте: /System/Library/LaunchDaemons/com.apple.NetworkSharing.plist замість цього;)
guerrerocarlos

1
Оскільки додаток System Preferences не потребує автентифікації, як це зробити, не використовуючи sudo / root?
Мішель Далл'Агата

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
Можливо, але це працює, і відповідь знаходиться в обмеженні питання ОП: "Чи є спосіб запустити / зупинити обмін Інтернетом з командного рядка чи, можливо, яблучний сценарій ?" Для насправді кричущих відповідей потрібно було б заощадити. Спасибі
Філіп Реган

1
Звідси немає жодної "офіційної" голоси. :).

2
"працює і знаходиться в обмеженнях" змушує мене думати, що нам слід створити новий сайт: rubegoldberg.stackexchange.com

2
Хіба це не те, для чого саме thedailywtf.com ? ;-)
Філіп Реган

1
@Juan: Зауважте, що якщо Apple змінить макет системних налаштувань і панель спільного доступу з оновленням, то мій сценарій також має реальний потенціал розриву, оскільки сценарій GUI спирається на дуже строгі параметри.
Філіп Реган

2

Я взяв підказку з відповіді mankoff і загорнув її в AppleScript. Я використовую цей скрипт від Automator, щоб я міг легко використовувати його як сервіс і надавати йому комбінацію клавіш.

Увімкнути Інтернет-обмін:

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

Це не дуже працює на Лева для мене. Він відображає повідомлення про успіх бурчання та перемикає опцію в системних налаштуваннях, але символ WiFi не змінюється на спільний доступ (і інші пристрої не бачать, що Wi-Fi спільно використовуваний, тому я думаю, що він не включений :(
алопікс

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>

Ви можете бачити, щохвилини він виконує простий сценарій, який випливає далі. Будьте обережні, щоб попередній пліст був власником кореня та запустіть його за допомогою:

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оновити щось у тому, що є демоном обміну wifi. Як би там не було, в будь-який момент, коли спільний доступ через Wi-Fi не вдасться, він втрачає самостійно призначену IP-адресу, а потім, ipconfig getifaddr en1не працює, тому мій скрипт повністю скидає wifi, завдяки чому він відновлює попередній статус і відновлює обмін Wi-Fi.

Він працює цілими днями в MacMini без клавіатури, миші чи монітора, але лише підключений до Ethernet і надає моїм гаджетам Wi-Fi доступ до світу.


0

Дуже простий спосіб зробити це полягає в об'єднанні @ Філіпа відповідь з NetworkLocation додатком. NL може визначити, де ви знаходитесь, і автоматично запустити AppleScript, коли відчує, що ви змінили місця.

Я думаю, що це потрібне програмне забезпечення, якщо у вас є ноутбук, інакше це PITA завжди потрібно вручну скидати декілька налаштувань, коли я змінюю місцеположення.


Звучить як Марко Поло ( symonds.id.au/marcopolo ), але без стероїдів Marco Polo. :)
Ян C.

@Ian - На цій сторінці написано, що депутат має відомі проблеми зі "Сніжним леопардом". Група Google говорить , що «проект MarcoPolo не помер, сам по собі, але він розвивається дуже повільно. Не чекайте нову версію в найближчим часом .» У репозиторії показує не оновлення з вереснем 2009 року Звуків мені як стероїди не може бути наздоганяє з ким - то ... ;-)
Дорі

Не можу сказати, що у мене виникли проблеми з SL на збереження BlueTooth. Я просто не використовую функцію включення / відключення / виявлення BT, і вона працює досить блискуче. (Але точка взята)
Ян Ч.

0

Трохи інакше, ніж інший розміщений яблучний сценарій (я думаю, що краще, але…). Наявність варіантів іноді може допомогти.

 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

Оскільки розроблене раніше графічне графічне рішення GUI вимагає від міжнародних користувачів коригування назв вікон та кнопок, я придумав версію, яка працює з будь-якою мовою системи. Він також працює для іншого варіанту спільного доступу та надає локалізовані відгуки про стан спільного доступу. На основі цього я використовую дві різні служби Автоматизатора: одну для переключення спільного використання файлів та одну для переключення в Інтернет.

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)

Мій wifi був вказаний як en1для пошуку вашого використання networksetup -listnetworkserviceorder. Більше того, при запуску спільного доступу до Інтернету вам потрібно буде додати більш детальну функціональність NAT, а потім просто встановити включений біт.

NAT вмикається / вимикається бітом: -int 0= вимкнено -int 1= увімкнено

Єдине , що написано в /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>

Вам потрібно буде змінити файл плісту, щоб він виглядав так:

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

Як ви бачите, моєму NAT-файлу плістки може знадобитися трохи налаштувати під свої потреби.


0

Я використовую наступний сценарій для перемикання доступу до Інтернету на початку 2011 року MacBook Pro / 10.11.3 El Capitan, тому з новим обладнанням ви можете піти з меншими затримками. Він приймає ідеї з декількох скриптів, розміщених для цієї мети (локалізація, увімкнення / вимкнення 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


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.