スクリプトからインターネット共有を開始/停止しますか?


21

コマンドラインまたはアップルスクリプトからインターネット共有を開始/停止する方法はありますか?

問題は、自宅と職場の間でラップトップを移動することです。ある場所ではワイヤレスインターネットを取得し(したがって、インターネット共有を無効にする必要があります)、別の場所ではイーサネットケーブルからインターネットを取得し、小さなワイヤレスネットワークを作成して他のデバイスとインターネットを共有するようにコンピューターをセットアップします。

ただし、場所を切り替えるたびに[システム環境設定]に移動してインターネット共有を開始/停止する必要があるため、少し面倒になっているため、オンデマンドで起動して切り替えを行うクイックコマンドまたはスクリプトが必要です。

ヒントやアイデアはありますか?


Mankoff、あなたの提案を実行すると:sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.InternetSharing.plistそれは正常に実行されているようで、更新時に共有設定GUIも正しく更新されますが、接続は実際には更新されませんワーキング。コマンドを再度実行すると、既にロードされていると見なされるため、失敗します。また、「top」コマンドを実行して実行中のプロセスを確認すると、「InternetSharing」は表示されませんが、設定GUIで起動すると、「InternetSharing」プロセスが実際に実行され、接続が機能します。私がhである理由

なぜそのような振る舞いをするのか分かりません。一番上に「InternetSharing」と表示されます(または簡単にps aux | grep -i internet)。

OS X 10.6を実行しています。別のバージョンを使用している場合、それが理由かもしれません

また、これはおそらく私の答えに対するコメントであるべきであり、それ自体の答えではありません。回答を削除したい場合があります

ええ、確かにこれはあなたの答えに対するコメントでなければなりませんが、誰かが既にコメントをしていない限り、何らかの理由でそこの答えにコメントすることはできません。たぶん私は新しいユーザーだからです。OS X 10.6.4を実行しています。私が気づいたもう一つのことは、設定GUIでインターネット共有を起動すると、プロセスnatd(ネットワークアドレス変換デーモン)も開始されることです。私はこのプロセスを起動する必要があるかどうか疑問に思っており、現在これを行う方法を調査していますが、このプロセスを開始するには複雑な議論が必要と思われます。

回答:


19

CLIからインターネット共有を開始するには:

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

停止するには、ロードunloadに変更します

これを実行するときに設定ペインを開いている場合、変更はすぐには有効になりません(UIは更新されません)が、動作します。


奇妙なことに、しばらくして、動作しなくなりました。コマンドを実行してから設定ペインを開くと、共有が有効になっていることがわかりますが、実際には接続は共有されていません。設定ペインで共有を手動で停止および開始した場合、問題なく再び機能します。何が間違っているのかについての手がかりはありますか?
フアンA.ナバロ

2
ケンのレシピは機能します!しかし...バグがあります(私は探しています)。再度unload行うことができるようにするには、30秒後に遅延する必要がありloadます。1つの適切なチェックコマンドはps ax | egrep '[ /](PID|boo|nat)'です。
ダン

1
10.11.2エルキャピタンでは機能しません:/System/Library/LaunchDaemons/com.apple.InternetSharing.plist: No such file or directory
ヨハイベレビー16年

3
試してみてください。/System/Library/LaunchDaemons/com.apple.NetworkSharing.plistを代わりに;)
guerrerocarlos

1
システム設定アプリは認証を必要としないため、sudo / rootを使用せずに認証を行うにはどうすればよいですか?
ミケーレダッラーガタ16年

4

これを行う1つの方法は、GUIスクリプトによるものです。システム環境設定には、デフォルトで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
おそらく、しかしそれは機能し、その答えはOPの質問の制約内にあります。「コマンドラインまたはアップルスクリプトからインターネット共有を開始/停止する方法はありますか?」本当にひどい答えを得るために、ダウン投票は本当に保存されるべきです。ありがとう
フィリップレーガン

