Демон Mac не может запустить скрипт bash

ОС MacOS 10.15.17 (Каталина)

Я хочу создать скрипт, который использует 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?

P.S.

Код состояния launchctl: 126.

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

person owengall    schedule 12.01.2021    source источник


Ответы (1)


Вот что я в итоге сделал (ответ опубликован на странице Ask Different):

Я попробовал ответ от Гилби, но не смог заставить fdautil работать после загрузки и установки через пробную версию LaunchControl.

Если бы это сработало, похоже, это было бы сделано путем предоставления утилите LaunchControl fdautil полного доступа к диску, которая затем каким-то образом использовала бы эти разрешения для выполнения моего сценария netspeed (без передачи этих разрешений /bin/bash?).

Способ 1: оболочка AppleScript

Я создал Users/myself/Documents/bin/iperf/netspeed.scpt, который имеет следующее:

do shell script "/Users/myself/Documents/bin/iperf/netspeed"

Затем я обновил запись ProgramArguments в списке launchd на:

<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>
person owengall    schedule 12.01.2021