我想在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日)。 我知道telnet
, netcat
, socat
等,为的想法项目我的工作(其中这个庆典问题上来)从挫折出现在特定多么慢的工具是,这是由于它是如何代理其所有贝壳助手关闭外部(Python)的解释。 另外,我想避免mkfifo
如果可能的话。