问:
我正在尝试编写一个用于测试的 bash 脚本,该脚本接受一个参数并通过 curl 将其发送到网站。我需要对值进行 url 编码,以确保特殊字符得到正确处理。最好的方法是什么?
这是我到目前为止的基本脚本:
代码语言:javascript复制#!/bin/bash
host=${1:?'bad host'}
value=$2
shift
shift
curl -v -d "param=${value}" http://${host}/somepath $@
答:
使用 curl --data-urlencode ;curl 的手册写到:
This posts data, similar to the other --data options with the exception that this performs URL-encoding. To be CGI-compliant, the <data> part should begin with a name followed by a separator and a content specification.
示例用法
代码语言:javascript复制curl
--data-urlencode "paramName=value"
--data-urlencode "secondParam=value2"
http://example.com
这需要 curl 7.18.0 或更新版本。使用 curl -V 来检查你的版本。
提问者的脚本可以改写为
代码语言:javascript复制#!/bin/bash
host=${1:?'bad host'}
value=$2
shift
shift
curl -v --data-urlencode "param=${value}" http://${host}/somepath $@
将脚本保存为 curl-test.sh 文件,在一个窗口使用 tcpdump 对上网的网口开启过滤抓包,在另一个窗口执行命令 bash curl-test.sh example.com "ABC efg" 进行测试,抓包截图如下:
可以发现参数 "ABC efg" 被编码成为 ABC efg,即字符空格被编码为 。
类似地,# $ : ; , ?等特殊字符都有其对应的 URL 编码。
参考文档:
- stackoverflow question 296536
- https://manpages.org/curl