【问题标题】:Mac daemon not able to run bash scriptMac 守护程序无法运行 bash 脚本
【发布时间】:2021-01-12 02:47:26
【问题描述】:

操作系统 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 描述符中添加&lt;string&gt;open&lt;/string&gt; 作为ProgramArguments 的第一项,则没有错误。但是,我不想以这种方式运行脚本,因为它每次都会启动一个新的终端窗口,这非常烦人。

我的问题

如何让我的守护进程执行netspeed

附言

launchctl 状态码是126

$ launchctl list | grep myself
-   126 com.myself.iperfclient

【问题讨论】:

    标签: macos permissions launchd launchctl


    【解决方案1】:

    这就是我最终做的事情(答案发布在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"
    

    然后我将已启动 plist 中的 ProgramArguments 条目更新为:

    <key>ProgramArguments</key>
    <array>
        <string>/usr/bin/osascript</string>
        <string>/Users/myself/Documents/bin/iperf/netspeed.scpt</string>
    </array>
    

    最后,在System Preferences &gt; Security and Privacy &gt; 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>
    

    【讨论】:

      猜你喜欢
      • 2013-05-16
      • 2013-10-14
      • 2014-09-05
      • 2018-02-15
      • 1970-01-01
      • 2014-07-17
      • 1970-01-01
      • 2013-09-28
      相关资源
      最近更新 更多