欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

jamf self service 某一些脚本 包含 共同的代码,怎么包含 jamf脚本工作共享代码,,,,不同的脚本 调用 策略 sudo -E jamf policy -id 251 ,如何把参数传过去,,,,jamf 策略使用的是脚本,,,,,每个脚本 都包含一个相同的文件,,并且把 参数传给这个文件 AG chatgpt 有大用 有大大用

jamf self service 某一些脚本 包含 共同的代码,,,怎么包含  jamf脚本工作共享代码

Jamf Self Service 里维护多个脚本时,如果它们之间有一部分「共同的代码」,常见的做法有以下几种:


🔹 方法 1:用外部共享脚本文件

  1. 把公共代码写成一个 独立的脚本文件,比如 /usr/local/jamf-shared/common.sh

    #!/bin/bash # common.sh - 公共函数和变量 log(){    echo "$(date '+%Y-%m-%d %H:%M:%S') $1" } cleanup(){    rm -rf /tmp/mytemp }                                        

                                    

  2. 在每个 Jamf 脚本里用 source 引入:

    #!/bin/bash source /usr/local/jamf-shared/common.sh log "开始执行脚本" cleanup                                        

                                  

  3. 公共脚本可通过 一个 Jamf Policy 部署到所有目标机器,放到固定路径。


🔹 方法 2:用 Jamf 参数传递(适合小片段)

  • Jamf Script 里支持 Parameter Values ($4, $5 …)

  • 可以把常用函数/命令定义成一个参数传进去。

  • 但这种方式不适合大块代码,主要用于统一的路径、命令行参数。


🔹 方法 3:用 Extension Attribute 或 Configuration Profile

  • 如果公共代码只是一些变量(比如服务器地址、版本号),可以存在 EA 或配置文件里。

  • 脚本只需要 defaults readjamf getComputerAttribute 取值。


🔹 方法 4:把公共逻辑放进一个独立 Policy       # OK    有大用                            

  • 把公共代码抽成一个 Policy,比如“初始化环境”。

  • 其他脚本在运行前调用:

    sudo jamf policy -event init_env                                                    
  • 或者 sudo jamf policy -id  112      #   112 就 事件的id

                                   

  • 这样代码只维护在一个地方。


推荐实践

  • 如果是函数/逻辑 → 方法 1(source 公共文件)。

  • 如果是变量/配置 → 方法 3(EA 或配置文件)。

  • 如果是流程步骤 → 方法 4(自定义触发事件)。


要不要我帮你写一个 完整示例(比如公共 common.sh + Self Service 里调用的脚本)?


您说:
ChatGPT 说:

好,我给你写一个完整的示例:


🎯 场景

  • 你有多个 Jamf Self Service 脚本,它们都需要用到一些公共函数(比如日志函数、清理函数)。

  • 我们把公共函数抽出来放在一个 common.sh 文件里,通过 Jamf 部署到所有 Mac。

  • Self Service 脚本再去 source 这个公共脚本即可。


① 公共脚本 common.sh                            

保存为 /usr/local/jamf-shared/common.sh (路径可以自定义,但建议统一)。

#!/bin/bash # # common.sh - 公共函数库 # 日志函数 log(){    echo "$(date '+%Y-%m-%d %H:%M:%S') [INFO] $1" } # 错误处理函数 error_exit(){    echo "$(date '+%Y-%m-%d %H:%M:%S') [ERROR] $1"    exit 1 } # 清理函数 cleanup(){    rm -rf /tmp/mytemp    log "已清理临时文件" }                                
                           

部署方法:

  1. 在 Jamf Pro 创建一个 Policy,脚本里写:

    #!/bin/bash mkdir -p /usr/local/jamf-shared cat > /usr/local/jamf-shared/common.sh <<'EOF' #!/bin/bash log(){    echo "$(date '+%Y-%m-%d %H:%M:%S') [INFO] $1" } error_exit(){    echo "$(date '+%Y-%m-%d %H:%M:%S') [ERROR] $1"    exit 1 } cleanup(){    rm -rf /tmp/mytemp    log "已清理临时文件" } EOF chmod 755 /usr/local/jamf-shared/common.sh                                        

                                       


                                       

  2. 设置为 Recurring Check-in一次性执行,确保所有 Mac 都有这个文件。


② Self Service 脚本示例 1

比如安装某个软件:

#!/bin/bash # Self Service 脚本 1 - 安装软件 # 引入公共函数 source /usr/local/jamf-shared/common.sh log "开始安装 Google Chrome..." # 示例安装逻辑 if ! /usr/bin/which google-chrome &>/dev/null; then    log "下载并安装 Chrome..."    # 这里写 curl + installer 逻辑 else    log "Chrome 已经安装" fi cleanup log "安装脚本完成"                                
                           

③ Self Service 脚本示例 2

比如清理缓存:

#!/bin/bash # Self Service 脚本 2 - 清理缓存 # 引入公共函数 source /usr/local/jamf-shared/common.sh log "开始清理缓存..." rm -rf ~/Library/Caches/* rm -rf /Library/Caches/* cleanup log "缓存清理完成"                                
                           

④ 好处

  • 公共逻辑只写在 common.sh,维护一次即可。

  • 所有 Self Service 脚本都能共享函数。

  • 如果后续要新增函数(比如检测网络、获取 Jamf 计算机 ID),只需要修改 common.sh,所有脚本自动更新。


要不要我再帮你扩展一下 common.sh,加一些 常用函数模板(比如获取当前用户、检测网络、获取 Jamf Computer ID)?                            

好,我给你写一个完整的示例:


🎯 场景

  • 你有多个 Jamf Self Service 脚本,它们都需要用到一些公共函数(比如日志函数、清理函数)。

  • 我们把公共函数抽出来放在一个 common.sh 文件里,通过 Jamf 部署到所有 Mac。

  • Self Service 脚本再去 source 这个公共脚本即可。


① 公共脚本 common.sh

保存为 /usr/local/jamf-shared/common.sh (路径可以自定义,但建议统一)。

#!/bin/bash # # common.sh - 公共函数库 # 日志函数 log(){    echo "$(date '+%Y-%m-%d %H:%M:%S') [INFO] $1" } # 错误处理函数 error_exit(){    echo "$(date '+%Y-%m-%d %H:%M:%S') [ERROR] $1"    exit 1 } # 清理函数 cleanup(){    rm -rf /tmp/mytemp    log "已清理临时文件" }    



部署方法:

  1. 在 Jamf Pro 创建一个 Policy,脚本里写:

    #!/bin/bash mkdir -p /usr/local/jamf-shared cat > /usr/local/jamf-shared/common.sh <<'EOF' #!/bin/bash log(){    echo "$(date '+%Y-%m-%d %H:%M:%S') [INFO] $1" } error_exit(){    echo "$(date '+%Y-%m-%d %H:%M:%S') [ERROR] $1"    exit 1 } cleanup(){    rm -rf /tmp/mytemp    log "已清理临时文件" } EOF chmod 755 /usr/local/jamf-shared/common.sh            

           


           

  2. 设置为 Recurring Check-in一次性执行,确保所有 Mac 都有这个文件。


② Self Service 脚本示例 1

比如安装某个软件:

#!/bin/bash # Self Service 脚本 1 - 安装软件 # 引入公共函数 source /usr/local/jamf-shared/common.sh log "开始安装 Google Chrome..." # 示例安装逻辑 if ! /usr/bin/which google-chrome &>/dev/null; then    log "下载并安装 Chrome..."    # 这里写 curl + installer 逻辑 else    log "Chrome 已经安装" fi cleanup log "安装脚本完成"    




③ Self Service 脚本示例 2

比如清理缓存:

#!/bin/bash # Self Service 脚本 2 - 清理缓存 # 引入公共函数 source /usr/local/jamf-shared/common.sh log "开始清理缓存..." rm -rf ~/Library/Caches/* rm -rf /Library/Caches/* cleanup log "缓存清理完成"    




④ 好处

  • 公共逻辑只写在 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) 来执行策略,并利用 脚本参数 传递变量:

