jamf self service 某一些脚本 包含 共同的代码,,,怎么包含 jamf脚本工作共享代码
要
好,我给你写一个完整的示例:
🎯 场景
你有多个 Jamf Self Service 脚本,它们都需要用到一些公共函数(比如日志函数、清理函数)。
我们把公共函数抽出来放在一个 common.sh 文件里,通过 Jamf 部署到所有 Mac。
Self Service 脚本再去 source 这个公共脚本即可。
① 公共脚本 common.sh
保存为 /usr/local/jamf-shared/common.sh (路径可以自定义,但建议统一)。
部署方法:
在 Jamf Pro 创建一个 Policy,脚本里写:
设置为 Recurring Check-in 或 一次性执行,确保所有 Mac 都有这个文件。
② Self Service 脚本示例 1
比如安装某个软件:
③ Self Service 脚本示例 2
比如清理缓存:
④ 好处
公共逻辑只写在 common.sh,维护一次即可。
所有 Self Service 脚本都能共享函数。
如果后续要新增函数(比如检测网络、获取 Jamf 计算机 ID),只需要修改 common.sh,所有脚本自动更新。
要不要我再帮你扩展一下 common.sh,加一些 常用函数模板(比如获取当前用户、检测网络、获取 Jamf Computer ID)?
不同的脚本 调用 策略 sudo -E jamf policy -id 251 ,,如何把参数传过去
在 Jamf Pro 中,如果你想要 通过脚本调用策略 (sudo jamf policy -id 251) 并传递参数,有几种可行的方法,具体取决于你希望参数如何被接收和使用:
方法 1:使用 -event 触发策略(推荐)
Jamf Pro 允许使用 自定义触发事件(Custom Events) 来执行策略,并利用 脚本参数 传递变量:
步骤:
在 Jamf Pro 策略中配置 Custom Event
在脚本中调用策略,并带上参数
#!/bin/bash
sudo -E jamf policy -event "custom-policy-251" # 触发策略
让策略读取参数(通过脚本)
如果需要传递脚本参数(如 $1, $2),可以:
#!/bin/bash
param1="value1"
param2="value2"
sudo -E jamf policy -event "custom-policy-251-${param1}-${param2}"
然后在策略的脚本中使用 echo "$4"(Jamf 脚本参数从 $4 开始)解析:
#!/bin/bash
event_param="$4" # Jamf 脚本参数从 $4 开始
param1=$(echo "$event_param" | cut -d'-' -f4) # 获取 value1
param2=$(echo "$event_param" | cut -d'-' -f5) # 获取 value2
👉 优点:
✅ 利用 Jamf 原生的 -event 触发机制
✅ 可传递简单参数
👉 缺点:
❌ 如果参数包含特殊字符(如 /、=、空格),需要额外处理(sed 或 base64 编码)
方法 2:利用 Jamf Script Parameters(间接传递)
如果在策略中调用了脚本,可以 通过 Script Parameters 传递数据:
步骤:
在脚本中生成参数
#!/bin/bash
param1="hello"
param2="world"
sudo -E jamf policy -id 251 -scriptParam1 "$param1" -scriptParam2 "$param2"
在策略中的脚本读取参数
👉 优点:
✅ 可传递复杂参数(JSON、多行文本)
✅ 可结合 plist 或 json 存放结构化数据
👉 缺点:
❌ 临时文件可能不安全(需确保权限正确)
方法 3:通过变量扩展(最简单但有限制)
如果你的参数 直接来源于环境变量,可以用 -E 传递 当前环境变量:
#!/bin/bash
export MY_PARAM="my_value"
sudo -E jamf policy -id 251 # 策略脚本可以通过 `$MY_PARAM` 读取
然后,在策略的脚本中:
#!/bin/bash
echo "参数是: $MY_PARAM"
👉 优点:
✅ 简单易用
👉 缺点:
❌ 仅限于环境变量
❌ 可能被 sudo 的 env_reset 限制(检查 /etc/sudoers)
最佳实践
| 方法
| 适用场景
| 推荐指数
|
|---|
-event 触发
| 传递少量参数(如设备 ID、用户名) | ⭐⭐⭐⭐⭐ |
| 临时文件
| 复杂参数(JSON、长字符串) | ⭐⭐⭐⭐ |
| 环境变量
| 必须 sudo 保会话环境 | ⭐⭐ |
如果你仅需要传递简单参数(如设备 ID、用户名),方法 1(-event)是最高效的。
如果需要传递结构化数据(如 JSON、配置文件),则方法 2(临时文件)更可靠。
总结
-event 触发(适合简单参数)
临时文件(适合复杂数据)
环境变量(有限制)
简单参数的推荐方案:
sudo -E jamf policy -event "custom-policy-$param1-$param2"
复杂参数的推荐方案:
echo "$param1" > /tmp/param.txt
sudo -E jamf policy -id 251
如果你有具体的参数需求(如格式、来源),可以进一步优化方案! 🚀
jamf 策略使用的是脚本,,,,,每个脚本 都包含一个相同的文件,,并且把 参数传给这个文件
你的描述看起来是关于 Jamf Pro 管理 macOS 设备时使用脚本(Scripts)的场景。具体来说,你提到的场景可能是:
多个 Jamf 策略(Policies)都调用不同的脚本,但这些脚本都包含一个共同的文件(比如某个可执行文件或工具),并且每个脚本都需要向这个共同文件传递不同的参数。
可能的解决方案:
1. 将共享文件放在固定位置,所有脚本引用它
将共享的二进制文件(如 .sh、.py 或可执行文件)上传到 Jamf Pro(通过“脚本”或“文件”模块),然后通过策略分发到设备的固定路径(如 /usr/local/bin/ 或 /Library/Application Support/CompanyName/)。
在所有脚本中,通过绝对路径调用该文件,并传递参数。例如:
#!/bin/bash
/usr/local/bin/shared_tool --param1 value1 --param2 value2
2. 通过 Jamf 脚本参数动态传递变量
3. 使用 jamf 二进制读取扩展属性(Extension Attributes)
4. 打包共享文件为 .pkg 并预先部署
注意事项:
权限问题
路径一致性
日志记录
如果你能提供更具体的需求(比如共享文件的类型、参数如何生成等),我可以进一步优化方案!