我正在尝试编写一个 shell 脚本,该脚本首先连接到特定的 SSID(我之前连接过的 SSID,首选网络)。我似乎可以通过命令行执行此操作的唯一方法是:
networksetup -setairportnetwork en0 "MyAP" "PASSWORD"
如何才能连接到“MyAP”网络,而无需在 shell 脚本中不安全地存储密码?
答案1
有Allan Odgaard 的精彩教程在 texmate 博客上,它描述了如何从命令行使用 keychain 实用程序来检索密码(以及其他操作)。我建议通读它以及相应的评论。您可以创建一个通用函数,例如
#!/bin/bash
get_pw () {
security 2>&1 >/dev/null find-generic-password -ga "$1" \
| ruby -e 'print $1 if STDIN.gets =~ /^password: "(.*)"$/'
}
pass=$(get_pw $1)
echo $pass
为了以编程方式完成此操作,而无需用户确认,您需要授予security
二进制文件(在我的 10.11.2 安装中,它位于/usr/bin/security
)访问特定密码的权限。这可以通过以下两种方式之一完成:
通过从终端执行以下操作
security add-generic-password -a "account name" -s "service name" -T "/usr/bin/security" -U
正如 davidacland 在他的JAMFNation 响应。笔记:我无法使用现有的钥匙扣物品重现此情况(正如 davidacland 的回复所暗示的,这是可能的)。
-或者-
- 使用钥匙串访问.appGUI 手动添加
security
到钥匙串项目的访问控制列表:钥匙串访问 GUI -> 双击钥匙串项目 -> 访问控制
答案2
如果它是第一个可用的首选网络(网络偏好设置、高级,选中“记住此计算机已加入的网络”)并且您没有选中“需要管理员授权:- 打开或关闭 Wi-Fi”,则可以使用
networksetup -setairportpower en0 off
然后按 by 键
networksetup -setairportpower en0 on
,它将连接到第一个可用的首选网络,而无需密码(在 OS X 10.9.4 上尝试过)。
如果你执行networksetup -help
最后一个输出行是
任何需要密码的命令都会接受 - 表示应该从标准输入读取密码。