捕获错误的输出在bash EXEC I / O重定向(Capture output of error

2019-10-21 13:22发布

我想在bash打开一个TCP套接字,使用/dev/tcp/host/port psuedo- 设备语法 ,但我需要正常恢复,如果host/port端点就是不听。 这很容易,如果我做的是将数据发送到插座,或从中提取数据,因为我可以只使用一次性的重定向,即:

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

或者,从套接字读取:

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

logger是标准的记录 ,从标准输入到系统日志写入线。

问题是,在某些情况下,我需要写入套接字的请求,并得到响应。 所以,我需要打开用于与插座文件描述符exec ,但在这种情况下,捕捉“-bash:连接:连接被拒绝”的错误是很难的,因为我不想重定向的外壳全部输出,这是什么2> >(logger)在EXEC的上下文中使用时一样。 下面的伟大工程,如果端点下来(因为bash中打开套接字时碰到一个错误,并将所有重定向),但呈现我的壳很无用的,如果它能够进行连接。

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

到目前为止,最好的解决办法,我想出如下,在那里我打开一个文件描述符(FD 9)指向原来的STDERR,重定向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>&-

这似乎是很多工作的东西那么简单。 有没有办法告诉我要重定向STDERR bash的bash的同时运行exec命令,而不是考虑重定向作为文字参数exec


请保持你的答案/建议局限于庆典 (最多庆典30年3月4日)。 我知道telnetnetcatsocat等,为的想法项目我的工作(其中这个庆典问题上来)从挫折出现在特定多么慢的工具是,这是由于它是如何代理其所有贝壳助手关闭外部(Python)的解释。 另外,我想避免mkfifo如果可能的话。

Answer 1:

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)

它使用最小的自由文件描述符,并为其指派金融衍生工具。

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>&-


文章来源: Capture output of error in bash exec I/O redirection