1
したがって、「公式」下票はありません。:)。

2
「機能し、制約の範囲内にある」ことにより、新しいサイトrubegoldberg.stackexchange.com

2
それはthedailywtf.comの目的ではありませんか?;-)
フィリップリーガン

1
@Juan:AppleがSystems PreferencesとSharingペインのレイアウトをアップグレードで変更した場合、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

私にとって、Lionで実際には動作しません。うなり声の成功メッセージを表示し、システム設定でオプションを切り替えますが、WiFiシンボルは共有に変更されません(他のデバイスはWiFiが共有されていることを認識できないため、オンになっていないと思います:(
alopix

2

私は10.11.6で簡単なバリエーションではるかに優れた結果を(すでに設定された共有セットアップに対して)持っていました...

sudo launchctl start com.apple.NetworkSharing

そして

sudo launchctl stop com.apple.NetworkSharing

それぞれ。


1

MacosXでのWiFi共有定数の内訳に対する決定的な回避策

最終的に機能するシステムを見つけましたが、Wi-Fi共有が中断する頻度が少なくなると、1分で自動的に回復します。

ソリューションは~/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をルートが所有するように注意し、次のコマンドで起動します。

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

1分ごとに起動するスクリプト(実行可能にすることを忘れないでください)は次のとおりです。

#!/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共有デーモンとは何かを定期的に(毎分)呼び出すことで何かを更新すると思います。それが何であれ、wifi共有が失敗すると、自己割り当てIPアドレスipconfig getifaddr en1が失われ、その後失敗するため、私のスクリプトはwifiを完全にリセットし、以前のステータスを再構築し、wifi共有を回復します。

キーボード、マウス、モニターのないMacMiniの内部ではこれまで何日も機能していましたが、イーサネットに接続するだけで、wifiガジェットが世界にアクセスできるようになりました。


0

本当に簡単な方法は、@ Philipの回答NetworkLocationアプリケーションと組み合わせることです。NLは現在地を認識し、場所を変更したことを検知するとAppleScriptを自動的に実行します。

ラップトップを持っている場合はソフトウェアが必要だと思います。


マルコポーロ(symonds.id.au/marcopolo)に似ていますが、マルコポーロステロイドはありません。:)
イアンC.

@Ian-そのページでは、MPにはSnow Leopardの既知の問題があると書かれています。Googleグループでは、「マルコポーロプロジェクトはそれ自体が、死んでいないが、それは非常にゆっくりと開発されています。すぐに新しいバージョンを期待してはいけない。」と言います gitのリポジトリステロイドのような私には、2009年9月の音が誰かに追いつく可能性がありますので、更新なし... ;-)ショー
通り

BlueToothのSL 保存で問題が発生したとは言えません。BTの有効化/無効化/検出機能を使用していないだけで、かなり見事に機能します。(しかし、取られたポイント)
イアンC.

0

投稿された他のapplescriptとは少し異なります(より良い方法だと思いますが…)。オプションがあると役立つ場合があります。

 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スクリプトソリューションでは、国際的なユーザーがウィンドウとボタンの名前を調整する必要があるため、どのシステム言語でも動作するバージョンを思いつきました。他の共有オプションでも機能し、共有状態に関するローカライズされたフィードバックを提供します。これに基づいて2つの異なるAutomatorサービスを使用します。1つはファイル共有を切り替え、もう1つはインターネット共有を切り替えます。

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

構成の前後に、共有に関係する1つまたは複数のインターフェイスを次のようにオフ/オンにする必要があります。

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>

次のように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

次のスクリプトを使用して、2011年初頭のMacBook Pro / 10.11.3 El Capitanでインターネット共有を切り替えます。したがって、新しいハードウェアを使用すると、遅延が短くなります。この目的のために投稿されたいくつかのスクリプトからのアイデアを採用しています(ローカライズ、wifiのオン/オフの切り替え、完了時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


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.