linux下 _usr_bin_curl_ Argument list too long的解决方法

本文档介绍了在使用curl调用HTTP接口时遇到参数过长导致的错误以及如何通过管道技术解决。同时,展示了如何处理请求体中的中文乱码和特殊字符,确保数据正确传输。示例中详细解释了curl命令的使用,包括通过管道重定向输入,使用-data-urlencode进行URL编码,以及如何将结果写入日志文件。
摘要由CSDN通过智能技术生成

项目场景:

调用接口,创建sql脚本到hdfs公共目录:
在这里插入图片描述

问题描述

使用curl时,因为参数过长报错 /usr/bin/curl: Argument list too long。

解决方案:

利用管道技术,重定向输入到curl的-d参数中。

文本输出

  • 将请求体json保存到文本文件中,这里比如为test.sql
  • 编写curl命令,通过管道读取数据,-d @-,示例如下:
cat test.sql | curl -u admin:admin -X POST http://localhost:8082/stream/open/streamProcess/unit/createScript \
-H 'Content-Type:applicatin/json' -d @- > result.log
  • 说明:
  1. cat test.sql:通过管道,将cat的参数输入管道
  2. curl -u admin:admin: 这里假设你使用的认证为admin:admin
  3. -d @- : 这里-d指明请求体,@-代表从管道里面获取数据
  4. result.log:将请求结果写入result.log文件

echo标准输出

  • 使用 @- 从标准输入中获取数据。利用echo输出到标准输入,再利用管道重定向输入到curl的-d参数中。
echo '{"userhname":"xxx","pwd":"'$pwd'","nickname":"test"}' \
| curl -v -X PUT -H 'Content-Type:application/json' -d @- "http://localhost:8082/stream/open/streamProcess/unit/createScript"

自测脚本:

sql="xxjhd jhdnc;rk'sd')j("
cluster1=`echo $sql | tr -d '\n' | xxd -plain | sed 's/\(..\)/%\1/g'`
unitId="12333"
OPENAPI="http://localhost:8082/stream/open/streamProcess/unit/createScript"
echo "cluster1=$cluster1"
echo "sql=$sql"
echo "  <==: 1. EXEC :==> curl -S  ******* -X POST -d  -d 'sql=$sql' 'unitId=$ID' --data-urlencode 'cluster=$cluster1' "
printf $(echo -n $cluster1 | sed 's/\\/\\\\/g;s/\(%\)\([0-9a-fA-F][0-9a-fA-F]\)/\\x\2/g')"\n"
result=`echo "cluster=$cluster1" | curl -S $OPENAPI -X POST -d "unitId=$ID" -d @-`
echo $result

注意中文乱码或特殊字符的处理:

  • –data-urlencode @- 是获取不到管道输出的值的

echo "cluster=$cluster1" | curl -S $OPENAPI -X POST -d "unitId=$ID" --data-urlencode @-

  • 进行URL编码,解决中文乱码和特殊字符问题

echo $sql | tr -d '\n' | xxd -plain | sed 's/\(..\)/%\1/g'

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值