我正在尝试编写一个脚本,通过检查HTTP响应长度来枚举用户。我希望当响应不等于23时输出“好”,但是我现在得到这些错误:
for ((i=113;i<=115;i++)); do
if [[curl -i -s -k -X 'GET' "http://myurl/some.asp?q=$i" |
grep Content-Length | cut -d' ' -f2 != 23]]
then
echo "good"
fi
done
输出:
bash: [[curl: command not found
cut: !=: No such file or directory
cut: 23]]: No such file or directory
cut: !=: No such file or directory
cut: 23]]: No such file or directory
bash: [[curl: command not found
cut: !=: No such file or directory
cut: 23]]: No such file or directory
bash: [[curl: command not found
如果我只是创建一个没有条件的脚本,那么它运作良好:
for ((i=113;i<=115;i++)); do
curl -i -s -k -X 'GET' "http://myurl/some.asp?q=$i" |
grep Content-Length
done
我查了很多例子,但似乎无法弄清楚我做错了什么。
答案 0 :(得分:1)
更新初始错误后,您可能会有类似的语法(建议:在格式上付出一些努力,以便更清楚您拥有什么以及可能出错的地方):
for ((i=113;i<=115;i++))
do
if [[ curl -i -s -k -X 'GET' "http://myurl/some.asp?q=$i" | grep Content-Length | cut -d' ' -f2 != 23 ]]
then
echo "good"
fi
done
这会给你错误的信息:
bash:条件二元运算符预期bash:语法错误附近 -i'`
这是正常的,因为你基本上是在说:
if [[ command ]]; then ...
其中command
是一组多个管道命令。但是,在[[
中,您只需在表单"$var" -eq 23
或"$(command)" -ne 23
上添加表达式。
因此使用$( )
执行命令:if [[ "$(command)" -ne 23 ]]
:
if [[ "$(curl -i -s -k -X 'GET' "http://myurl/some.asp?q=$i" | grep Content-Length | cut -d' ' -f2)" -ne 23 ]]
注意我正在使用-ne
执行整数比较,这意味着“不等于”。
最后,请注意,仅awk
可以分两步执行grep
和cut
所做的事情:
... | grep "Content-Length" | cut -d' ' -f2
这意味着:检查包含“Content-Length”的行并打印其第二个字段。 awk
简单地说:
... | awk '/Content-Length/ {print $2}'
最后,但并非最不重要的是,您的表达式for ((i=113;i<=115;i++))
也可以使用brace expansion写为for i in {113..115}
。
答案 1 :(得分:0)
如果要测试命令执行的结果,则应将其放入$()。因此生成的脚本应如下所示:
for i in {113..115}; do if [[ $(curl -i -s -k -X 'GET' "http://myurl/some.asp?q=$i" | grep Content-Length | cut -d' ' -f2) != 23 ]]; then echo "good" ; fi; done
此外,我改变了一种迭代值的方法。 bash中的{a..b}提供了从“a”到“b”的序列。