通过Intune推送Apple Remote Desktop脚本时出现print方法调用错误
问题背景
通过Microsoft Intune以root权限推送以下ARD配置脚本时触发Perl错误:
#!/bin/sh sudo /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/kickstart -activate -configure -allowAccessFor -specifiedUsers -clientopts -setdirlogins -dirlogins yes
错误信息:
Can't call method "print" on an undefined value at /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/kickstart line 695.
对应kickstart代码片段:
IO::File->new(">${TargetDisk}${RemoteManagementLaunchdFile}")->print("enabled"); Echo('MSG_ACTIVATED_REMOTE_MANAGEMENT');
该脚本在设备本地以root运行时完全正常,仅Intune推送时报错。
错误成因分析
以下是导致该问题的核心原因,均指向Intune MDM执行环境与本地root环境的差异:
MDM执行上下文的文件系统写入限制
尽管Intune以root权限执行脚本,但MDM框架的沙箱机制可能限制了对特定系统目录的写入权限。${TargetDisk}${RemoteManagementLaunchdFile}指向的是ARD启用标记文件(通常位于/Library/LaunchDaemons相关路径),在MDM后台执行环境中,该路径可能被锁定或禁止写入,导致IO::File->new调用失败返回undef,进而触发print方法调用的错误。环境变量初始化不全
本地交互式root shell会自动加载完整的环境变量,而Intune的无交互后台执行环境中,${TargetDisk}等变量可能未被正确初始化,导致拼接后的目标文件路径无效(比如为空或指向不存在的目录),最终无法创建文件。系统资源冲突
Intune推送脚本时,MDM自身可能正在管理RemoteManagement服务的配置,导致目标文件被系统进程锁定,kickstart无法写入。而本地运行时不存在这种MDM与ARD配置进程的资源冲突。执行上下文的路径解析差异
无交互的MDM执行环境中,部分关键环境变量(如PATH、HOME)缺失,可能导致kickstart脚本内部的路径解析逻辑出错,无法定位到正确的目标文件路径。
内容的提问来源于stack exchange,提问作者Jacob Young

