我想要的:
连接成功后,我想让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)
要使 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. ✔️
https://curl.se/docs/todo.html#exit_immediately_upon_connection
通过:https://curl.se/mail/archive-2022-04/0027.html
对我有用的是向 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
您还可以使用 -m/--max-time 选项来设置允许整个操作进行的最长时间(以秒为单位)。
$curl -vm 5 telnet://google.com:443