bash
我尝试在Mac 上的脚本中连接到特定的 WiFi 网络。
我想要实现的两件事:
连接到指定的网络。我已经尝试过了
networksetup -setairportnetwork en0 [network_ID]
,我可以从顶部菜单栏中看到Mac正在尝试连接到网络,但最终失败了。我应该注意,网络受密码保护,并且密码存储在钥匙串中,因为当我手动加入该网络时不需要输入密码。暂停脚本其余部分的执行,直到成功建立连接。
有什么建议吗?
答案1
1) 连接无线网络
您想要添加密码。虽然passkey
由于我的 WiFi 网络 BSSID 在我的钥匙串中,我只能切换到它并通过将密钥以明文形式直接添加到命令行来成功登录。其他的都没起作用。
网络设置 -setairportnetwork [en0] [network_BBSSID][密码]
2) 暂停脚本直到连接
您可以简单地测试上面命令的错误代码(echo $?
)。请小心,因为网络设置错误代码并不简单,grep“失败”可能会有所帮助:
networksetup -setairportnetwork en0 mywifi mypass | grep -ic "failed"
如果结果是0你应该很好。您还可以直接测试实际连接,而不是简单地连接到 wifi(更好的选择恕我直言),例如您可以检查是否可以ping
您的网络或互联网上的主机。你应该把所有这些放在一个while :
循环,它将重试该命令,直到结果为 0。或者您可以添加一个read
对您的命令的声明将暂停脚本(我对您问题的理解)。
最后你可能想添加一个暂停如果一段时间后没有网络加入,则终止网络设置:超时命令,一部分gnu coreutils可能会派上用场。它可以通过brew包管理器安装:brew install coreutils
。
3) 1 班轮建议
! gtimeout 10s networksetup -setairportnetwork en0 mywifi mypass >/dev/null && echo 1 || { ping -oq www.apple.com 2>&- >/dev/null && echo "Connected" || read -n1 -r -p "Connection failed. Press any key to continue..." ; } ;
gtimeout
: gnutls 添加G默认情况下为其命令添加前缀,以避免与同名的现有默认实用程序混淆
/dev/null, 2>&-
:避免打印各种命令的输出和错误代码
read -n 1
:暂停直到按下按键