gpt4 book ai didi

bash - 捕获 bash exec I/O 重定向中的错误输出

转载 作者:可可西里 更新时间:2023-11-01 02:51:51 26 4
gpt4 key购买 nike

我想在 bash 中打开一个 TCP 套接字,使用 /dev/tcp/host/port psuedo- device syntax ,但是如果 host/port 端点没有监听,我需要从容地恢复。如果我所做的只是将数据发送到套接字或从中提取数据,这很容易,因为我可以只使用一次性重定向,即:

echo 'ping' 2> >(logger) >/dev/tcp/127.0.0.1/8080

或者,从套接字读取:

cat 2> >(logger) </dev/tcp/127.0.0.1/8080

其中 logger 是标准 logger将标准输入中的行写入系统日志。

问题是在某些情况下我需要向套接字写入请求并获得响应。所以我需要用 exec 打开套接字的文件描述符,但在这种情况下,捕获“-bash: connect: Connection refused”错误更难,因为我不想重定向 shell 中的所有输出,这就是 2>>(logger) 在 exec 的上下文中使用时执行。如果端点关闭(因为 bash 在打开套接字时遇到错误,并重置所有重定向),下面的方法很好用,但如果它能够建立连接,就会使我的 shell 变得毫无用处。

exec 2> >(logger) 3<>/dev/tcp/127.0.0.1/8080

到目前为止,我想出的最佳解决方案如下,我打开一个指向原始 STDERR 的文件描述符 (fd 9),将 STDERR (fd 2) 重定向到我的记录器,打开 fd 上的套接字3、然后将fd 2设置回原来的STDERR,关闭我的临时STDERR别名(fd 9)。

exec 9>&2 2> >(logger) 3<>/dev/tcp/127.0.0.1/8080 2>&9 9>&-

对于如此简单的事情,这似乎需要大量工作。有没有办法告诉 bash 我想在 bash 运行 exec 命令时重定向 STDERR,而不是将重定向视为 exec 的文字参数?


请保持您的回答/建议仅限于 bash(最高 bash 4.3.30)。我知道 telnetnetcatsocat 等。project 的想法我正在研究(出现这个 bash 问题的地方)是因为对一个特定的 tool 有多慢感到沮丧。是,这是由于它如何将其所有 shell 助手代理到外部(python)解释器。另外,如果可能的话,我想避免使用 mkfifo

最佳答案

eval 'exec 3<>/dev/tcp/127.0.0.1/8080' 2> >(logger)

或者更好,因为它不会破坏旧的文件描述符 3:

eval 'exec {fd}<>/dev/tcp/127.0.0.1/8080' 2> >(logger)

它使用最小的空闲文件描述符并将其分配给 fd。

unset fd
eval 'exec {fd}<>/dev/tcp/127.0.0.1/8080' 2> >(logger)

if test $? != 0 # status of the last command - 0 if the connection succeeded
then
echo cannot open connection >&2
fi

# $? shows the last status only. Later you can check success this way:

if test -z "$fd"
then
echo could not open connection >&2 # past tense because it's later now
else
echo some data to transmit >&$fd
IFS= read -r just_on_line_of_response <&$fd
fi

完成后,使用删除连接

exec {fd}>&-

这也行得通:

eval "exec $fd>&-"

但这惨败并关闭了你的标准输出:

exec $fd>&-

关于bash - 捕获 bash exec I/O 重定向中的错误输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27760732/

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