2 个版本
0.1.1 | 2020 年 12 月 26 日 |
---|---|
0.1.0 | 2020 年 12 月 25 日 |
#2414 in 命令行工具
11KB
56 行
cpcalendars
一个非常简单的 CLI 应用,用于将 Mac OS Calendar.app 日历源复制到其他位置。
将 Mac OS Calendar 应用中的日历资源复制到指定的目录,创建一个伪 ICBU 文件。此文件构成了您日历的全面备份。
首次运行时,需要通过系统完整性保护系统授予日历应用的权限。
安装
推荐的安装选项是使用 Homebrew,命令如下
brew install bglezseoane/tap/cpcalendars
您只能使用 Cargo 命令安装程序
cargo install cpcalendars
使用
该工具的正常使用非常简单。您只需运行
cpcalendars <destination>
名为 All Calendars.icbu
的文件夹将保存到 <destination>
。
对抗 Mac OS 系统完整性保护的权限
如果您的当前 终端应用 有 Calendars.app 访问权限 或 完整磁盘访问权限,并且您从那时起使用 cpcalendars
,则该工具将正常工作。如果您只想从您的终端或您从终端使用的脚本中与 cpcalendars
一起工作,则上述内容就足够了,以下步骤与您的用例无关。
否则,如果您想从作为 launchd
代理的脚本程序中使用此工具,则由于系统完整性保护,工具将失败。
Mac OS 系统完整性保护阻止 cpcalendars
,因为它尝试访问受保护的 Calendars.app 目录,并且它不继承权限——在终端中使用时,继承终端授予的权限——。要获得权限,您需要运行以下命令
open -a '/usr/local/bin/cpcalendars' --args "<tmp_destination>"
运行上述命令时,将弹出一个窗口,您可以授予 cpcalendars
访问您的日历的权限。 请执行此操作,然后下次工具将正常工作。
如果使用 Cargo 安装,路径 /usr/local/bin/cpcalendars
可能不同。无论如何,您可以使用 which cpcalendars
检查它。
如果您的代理只需要运行工具而没有其他内容,您可以将以下行添加到代理 Info.plist
中,它将正常工作(在之前指示的第一次执行后)
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/cpcalendars</string>
<string>destination</string>
</array>
由于需要将工具与从 launchd
代理和 集成在 shell 脚本中 以来一起工作,无论出于何种原因,您都需要始终以以下方式运行它:open -'/usr/local/bin/cpcalendars' --args "<destination>"
的形式运行,而不是直接作为命令(例如:/usr/local/bin/cpcalendars <destination>
)。也就是说,如果您使用以下代理规范...
<key>ProgramArguments</key>
<array>
<string>/Users/You/scripts/script_which_calls_cpcalendars.sh</string>
</array>
...您需要按照以下方式运行 cpcalendars
# 'script_which_calls_cpcalendars.sh'
# ...
open -a '/usr/local/bin/cpcalendars' --args "<destination>"
# And not '/usr/local/bin/cpcalendars <destination>
# ...
当使用 open -
运行时,如果启动的应用程序失败,则命令不会返回错误代码,因此为了将此步骤集成到设计良好的脚本中,建议采取以下方法
# ...
# Create temporary file to save the output of the 'open' command
TMP_OPEN_CPCALENDARS_STDOUT=$(mktemp -t open_cpcalendars)
# Run and wait
open -W -a '/usr/local/bin/cpcalendars' \
--stdout "$TMP_OPEN_CPCALENDARS_STDOUT" \
--stderr "$TMP_OPEN_CPCALENDARS_STDOUT" \
--args <destination>
# Check and act attending to the process success
if grep -Fxq 'Error' "$TMP_OPEN_CPCALENDARS_STDOUT" \
|| ! grep -Fxq 'Process finished successfully.' "$TMP_OPEN_CPCALENDARS_STDOUT"
then
>&2 echo "Error using 'cpcalendars'."
rm "$TMP_OPEN_CPCALENDARS_STDOUT"
exit 1
fi
# Clean
rm "$TMP_OPEN_CPCALENDARS_STDOUT"
# ...
动机
在我的 Mac OS 机器上,我有一些脚本不能作为代理工作,因为系统完整性保护阻止了它们,只允许授权二进制程序。加上我想学习 Rust 语言的事实,这促使我编写了这个简单的程序,以便在编译程序中将冲突步骤授权,并保持我的脚本流程优雅——而不是将 shell 脚本伪编译并插入到编译语言程序中。然而,最终 cpcalendars
是一个具有潜在用途的通用程序。
依赖项
~3.5MB
~57K SLoC