telnet 后关闭curl 连接

问题描述 投票:0回答:3

我想要的:

连接成功后,我想让curl成功退出。我在容器内运行此命令,因此我希望 curl 命令成功退出,以便容器也能成功退出。

这是我的例子:

$ curl -v telnet://google.com:443/
*   Trying 172.217.197.113...
* TCP_NODELAY set
* Connected to google.com (172.217.197.113) port 443 (#0)

我尝试过的选项:

没有保持活力:

$ curl -v --no-keepalive telnet://google.com:443/
*   Trying 172.217.197.102...
* TCP_NODELAY set
* Connected to google.com (172.217.197.102) port 443 (#0)

连接超时:

$ curl -v --connect-timeout 5 telnet://google.com:443/
*   Trying 172.217.197.139...
* TCP_NODELAY set
* Connected to google.com (172.217.197.139) port 443 (#0)

保持存活时间:

$ curl -v --keepalive-time 5 telnet://google.com:443/
*   Trying 172.217.197.139...
* TCP_NODELAY set
* Connected to google.com (172.217.197.139) port 443 (#0)

标志定义

--no-keepalive (Disable keepalive use on the connection)

--connect-timeout (SECONDS  Maximum time allowed for connection)

--keepalive-time (SECONDS  Wait SECONDS between keepalive probes)

curl containers telnet
3个回答
7
投票

要使 telnet 连接成功后立即退出,请故意传递未知的 telnet 选项并测试退出代码是否为 48:

curl --telnet-option 'BOGUS=1' --connect-timeout 2 -s telnet://google.com:443 </dev/null
code=$?
if [ "$code" -eq 48 ]; then
  echo "Telnet connection was successful"
else
  echo "Telnet connection failed. Curl exit code was $code"
fi

我们故意将一个未知的 telnet 选项

BOGUS=1
传递给curl 的
-t, --telnet-option
选项。将
BOGUS
替换为除
TTYPE
XDISPLOC
NEW_ENV
这三个支持的选项之外的任何名称。

48是curl的错误代码CURLE_UNKNOWN_OPTION (48)传递给libcurl的选项无法识别/已知。”

这是有效的,因为只有在成功连接后才会处理 telnet 选项。

略有不同

故意传递语法错误的 telnet 选项,例如

BOGUS
或空字符串,并测试退出代码 49 (CURLE_SETOPT_OPTION_SYNTAX)。我们在以下函数中使用这种方法。和以前一样,这是有效的,因为curl 仅在成功连接后才处理 telnet 选项。

形式化为函数

# Args:
# 1 - host
# 2 - port
tcp_port_is_open() {
   local code
   curl --telnet-option BOGUS --connect-timeout 2 -s telnet://"$1:$2" </dev/null
   code=$?
   case $code in
     49) return 0 ;;
     *) return "$code" ;;
   esac
} 

测试

tcp_port_is_open example.com 80
echo "$?"
# 0 ✔️

tcp_port_is_open example.com 1234
echo "$?"
# 28 - Operation timeout ✔️

tcp_port_is_open nonexistent.example.com 80
echo "$?"
# 6 - Couldn't resolve host. ✔️

编辑:2022 年 5 月 27 日:观看此待办事项

https://curl.se/docs/todo.html#exit_immediately_upon_connection
通过:https://curl.se/mail/archive-2022-04/0027.html


0
投票

对我有用的是向 telnet 发送“退出”,并且由于您对输出不感兴趣,因此将其重定向

$ echo "exit" | curl --connect-timeout 1 -s telnet://google.com:443 > /dev/null
$ echo $?
0
$ echo "exit" | curl --connect-timeout 1 -s telnet://google.com:4433 > /dev/null
$ echo $?
7

0
投票

您还可以使用 -m/--max-time 选项来设置允许整个操作进行的最长时间(以秒为单位)。

$curl -vm 5 telnet://google.com:443

  • 关于 connect() 到 google.com 端口 443 (#0)
  • 尝试 142.251.163.113...已连接
  • 已连接到 google.com (142.251.163.113) 端口 443 (#0)
  • 超时
  • 关闭连接#0 卷曲:(28)超时
© www.soinside.com 2019 - 2024. All rights reserved.