MacBook Pro の本体の WiFi を、定期的に
cron
で再起動(オフ・オン)したいのです。
Mac の Mojave や Catalina で WiFi をオン/オフするコマンドはないのでしょうか。
TL; DR
networksetup
ツールのSetAirportPower
コマンドで Wi-Fi のオン・オフが可能です。
$ networksetup -SetAirportPower en0 off
$ networksetup -SetAirportPower en0 on
- 2022/11/13 現在、macOS Monterey (OSX 12.6.1, Intel) でも動作することを確認しました。
TS; DR
Usage: networksetup -setairportpower <device name> <on off>
Set Wi-Fi power for <device name> to either <on> or <off>.
$ networksetup -listallhardwareports | grep -A 1 "Wi-Fi"
Hardware Port: Wi-Fi
Device: en0
$ networksetup -setairportpoweren0 off
$ sleep 5
$ networksetup -setairportpower en0 on
$ networksetup -setdhcp Wi-Fi
- あわせて読みたい:「Mac の bash で現在の DNS サーバーなどのネットワーク設定を取得する」 @ Qiita
networksetup
で利用可能なコマンド一覧
`networksetup` コマンド一覧
networksetup -help
や networksetup -printcommands
でも確認できます。また、どのコマンドもコマンド名から機能はピンと来ます。しかし、全部小文字なので読みづらいのです。そこで、一覧をキャメル・ケースにしてみました。ちなみにキャメルケースでも動作します。
-ListNetworkServiceOrder
-ListAllNetworkServices
-ListAllHardwarePorts
-DetectNewHardware
-GetMACAddress <HardwarePort or Device Name>
-GetComputerName
-SetComputerName <Name>
-GetInfo <NetworkService>
-SetManual <NetworkService> <ip> <subnet> <Router>
-SetDHCP <NetworkService> [clientid]
-SetBootp <NetworkService>
-SetManualWithDHCPRouter <NetworkService> <ip>
-GetAdditionalRoutes <NetworkService>
-SetAdditionalRoutes <NetworkService> [ <dest> <mask> <gateway> ]*
-Setv4off <NetworkService>
-Setv6off <NetworkService>
-Setv6Automatic <NetworkService>
-Setv6LinkLocal <NetworkService>
-Setv6Manual <NetworkService> <NetworkService> <Address> <prefixlength> <Router>
-Getv6AdditionalRoutes <NetworkService>
-Setv6AdditionalRoutes <NetworkService> [ <dest> <prefixlength> <gateway> ]*
-GetDNSServers <NetworkService>
-SetDNSServers <NetworkService> <DNS1> [DNS2] [...]
-GetSearchDomains <NetworkService>
-SetSearchDomains <NetworkService> <Domain1> [Domain2] [...]
-Create6to4Service <NewNetworkServiceName>
-Set6to4Automatic <NetworkService>
-Set6to4Manual <NetworkService> <RelayAddress>
-GetFTPProxy <NetworkService>
-SetFTPProxy <NetworkService> <Domain> <Port number> <authenticated> <UserName> <password>
-SetFTPProxyState <NetworkService> <on off>
-GetWebProxy <NetworkService>
-SetWebProxy <NetworkService> <Domain> <Port number> <authenticated> <UserName> <password>
-SetWebProxyState <NetworkService> <on off>
-GetSecureWebProxy <NetworkService>
-SetSecureWebProxy <NetworkService> <Domain> <Port number> <authenticated> <UserName> <password>
-SetSecureWebProxyState <NetworkService> <on off>
-GetStreamingProxy <NetworkService>
-SetStreamingProxy <NetworkService> <Domain> <Port number> <authenticated> <UserName> <password>
-SetStreamingProxyState <NetworkService> <on off>
-GetGopherProxy <NetworkService>
-SetGopherProxy <NetworkService> <Domain> <Port number> <authenticated> <UserName> <password>
-SetGopherProxyState <NetworkService> <on off>
-GetSocksFirewallProxy <NetworkService>
-SetSocksFirewallProxy <NetworkService> <Domain> <Port number> <authenticated> <UserName> <password>
-SetSocksFirewallProxyState <NetworkService> <on off>
-GetProxyBypassDomains <NetworkService>
-SetProxyBypassDomains <NetworkService> <Domain1> [Domain2] [...]
-GetProxyAutoDiscovery <NetworkService>
-SetProxyAutoDiscovery <NetworkService> <on off>
-GetPassiveFTP <NetworkService>
-SetPassiveFTP <NetworkService> <on off>
-GetAirportNetwork <Device Name>
-SetAirportNetwork <Device Name> <Network> [password]
-GetAirportPower <Device Name>
-SetAirportPower <Device Name> <on off>
-ListPreferredWirelessNetworks <Device Name>
-AddPreferredWirelessNetworkAtIndex <Device Name> <Network> <Index> <security type> [password]
-RemovePreferredWirelessNetwork <Device Name> <Network>
-RemoveAllPreferredWirelessNetworks <Device Name>
-GetNetworkServiceEnabled <NetworkService>
-SetNetworkServiceEnabled <NetworkService> <on off>
-CreateNetworkService <NewNetworkServiceName> <HardwarePort>
-RenameNetworkService <NetworkService> <NewNetworkServiceName>
-DuplicateNetworkService <NetworkService> <NewNetworkServiceName>
-RemoveNetworkService <NetworkService>
-OrderNetworkServices <Service1> <Service2> <Service3> <...>
-GetMTU <HardwarePort or Device Name>
-SetMTU <HardwarePort or Device Name> <value>
-ListValidMTURange <HardwarePort or Device Name>
-GetMedia <HardwarePort or Device Name>
-SetMedia <HardwarePort or Device Name> <subtype> [option1] [option2] [...]
-ListValidMedia <HardwarePort or Device Name>
-CreateVLAN <VLAN Name> <parent Device Name> <tag>
-DeleteVLAN <VLAN Name> <parent Device Name> <tag>
-ListVLANs
-ListDevicesThatSupportVLAN
-IsBondSupported <HardwarePort>
-CreateBond <bondName> <HardwarePort1> <HardwarePort2> <...>
-DeleteBond <bondDeviceName>
-AddDeviceToBond <HardwarePort> <bondDeviceName>
-RemoveDeviceFromBond <HardwarePort> <bondDeviceName>
-ListBonds
-ShowBondStatus <bondDeviceName>
-ListPPPoEServices
-ShowPPPoEStatus <Service Name ie., MyPPPoEService>
-CreatePPPoEService <Device Name ie., en0> <Service Name> <account Name> <password> [PPPoE Service Name]
-DeletePPPoEService <Service Name>
-SetPPPoEAccountName <Service Name> <account Name>
-SetPPPoEPassword <Service Name> <password>
-ConnectPPPoEService <Service Name>
-DisconnectPPPoEService <Service Name>
-GetCurrentLocation
-ListLocations
-CreateLocation <Location Name> [populate]
-DeleteLocation <Location Name>
-SwitchToLocation <Location Name>
-ListAllUserProfiles
-ListLoginProfiles <Service Name>
-EnableSystemProfile <Service Name> <on off>
-EnableLoginProfile <Service Name> <Profile Name> <on off>
-EnableUserProfile <Profile Name> <on off>
-Import8021xProfiles <Service Name> <file path>
-Export8021xProfiles <Service Name> <file path> <yes no>
-Export8021xUserProfiles <file path> <yes no>
-Export8021xLoginProfiles <Service Name> <file path> <yes no>
-Export8021xSystemProfile <Service Name> <file path> <yes no>
-SetTLSIdentityOnSystemProfile <Service Name> <file path> <passphrase>
-SetTLSIdentityOnUserProfile <Profile Name> <file path> <passphrase>
-DeleteSystemProfile <Service Name>
-DeleteLoginProfile <Service Name> <Profile Name>
-DeleteUserProfile <Profile Name>
-Version
-Help
-PrintCommands
動作確認済み環境
- macOS: Mojave(10.14.3, 10.14.6), Monterey(12.6.1)
-
networksetup -version
: v1.8.3, v1.8.4 -
bash --version
: GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)
所感
正午と終業 10 分前に Mac の say
コマンドで音声アナウンス後、10 分経過したら WiFi ルーター(NEC)を再起動するシェル・スクリプトの実行を cron
で叩いています。
しかし、ルーター再起動後にマシンやデバイスの WiFi を再起動(オン・オフ)しないと通信できなくなる現象がボチボチ発生しました。WiFi 自体はつながっているようなのですが。
「使ったことのあるネットワーク」(接続済アクセスポイント)の登録数が多い場合に、似たような現象が発生しやすいのは知っていました。しかし、そうでなくてもストリーミング視聴中に再起動されてリクエスト・タイムアウトが発生すると、顕著なようでした。また、動画のバッファが効いている間に動画を一時停止し、WiFi をオン・オフすれば割と大丈夫な印象です。
おそらく UDP などのストリーム受信中にルーターを再起動されると、クライアントが待ちぼうけを食らうようです。
そこで、WiFi ルーターの再起動をかけたら、本体の WiFi も入れ直す処理を入れようと思ったのですが、「mac
wifi
オン
オフ
コマンド
」を Qiita 記事に絞ってググっても、ここ1年以内に更新・作成された記事でタイトルからわかりやすいものがありませんでした。未来の自分のググラビリティとして。
参考文献
- 「How to manage Wi-Fi with Terminal commands on OS X」@ TechRepublic
- P.44「Viewing or Changing Airport Settings | AirPort Settings | Chap 5 | Mac OS X Server Command-Line Administration」@ Apple 公式 PDF マニュアル
- 「Macで不調なWi-Fiに繋いでいるときに自動でON/OFFするスクリプト」@ Qiita
- 「MacでWiFi通信が切れたときに通信デバイスを自動で再起動するやつ」@ Qiita