如何配置macOS上rsync权限,解决跨Mac同步的沙箱错误?
macOS Monterey远程rsync沙箱权限问题解决方法
问题概述
在Big Sur(客户端,系统自带/brew版rsync均异常)与Monterey(远程端)间使用rsync同步文件时,频繁出现以下权限错误:
- 目录打开失败:
rsync: opendir ".../Desktop/." failed: Operation not permitted (1) - 文件时间设置失败:
rsync: failed to set times on ".../subfolder": Operation not permitted (1) - 文件重命名失败:
rsync: rename ".../file.A7IqZh" -> ".../file": Operation not permitted (1) - 文件读取失败(从远程拉取时):
rsync: send_files failed to open ".../myfile.txt": Operation not permitted (1)
远程端控制台明确提示沙箱拦截:
System Policy: rsync(xxxx) deny(1) file-write-times /xxx/subfolder System Policy: rsync(xxxx) deny(1) file-read-data /xxx/myfile.txt
已尝试给/usr/bin/rsync、/usr/bin/ssh、/usr/sbin/sshd、/bin/sh及Terminal.app授予全磁盘访问权限,显式指定ssh和rsync路径,均未解决问题,且两台机器用户名、UID/GID完全一致。
解决方案
1. 给远程端sshd授予全磁盘访问权限
这是最直接的解决方法,因为rsync通过ssh连接时,远程端的rsync进程由sshd启动,权限继承自sshd:
- 打开「系统偏好设置」→「安全性与隐私」→「隐私」标签页
- 找到「全磁盘访问权限」,点击左下角锁图标解锁
- 点击+号,按
Cmd+Shift+G输入/usr/sbin/,选择sshd添加到权限列表 - 重启远程端sshd服务:
sudo launchctl stop com.openssh.sshd && sudo launchctl start com.openssh.sshd
2. 临时规避:跳过文件时间同步
如果全磁盘访问配置后仍有部分错误,可临时添加--no-times参数跳过文件时间戳设置,避免file-write-times类型的沙箱拦截(但会丢失文件时间信息):
rsync -ra --no-times --progress --copy-links --delete Desktop/ mac2.local:/Users/myuser/Desktop/from-mac1/Desktop/
3. 自定义沙箱策略(进阶)
若上述方法无效,可通过修改沙箱规则允许rsync的必要操作(需关闭SIP,谨慎执行):
- 创建自定义沙箱规则文件
rsync-sandbox-profile.sb:
(allow file-read-data file-write-data file-write-times file-rename file-delete)
- 将文件复制到系统沙箱配置目录:
sudo cp rsync-sandbox-profile.sb /Library/Sandbox/Profiles/
- 修改sshd的启动配置文件
/System/Library/LaunchDaemons/com.openssh.sshd.plist,在ProgramArguments数组中添加沙箱规则参数:
<array> <string>/usr/sbin/sshd</string> <string>-i</string> <string>-s</string> <string>/Library/Sandbox/Profiles/rsync-sandbox-profile.sb</string> </array>
- 重启sshd服务:
sudo launchctl stop com.openssh.sshd && sudo launchctl start com.openssh.sshd
4. 使用签名版Homebrew rsync(备选)
若不想修改系统配置,可给Homebrew安装的rsync签名后使用:
- 安装rsync:
brew install rsync
- 创建自签名代码证书:
- 打开「钥匙串访问」→「证书助理」→「创建证书」
- 名称设为
rsync-cert,证书类型选「代码签名」,勾选「让我覆盖这些默认值」,按指引完成创建 - 在钥匙串中找到该证书,右键→「显示简介」→「信任」→「代码签名」设置为「始终信任」
- 签名rsync二进制:
codesign -s rsync-cert /usr/local/bin/rsync
- 远程端执行相同的安装和签名操作,同步时指定rsync路径:
rsync -e "ssh" --rsync-path="/usr/local/bin/rsync" -ra --progress --copy-links --delete Desktop/ mac2.local:/Users/myuser/Desktop/from-mac1/Desktop/
内容的提问来源于stack exchange,提问作者Clam
相关产品推荐
相关产品推荐

