2018/06/14

Bluetoothのオン/オフと接続をCLIで(macOS High Sierra)

BluetoothのOn/OffをCLIでやろうとして、launchd/launchctl*1を普通使う*2と

# sudo launchctl unload /System/Library/LaunchDaemons/com.apple.bluetoothd.plist
/System/Library/LaunchDaemons/com.apple.bluetoothd.plist: Operation not permitted while System Integrity Protection is engaged

と怒られる

このSystem Integrity Protectionは、OS X El Capitan以降にルートユーザでも弄れない領域をつくったもの*3で /System下はこれに当たる

ちなみにその制限領域は

# ls -lO |grep restricted
drwxr-xr-x@  4 root  wheel  restricted         128  1 19 16:34 System
drwxr-xr-x@ 38 root  wheel  restricted,hidden 1216  6  5 05:47 bin
lrwxr-xr-x@  1 root  wheel  restricted,hidden   11  5 25 17:59 etc -> private/etc
drwxr-xr-x@ 63 root  wheel  restricted,hidden 2016  6  5 05:47 sbin
lrwxr-xr-x@  1 root  wheel  restricted,hidden   11  5 25 17:59 tmp -> private/tmp
drwxr-xr-x@ 10 root  wheel  restricted,hidden  320  6  6 16:44 usr
lrwxr-xr-x@  1 root  wheel  restricted,hidden   11  5 25 18:00 var -> private/var

とかで見れる(restricted)

-----

そこでとりあえず、launchdは諦めて(設定ファイル(plist)を書換えてから)プロセス(bluetoothd)再起動で対応することにする

以下でplistファイルを眺めて

# plutil -p /Library/Preferences/com.apple.Bluetooth.plist

それらしいところを探すと,,,

# defaults read /Library/Preferences/com.apple.Bluetooth ControllerPowerState
1

らしいので,,

- OFF>ONなら

# sudo defaults write /Library/Preferences/com.apple.Bluetooth ControllerPowerState -int 1
# sudo killall -HUP bluetoothd

- ON>OFFなら

# sudo defaults write /Library/Preferences/com.apple.Bluetooth ControllerPowerState -int 0
# sudo killall -HUP bluetoothd

で対応できる

-----

ちなみに、Bluetooth機器への接続 は GUI scripting で(メニュー呼出したりして..)しかできなさそう,,,

その場合、呼び出すアプリを システム環境設定>セキュリティとプライバシー の プライバシー タブで制御許可しておいてから

Accessbility

AppleScriptだと...

tell application "System Events"
   tell process "SystemUIServer"
       tell (menu bar item 1 of menu bar 1 whose description contains "bluetooth")
          click
          tell (menu item "SomeBTName" of menu 1) —Bluetooth名を指定
             click
             click menu item 1 of menu 1 —トグルでON/OFF
          end tell
       end tell
    end tell
end tell

とかで、シェルとかシェルスクリプトで呼ぶなら適当に..

#/bin/bash
/usr/bin/osascript <<- EOD
tell application "System Events"
   tell process "SystemUIServer"
       tell (menu bar item 1 of menu bar 1 whose description contains "bluetooth")
          click
          tell (menu item "SomeBTName" of menu 1) —Bluetooth名を指定
             click
             click menu item 1 of menu 1 —トグルでON/OFF
          end tell
       end tell
    end tell
end tell
EOD

とかでいける

——
Bluetoothの挙動がおかしくなったら…Shift+Option+Bluetoothメニューのデバックメニューでリセットを!

Debug Bluetooth

 

Ref.

*1 
-launchd
https://ja.wikipedia.org/wiki/Launchd
https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/Introduction.html#//apple_ref/doc/uid/10000172i-SW1-SW1

*2
ちゃんとlaunchd/launchctlで起動しているのだけどね>Bluetooth
# sudo launchctl list |grep blue
- 0 com.apple.bluetoothReporter
- 0 com.apple.diagnosticextensions.osx.bluetooth.helper
36077 -15 com.apple.bluetoothd
- 0 com.apple.bluetoothaudiod

*3
-Terminalから見た「El Capitan」の変更点(1)
https://news.mynavi.jp/article/osxhack-142/
-El Capitanの「SIP」をもっと知る
https://news.mynavi.jp/article/osxhack-152/

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。