使用代理在 shell 脚本中通过 telnet 获取 HTTP 标头响应

使用代理在 shell 脚本中通过 telnet 获取 HTTP 标头响应

我需要使用 telnet 从服务器(google)获取 http 标头响应,因为我的 busybox 环境中没有curl 或 wget。另外,我在代理后面。所以在命令行上我可以成功地做到这一点:

$  telnet proxy.ip port
HEAD http://www.google.com/ HTTP/1.1
{hit enter twice}

HTTP/1.1 200 OK
Date: Tue, 15 Jan 2019 09:11:28 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=ISO-8859-1
P3P: CP="This is not a P3P policy! See g.co/p3phelp for more info."
Server: gws
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
entire header follows...

但我不知道如何将其放入 shell 脚本中。这是我尝试过的:

#!/bin/sh
(
echo "GET http://www.google.com/ HTTP/1.1"
echo
echo
echo "exit"
) | telnet proxy.ip port

但它根本没有给我任何输出。

答案1

如果你想控制输入和输出流,你可以这样做:

#!/usr/bin/env bash

proxy_host="example.proxy.local"
proxy_port="8080"
uri="http://www.google.com/"

# This is the STDIN for telnet, keep in mind that this needs to be running
# as long as the request is handled. You can test the result by removing the
# sleep.
send_headers () {
  # Note the use of HTTP/1.0. 1.1 would keep the connection open
  # and you will need to wait for the 10 second timout below.
  echo "GET $uri HTTP/1.0"
  echo
  echo
  # 10 second timeout to keep STDIN open
  sleep 10
}

# This reads the telnet output per line, do your stuff here
while read -r line; do
  echo "$line"
done < <(telnet "$proxy_host" "$proxy_port" < <(send_headers))

语法command1 < <(command2)只是一个反向管道(与 相同command2 | command1)。在此示例中,它将 command2 的 STDOUT 文件描述符连接到 command1 的 STDIN 文件描述符。这样做的缺点是该管道中的所有“命令”都需要运行才能工作。如果删除睡眠,telnet 命令会提前结束。好消息是,当您使用 HTTP/1.0 时,连接会为您关闭,并且管道会整齐地关闭,而无需等待 10 秒的 send_headers 超时。

注意:我没有代理来测试代码,所以我希望它对你有用:)

相关内容