项目场景:
调用接口,创建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
- 说明:
- cat test.sql:通过管道,将cat的参数输入管道
- curl -u admin:admin: 这里假设你使用的认证为admin:admin
- -d @- : 这里-d指明请求体,@-代表从管道里面获取数据
- 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'