欢迎各位兄弟 发布技术文章
这里的技术是共享的
You can implement the same functionality in a single curl command in shell as follows:
bashcurl -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:
For the new server: ./script.sh "aaaa"
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:
bashcurl -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):
bashcurl -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"
默认请求旧地址(jamfsrv):
bashcurl -X POST -H "Authorization: Basic MTY2NjY3Mzk6THV4ceeecmU1emhvbmc=" -H "Content-Type: application/json" -k "https://jamfsrv.bbbb.com:8443/uapi/auth/tokens"
请求新地址(aaaa),传参 aaaa
:
bashcurl -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 证书存在问题(如自签名证书、过期证书、域名不匹配等)。
curl
都关闭了证书验证?
在原 PHP 代码中,这两行相当于 curl -k
或 --insecure
:
phpcurl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); // 不验证主机名 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // 不验证对端证书
这可能是由于:
目标服务器使用自签名证书(如内部测试环境)。
证书配置错误(如域名不匹配 jamfsrv.bbbb.com
)。
开发调试阶段暂时禁用验证(但生产环境不建议这样做)。
--insecure
的风险
🔴 中间人攻击(MITM)风险:攻击者可能伪造服务器身份,窃取数据(如你的 Authorization: Basic
认证信息)。
🔴 不符合安全最佳实践:HTTPS 的核心安全依赖证书验证,关闭验证会降低安全性。
如果必须使用 HTTPS 但不信任证书,可以:
手动指定受信任的证书(推荐):
bashcurl -X POST --cacert /path/to/your/cert.pem -H "Authorization: Basic ..." "https://example.com"
将目标服务器的证书添加到系统信任库(需管理员权限):
bashsudo cp server.crt /usr/local/share/ca-certificates/ sudo update-ca-certificates
仅限测试环境使用 -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 解析导致错误。以下是解决方法:
将整个 echo -n
部分用单引号包裹,防止特殊字符被 Shell 解析:
bashcurl -X POST \ -H "Authorization: Basic $(echo -n '22222222:mypassword2' | base64)" \ -H "Content-Type: application/json" \ "https://aaaa.bbbb.com:8443/uapi/auth/tokens"
如果密码固定,可以提前计算 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"
更安全的方式是将密码存入环境变量,避免命令行明文暴露:
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"
特殊字符转义
如果密码包含 $
、!
等字符,在双引号内需要转义(如 Luxshare\@2021\!
)。
HTTPS 证书验证
如果目标服务器使用自签名证书,需添加 -k
(不推荐生产环境):
bashcurl -k -X POST ...
调试工具
使用 set -x
调试命令,观察实际发送的请求:
bashset -x # 开启调试 curl -X POST ... set +x # 关闭调试
优先用单引号('password'
)包裹含特殊字符的密码。
敏感信息建议通过环境变量传递,而非硬编码在命令中。
如果问题仍然存在,可能是服务器端配置问题(如防火墙/UAT 限制),需联系 Jamf 管理员确认。