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

这里的技术是共享的

You are here

以下的php 的 curl 功能 用 shell 的 curl 一句代码来实现 AG chatgpt 有大用 有大大用

function get_jamf_token()
{
    $ch = curl_init();

    if ($_GET['new']) {
        curl_setopt($ch, CURLOPT_URL, "https://aaaa.bbbb.com:8443/uapi/auth/tokens");
    } else {
        curl_setopt($ch, CURLOPT_URL, "https://mmmmm.bbbb.com:8443/uapi/auth/tokens");
    }
    $headers = array('Authorization:Basic ' . _my_jamf_get_base64_encode(), 'Content-Type: application/json');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // to resolve your current error
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
    if (!empty($data_arr)) {
        curl_setopt($ch, CURLOPT_POSTFIELDS, drupal_json_encode($data_arr));
    }
    $response = curl_exec($ch);
    if (curl_error($ch)) {
        $response = curl_error($ch);
    }
    curl_close($ch);
    //var_dump($response);
    //var_dump("AAA");exit;
    return $response;
}
function _my_jamf_get_base64_encode()
{
    $name = '11111111';
    $pwd = 'mypassword1';
    return base64_encode("$name:$pwd");
}
以上的功能 shell curl 一句代码来实现


You can implement the same functionality in a single curl command in shell as follows:

bash    
curl -X POST -H "Authorization: Basic $(echo -n "11111111:mypassword1" | base64)" -H "Content-Type: application/json" --insecure "https://${1:-jamfsrv}.bbbb.com:8443/uapi/auth/tokens"    



To use this:

  1. For the new server: ./script.sh "aaaa"

  2. For the old server: ./script.sh or ./script.sh "jamfsrv"

This command:

  • Uses -X POST for the HTTP method

  • Creates the Basic Auth header by base64 encoding the credentials

  • Adds the Content-Type header

  • Uses --insecure to disable SSL verification (equivalent to CURLOPT_SSL_VERIFYHOST/PROXY)

  • Uses a parameter to switch between old and new URLs (defaults to old)

If you prefer a completely static one-liner without the parameter, you can use:

bash    
curl -X POST -H "Authorization: Basic MTY2NjY3Mzk6THV4ceeecmU1emhvbmc=" -H "Content-Type: application/json" --insecure "https://${1:-jamfsrv}.bbbb.com:8443/uapi/auth/tokens"    



Where "MTY2NjY3Mzk6THV4ceeecmU1emhvbmc=" is the pre-calculated base64 of "11111111:mypassword1".



使用中文

可以用一行 curl 命令实现相同的功能(获取 Jamf API Token):

bash    
curl -X POST -H "Authorization: Basic $(echo -n "11111111:mypassword1" | base64)" -H "Content-Type: application/json" -k "https://${1:-jamfsrv}.bbbb.com:8443/uapi/auth/tokens"    



使用说明:

  1. 默认请求旧地址(jamfsrv):

    bash            
    curl -X POST -H "Authorization: Basic MTY2NjY3Mzk6THV4ceeecmU1emhvbmc=" -H "Content-Type: application/json" -k "https://jamfsrv.bbbb.com:8443/uapi/auth/tokens"            

           

       

  2. 请求新地址(aaaa),传参 aaaa

    bash            
    curl -X POST -H "Authorization: Basic $(echo -n "11111111:mypassword1" | base64)" -H "Content-Type: application/json" -k "https://aaaa.bbbb.com:8443/uapi/auth/tokens"            

           

       

参数解析:

  • -X POST:指定 HTTP 方法为 POST。

  • -H:添加请求头(Authorization 和 Content-Type)。

  • $(echo -n "账号:密码" | base64):动态生成 Base64 编码的认证信息。

  • -k:忽略 SSL 证书验证(等同于原代码的 CURLOPT_SSL_VERIFYHOST=0)。

  • ${1:-jamfsrv}:如果脚本未传参则默认使用 jamfsrv

注意事项:

  • 如果密码包含特殊字符,可能需要用引号包裹(如 "账号:密码")。

  • 生产环境中建议避免直接在命令中暴露密码,改用环境变量存储敏感信息。


--insecure 是什么意思

在 curl 命令中,--insecure(或简写 -k)的意思是 跳过 SSL/TLS 证书验证,即不安全地允许连接,即使目标服务器的 HTTPS 证书存在问题(如自签名证书、过期证书、域名不匹配等)。