步骤:

  1. 在 Jamf Pro 策略中配置 Custom Event

  • 取消勾选现有的触发条件(如周期性检查、重新加入等)。

  • 勾选 "Custom Event",并输入事件名称,例如 custom-policy-251

  • 在脚本中调用策略,并带上参数

    bash            
    #!/bin/bash sudo -E jamf policy -event "custom-policy-251"  # 触发策略            

       

  • 让策略读取参数(通过脚本)

    • 如果需要传递脚本参数(如 $1$2),可以:

      bash                
      #!/bin/bash param1="value1" param2="value2" sudo -E jamf policy -event "custom-policy-251-${param1}-${param2}"                

             

    • 然后在策略的脚本中使用 echo "$4"(Jamf 脚本参数从 $4 开始)解析:

      bash                
      #!/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 传递数据

    步骤:

    1. 在脚本中生成参数

      bash            
      #!/bin/bash param1="hello" param2="world" sudo -E jamf policy -id 251 -scriptParam1 "$param1" -scriptParam2 "$param2"            

         

    • -scriptParam1 不是 Jamf 原生支持的,但你可以存入临时文件

      bash                
      echo "$param1" > /tmp/param1.txt echo "$param2" > /tmp/param2.txt sudo -E jamf policy -id 251                

             

  • 在策略中的脚本读取参数

    • 该策略执行的脚本 从临时文件读取

      bash                
      #!/bin/bash param1=$(cat /tmp/param1.txt) param2=$(cat /tmp/param2.txt) echo "参数是: $param1, $param2" rm /tmp/param{1,2}.txt  # 清理临时文件                

             

    👉 优点
    ✅ 可传递复杂参数(JSON、多行文本)
    ✅ 可结合 plist 或 json 存放结构化数据

    👉 缺点
    ❌ 临时文件可能不安全(需确保权限正确)


    方法 3:通过变量扩展(最简单但有限制)

    如果你的参数 直接来源于环境变量,可以用 -E 传递 当前环境变量

    bash    
    #!/bin/bash export MY_PARAM="my_value" sudo -E jamf policy -id 251  # 策略脚本可以通过 `$MY_PARAM` 读取    


    然后,在策略的脚本中:

    bash    
    #!/bin/bash echo "参数是: $MY_PARAM"    


    👉 优点
    ✅ 简单易用

    👉 缺点
    ❌ 仅限于环境变量
    ❌ 可能被 sudo 的 env_reset 限制(检查 /etc/sudoers


    最佳实践

    方法            适用场景            推荐指数            
    -event 触发            传递少量参数(如设备 ID、用户名)⭐⭐⭐⭐⭐
    临时文件            复杂参数(JSON、长字符串)⭐⭐⭐⭐
    环境变量            必须 sudo 保会话环境⭐⭐

    如果你仅需要传递简单参数(如设备 ID、用户名),方法 1(-event)是最高效的。
    如果需要传递结构化数据(如 JSON、配置文件),则方法 2(临时文件)更可靠。


    总结

    • sudo -E jamf policy -id 251 自身无法直接传参,但可用:

    1. -event 触发(适合简单参数)

    2. 临时文件(适合复杂数据)

    3. 环境变量(有限制)

  • 简单参数的推荐方案:

    bash            
    sudo -E jamf policy -event "custom-policy-$param1-$param2"            

       

  • 复杂参数的推荐方案:

    bash            
    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/)。

    • 在所有脚本中,通过绝对路径调用该文件,并传递参数。例如:

      bash            
      #!/bin/bash /usr/local/bin/shared_tool --param1 value1 --param2 value2            

         

    2. 通过 Jamf 脚本参数动态传递变量

    • Jamf 策略可以向脚本传递参数(通过策略配置中的 Script Parameters 字段)。

    • 在脚本中接收这些参数,然后传给共享文件。例如:

      bash            
      #!/bin/bash /path/to/shared_file "$4" "$5"  # $4 和 $5 是 Jamf 传递的参数            

         

    3. 使用 jamf 二进制读取扩展属性(Extension Attributes)

    • 如果你需要动态决定共享文件的参数,可以通过 Jamf 扩展属性(EA) 在设备上生成配置,然后在脚本中读取。例如:

      bash            
      #!/bin/bash param=$(/usr/local/bin/jamf getComputerName)  # 示例:读取设备名称作为参数 /path/to/shared_file --name "$param"            

         

    4. 打包共享文件为 .pkg 并预先部署

    • 如果共享文件较大或依赖复杂,可以用 Jamf Composer 或 pkgbuild 创建一个 .pkg 文件,通过策略预先部署到设备上,再在脚本中调用。


    注意事项:

    1. 权限问题

    • 确保共享文件在目标设备上有可执行权限(chmod +x /path/to/file)。

  • 路径一致性

    • 所有脚本中引用的共享文件路径必须一致,避免硬编码时出错。

  • 日志记录

    • 在脚本中添加日志(如 echo "$(date): Running script..." >> /var/log/jamf.log),便于调试。


    如果你能提供更具体的需求(比如共享文件的类型、参数如何生成等),我可以进一步优化方案!



    普通分类: