gpt4 book ai didi

linux - 在 wget 命令中使用用户提供的 header 值的问题

转载 作者:太空宇宙 更新时间:2023-11-04 12:52:22 25 4
gpt4 key购买 nike

我正在编写一个简单的 bash shell 脚本;输出 url 的页面加载时间。只有在使用特定的自定义 header 请求时,服务器才会以正确的页面响应(仅供引用:缺少 header ,默认页面由服务器提供。)要访问的 url 及其 header 是从配置文件中读取的(以分号分隔)示例条目:http://google.com/;User-Agent:XYZ A;msisdn:98xxxxxxxx

我完成了从读取文件到触发 wget 命令的所有操作。

但是,查看输出后我发现,headers 字符串没有正确传递给 wget 命令(尽管我正在正确构建它)。在进一步调试时,我发现 bash/linux in-tern 将整个 header 字符串包装到单引号中并将其发送到 wget 命令,因此 wget 无法给我预期的输出。

代码:

#!/bin/bash
load_page()
{
echo "url=$url";
echo "headers=$header_str";
/usr/bin/time -f "\t%e\t%C" wget -kKHpq --no-cache "$header_str" "$url"
}
read_config_file()
{
while read cfg_line
do
if [[ ! "$cfg_line" = \#* ]] && [[ "x$cfg_line" != "x" ]] ; then
url=`echo $cfg_line | cut -d";" -f1`
fields=`echo $cfg_line | awk -F";" ' { print NF } ' `;
f_cnt=2;
unset header_str
while [ $f_cnt -le $fields ] ;
do
field=`echo $cfg_line | cut -d";" -f$f_cnt`;
header_name=`echo $field | cut -d":" -f1`;
header_val=`echo $field | cut -d":" -f2`;
header_str="${header_str}--header=\"${header_name}: $header_val\" "
f_cnt=`expr $f_cnt + 1`;
done
load_page
fi
done<urls.cfg
}
main()
{
read_config_file
}
main $@

输出:

url=http://some-website.com/

headers=--header="User-Agent: XYZ G" --header="msisdn: 98xxxxxxxx"

6.37 wget -kKHpq --no-cache --header="User-Agent: XYZ G" --header="msisdn: 98xxxxxxxx" http://some-website.com/

一切看起来都很好,但是没有获取正确的页面。如果我从输出中复制粘贴命令,则服务器会响应预期的页面。

在 Debug模式下运行 shell 脚本时;我认为这是问题所在。 header 字符串被包裹在 wget 命令中的单引号中。

请帮忙。

+ load_page
+ echo url=http://some-website.com/
url=http://some-website.com/
+ echo 'headers=--header="User-Agent: XYZ G" --header="msisdn: 98xxxxxxxx" '
headers=--header="User-Agent: XYZ G" --header="msisdn: 98xxxxxxxx"
+ /usr/bin/time -f '\t%e\t%C' wget -kKHpq --no-cache '--header="User-Agent: XYZ G" --header="msisdn: 98xxxxxxxx" ' http://some-website.com/
1.66 wget -kKHpq --no-cache --header="User-Agent: XYZ G" --header="msisdn: 98xxxxxxxx" http://some-website.com/

最佳答案

我推荐使用eval。为此,您需要将完整的命令构建为一个字符串,并将其传递给 eval。我不适合用 wget 写出完整的例子,但基本思想是:

my_args='-al'
eval "ls ${my_args}"

如果您从这个基本示例开始,我想您会发现您可以可靠地将命令的固定方面与配置中的用户字符串结合起来。

关于使用 evalexecsource 的小而有用的讨论,我建议您阅读 bash shell: 'exec', 'eval', 'source' - looking for help to understand 上的这个主题。

关于linux - 在 wget 命令中使用用户提供的 header 值的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36787191/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com