问题描述
操作系统 MacOS 10.15.17 (Catalina)
我想创建一个脚本,该脚本使用 iperf 启动一个客户端,该客户端在很长一段时间内每隔几秒测量一次我的连接速度。我创建了一个守护程序文件并将其放入 ~/Library/LaunchAgents/com.myself.iperfclient.plist
。
com.myself.iperfclient.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.myself.iperfclient</string>
<key>ProgramArguments</key>
<array>
<string>/Users/myself/Documents/bin/iperf/netspeed</string>
</array>
<key>StartInterval</key>
<integer>20</integer> <!-- in seconds -->
<key>disabled</key>
<false/>
</dict>
</plist>
网速
#!/bin/bash
# see https://stackoverflow.com/a/246128/10200417
script_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
script_name=`basename $0`
# echo "called script $script_name from $script_dir"
iperf_server=127.0.0.1
iperf_port=54321
# launch iperf client,log results to ./logs/client.log
iperf \
-c $iperf_server \
-p $iperf_port \
--logfile $script_dir/logs/client.log
netspeed
文件对任何人都可以执行:
$ ls -l netspeed
-rwxr-xr-x@ 1 myself staff 379 Jan 11 21:36 netspeed
当我尝试使用 launchctl load ~/Library/LaunchAgents/com.myself.iperfclient.plist
添加新守护程序时,这是我在控制台中收到的错误消息:
SandBox: bash(50654) System Policy: deny(1) file-read-data /Users/myself/Documents/bin/iperf/netspeed
如果在守护进程的 .plist
描述符中添加 <string>open</string>
作为 ProgramArguments
中的第一项,则没有错误。但是,我不想以这种方式运行脚本,因为它每次都会启动一个新的终端窗口,这非常烦人。
我的问题
如何允许我的守护进程执行 netspeed
?
附注
launchctl 状态码为 126。
$ launchctl list | grep myself
- 126 com.myself.iperfclient
解决方法
这是我最终做的事情(答案发布在 Ask Different 上):
我尝试了 the answer from Gilby,但在通过 LaunchControl 试用版下载并安装 fdautil 后无法使其工作。
如果它有效,它似乎可以通过授予 LaunchControl 的 fdautil 实用程序完整磁盘访问权限来实现,然后以某种方式使用这些权限来执行我的 netspeed
脚本(不通过/bin/bash
的那些权限?)。
方法 1:AppleScript 包装器
我创建了 Users/myself/Documents/bin/iperf/netspeed.scpt
,它具有以下内容:
do shell script "/Users/myself/Documents/bin/iperf/netspeed"
然后我将 launchd plist 中的 ProgramArguments 条目更新为:
<key>ProgramArguments</key>
<array>
<string>/usr/bin/osascript</string>
<string>/Users/myself/Documents/bin/iperf/netspeed.scpt</string>
</array>
最后,在 System Preferences > Security and Privacy > Files and Folders
中,我能够将 Users/myself/Documents
的访问权限授予 /usr/bin/osascript
,并成功启动守护程序。
方法 2:将脚本放在安全性较低的位置
正如@user3439894 所指出的,由于最初难以执行 netspeed
的主要原因是我将它放在 ~myself/Documents.../
中,它具有较高的权限要求,我也可以将把它放在一个不太安全的地方。
我按照建议尝试了 /Users/Shared/.../netspeed
,它确实适用于我的原始脚本和 plist 内容!需要明确的是,ProgramArguments 现在应该是:
<key>ProgramArguments</key>
<array>
<string>/Users/Shared/.../netspeed</string>
</array>