为什么 PHP 代码和 Shell 的 curl 都关闭了证书验证?

在原 PHP 代码中,这两行相当于 curl -k 或 --insecure

php    
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);  // 不验证主机名 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);  // 不验证对端证书    



这可能是由于:

  1. 目标服务器使用自签名证书(如内部测试环境)。

  2. 证书配置错误(如域名不匹配 jamfsrv.bbbb.com)。

  3. 开发调试阶段暂时禁用验证(但生产环境不建议这样做)。


--insecure 的风险

  • 🔴 中间人攻击(MITM)风险:攻击者可能伪造服务器身份,窃取数据(如你的 Authorization: Basic 认证信息)。

  • 🔴 不符合安全最佳实践:HTTPS 的核心安全依赖证书验证,关闭验证会降低安全性。


改进方案

如果必须使用 HTTPS 但不信任证书,可以:

  1. 手动指定受信任的证书(推荐):

    bash            
    curl -X POST --cacert /path/to/your/cert.pem -H "Authorization: Basic ..." "https://example.com"            

           

       

  2. 将目标服务器的证书添加到系统信任库(需管理员权限):

    bash            
    sudo cp server.crt /usr/local/share/ca-certificates/ sudo update-ca-certificates            

           

       

  3. 仅限测试环境使用 -k,并在生产代码中移除该选项。


总结

  • --insecure-k) = “忽略证书错误,不安全地连接”

  • 适用于测试或内部环境,但生产环境应修复证书问题而非禁用验证。

  • 如果目标服务器是公开服务(如 Jamf Pro),建议联系管理员修复证书配置。



curl -X POST -H "Authorization: Basic $(echo -n "22222222:mypassword2" | base64)" -H "Content-Type: application/json" "https://aaaa.bbbb.com:8443/uapi/auth/tokens"  密码里面有特殊字符

如果密码中包含特殊字符(如 @#$ 等),在 Shell 中使用 curl 命令时需要正确处理,否则可能会被 Bash 解析导致错误。以下是解决方法:


解决方案 1:用单引号包裹密码

将整个 echo -n 部分用单引号包裹,防止特殊字符被 Shell 解析:

bash    
curl -X POST \     -H "Authorization: Basic $(echo -n '22222222:mypassword2' | base64)" \     -H "Content-Type: application/json" \     "https://aaaa.bbbb.com:8443/uapi/auth/tokens"    




解决方案 2:预计算 Base64 值

如果密码固定,可以提前计算 Base64 结果(避免动态生成时的解析问题):

bash    
# 计算 Base64(注意冒号 : 是账号密码分隔符) echo -n "22222222:mypassword2" | base64 # 输出示例:MTY3MDI3NzA6THV4eeehcmVAMjAyMSM= # 直接使用硬编码的 Base64 curl -X POST \     -H "Authorization: Basic MTY3MDI3NzA6THV4eeehcmVAMjAyMSM=" \     -H "Content-Type: application/json" \     "https://aaaa.bbbb.com:8443/uapi/auth/tokens"    




解决方案 3:使用环境变量存储密码

更安全的方式是将密码存入环境变量,避免命令行明文暴露:

bash    
# 设置环境变量(临时生效,关闭终端后失效) export JAMF_USER="22222222" export JAMF_PASS="mypassword2" # 使用环境变量动态生成 Base64 curl -X POST \     -H "Authorization: Basic $(echo -n "$JAMF_USER:$JAMF_PASS" | base64)" \     -H "Content-Type: application/json" \     "https://aaaa.bbbb.com:8443/uapi/auth/tokens"    




注意事项

  1. 特殊字符转义

  • 如果密码包含 $! 等字符,在双引号内需要转义(如 Luxshare\@2021\!)。

  • HTTPS 证书验证

    • 如果目标服务器使用自签名证书,需添加 -k(不推荐生产环境):

      bash                
      curl -k -X POST ...                

                 

             

  • 调试工具

    • 使用 set -x 调试命令,观察实际发送的请求:

      bash                
      set -x  # 开启调试 curl -X POST ... set +x  # 关闭调试                

                 

             


    总结

    • 优先用单引号'password')包裹含特殊字符的密码。

    • 敏感信息建议通过环境变量传递,而非硬编码在命令中。

    • 如果问题仍然存在,可能是服务器端配置问题(如防火墙/UAT 限制),需联系 Jamf 管理员确认。





    普通分类: