MacbookでInternetSharingを休止状態にして使用する

この記事では、InternetSharingを自動的にオン/オフする方法について説明します。これにより、手動で安楽死させた場合にMacbookがスリープ状態になったり、ラップトップが再び起動したりするのを防ぎます。



先史時代


私はMacbookで作業していますが、部屋に3Gはありません。 RJ-45を介してラップトップをネットワークに接続する場合、一部の作業はモバイルデバイスに関連付けられているため、InternetSharing(以降ISと呼びます)を使用すると便利です。 ISを設定したら、電話でインターネットの問題を忘れていましたが、仕事を始めるとラップトップの電源が入ります。 初めて重要視しませんでした。 2回目は、彼が電源を入れたときにログを調べることにしました。 私が彼をスリープモードにしたとき、彼は数分後にオンになることが判明しました。



判明したように、ISはアクティブな間、スリープをブロックします。

チーム
pmset -g assertions
      
      



ISが有罪であることを示します。

pid 70000:[0x000 ... 000] PreventSystemSleepという名前: "com.apple.InternetSharing"。



私は人々が同様の問題を解決する方法を探し始めましたが、私は「サービスを無効にする」だけに出会いました。

自分で問題を解決しなければなりませんでした。



どうする?


判明したように、構成されたISサービスはファイルの使用を開始および停止します。

/System/Library/LaunchDaemons/com.apple.InternetSharing.plist







解決策はこれであることが判明しました:目を覚ますときにサービスをオンにし、スリープ状態になるときにオフにする、つまり、次のコマンドを使用します。





ただし、これらの操作では、管理者権限を持つユーザーのパスワードを入力する必要があります。



「目覚めたときやスリープ状態になったときにプログラムを実行する方法」を学習すると同時に、パスワードを要求しません。



解決策


最初に、管理者権限で起動される独自のサービスを作成します。つまり、launchctlにパスワードを要求しません。

2番目-目覚めたときとスリープ状態になったとき、それぞれ開始と停止のときにサービスにコマンドを送信します。



そのため、サービスはポート(10001など)でリッスンし、開始および停止コマンドを待ちます。

ISを開始および停止するために、それぞれサービスをPHPで記述します(以下の完全なコード)。次のアクションが実行されます。

実行するには:

 shell_exec('launchctl load -F /System/Library/LaunchDaemons/com.apple.InternetSharing.plist');
      
      





停止する:

 shell_exec('launchctl unload /System/Library/LaunchDaemons/com.apple.InternetSharing.plist');
      
      







サービスを開始するには、ファイルcom.username.InternetSharing.plist



をフォルダー/Library/LaunchDaemons/



に配置する必要があります。

次のコマンドで実行します:

 sudo launchctl load -F /Library/LaunchDaemons/com.username.InternetSharing.plist
      
      







目覚めと睡眠への移行のイベントをキャッチするために、 Scenario



プログラムを使用します。 AppleScriptで2つのスクリプトを記述し、startまたはstopパラメーターを使用してクライアントプログラム(以下の完全なコード)を呼び出します。



起動スクリプト

do shell script "/usr/bin/php /Users/username/CheckMac/client.php start"





停止スクリプト

do shell script "/usr/bin/php /Users/username/CheckMac/client.php stop"







これらをシナリオプログラムの特別なディレクトリに配置します。

"~/Library/Scenario/Wake Scripts"



"~/Library/Scenario/Sleep Scripts"



"~/Library/Scenario/Wake Scripts"



および"~/Library/Scenario/Sleep Scripts"







結果


オンにすると、シナリオプログラムは「 Wake Scripts



」フォルダーからWake Scripts



を起動し、startパラメーターでクライアントプログラムを起動します。 クライアントプログラムは、十分な権限があるため、ISサービスを開始できるサービスに接続します。

スリープモードに切り替えると、同様の操作が実行されますが、「 Sleep Scripts



」フォルダーとstopパラメーターのみが使用されます。



コード


サービス


/Users/username/CheckMac/listen.php
 <?php // PHP 5.3.10 //   error_reporting(E_ALL ^ E_WARNING); set_time_limit(0); ob_implicit_flush(); $port = 10001; $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); socket_bind($sock, "127.0.0.1", $port) or die('Port listened'."\n"); socket_set_option($sock, SOL_SOCKET, SO_KEEPALIVE, 1); socket_set_nonblock($sock); socket_listen($sock, 1000); $clients = array($sock); $tarr = array(); $iparr = array(); $current = 0; while (true) { $read = $clients; if (count($tarr) > 0) foreach ($tarr as $ind => $tim) { //      10  -  if ((time() - $tim) > 10) { socket_close($read[$ind + 1]); unset($clients[$ind+1]); unset($iparr[$ind]); unset($tarr[$ind]); echo "Disconnect client.\n"; continue; } } //    -  if (socket_select($read, $write = NULL, $except = NULL, 1) < 1) continue; //   if (in_array($sock, $read)) { $current ++; $clients[$current] = $newsock = socket_accept($sock); socket_write($newsock, "<OK>\n"); socket_getpeername($newsock, $ip); echo "New connection from ip: {$ip}\n"; $key = array_search($sock, $read); $iparr[$current-1] = $ip; $tarr[$current-1] = time(); unset($read[$key]); $read[$current] = $newsock; continue; } //   foreach ($read as $index => $read_sock) { $data = socket_read($read_sock, 1024); if ($data === false) { $key = array_search($read_sock, $clients); unset($clients[$key]); unset($iparr[$key - 1]); echo "Disconnect client.\n"; unset($tarr[$key - 1]); continue; } $data = trim($data); //    if (!empty($data)) { echo $iparr[$index - 1] . "[$index] - $data\n"; $tarr[$index - 1] = time(); switch ($data) { case "quit": socket_close($read_sock); $key = array_search($read_sock, $clients); unset($clients[$key]); unset($iparr[$key - 1]); echo "Disconnect client.\n"; unset($tarr[$key - 1]); break; case "ping": socket_write($read_sock, "<PONG> " . time() . "\n"); break; //     IS case 'start': $s = shell_exec('launchctl list'); if(strpos($s, 'com.apple.InternetSharing') === false){ shell_exec('launchctl load -F /System/Library/LaunchDaemons/com.apple.InternetSharing.plist'); } break; //     IS case 'stop': $s = shell_exec('launchctl list'); if(strpos($s, 'com.apple.InternetSharing') !== false){ shell_exec('launchctl unload /System/Library/LaunchDaemons/com.apple.InternetSharing.plist'); } break; } if ($data === "close") { socket_close($sock); break(2); } } } } socket_close($sock);
      
      





com.username.InternetSharing.plist


/ライブラリ/LaunchDaemons/com.username.InternetSharing.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.username.InternetSharing</string> <key>ProgramArguments</key> <array> <string>/usr/bin/php</string> <string>/Users/username/CheckMac/listen.php</string> </array> <key>RunAtLoad</key> <true/> </dict> </plist>
      
      





クライアントプログラム


/Users/username/CheckMac/client.php
 <?php $fp = fsockopen("127.0.0.1", 10001, $errno, $errstr, 30); if (!$fp) { echo "$errstr ($errno)<br />\n"; } else { $out = @$argv[1]."\r\n"; fwrite($fp, $out); fgets($fp, 128); sleep(1); //       $out = "quit\r\n"; fwrite($fp, $out); fgets($fp, 128); fclose($fp); }
      
      





IS起動スクリプト(テキストファイルではなく、AppleScriptsによって作成されます)


〜/ライブラリ/シナリオ/ウェイクスクリプト/ wake.scpt
do shell script "/usr/bin/php /Users/username/CheckMac/client.php start"







OasnovスクリプトIS


〜/ライブラリ/シナリオ/スリープスクリプト/ sleep.scpt
do shell script "/usr/bin/php /Users/username/CheckMac/client.php stop"








All Articles