我已经在MacOs Mojave上尝试了socat的Homebrew版本,并且在与以下命令一起运行时无法正常工作:
socat STDIO,raw TCP:localhost:40707
出现错误:
tcsetattr(7, TCSADRAIN, 0x10457ad30): Device not configured
在没有raw
的情况下,它可以正常工作,但是我想要原始,因为我希望能够在socat连接到的外壳内操纵文本对话框。
因此,我下载了socat的1.7.3.3版本的源代码,经过一小段破解后便对其进行了编译。我的本地编译版本也存在同样的问题。查看socat的来源,它在xio-termios.c中:
int xiotermios_flush(int fd) {
if (_xiotermios_doit) {
if (Tcsetattr(fd, TCSADRAIN, &_xiotermios_data.termarg) < 0) {
Error3("tcsetattr(%d, TCSADRAIN, %p): %s",
fd, &_xiotermios_data.termarg, strerror(errno));
return -1;
}
_xiotermios_doit = false;
}
return 0;
}
我认为tcsetattr在Mac上的工作方式略有不同,因为相同的代码在Linux上可以正常工作。谁能帮我解决这个问题?
更新:我决定尝试创建一个运行socat的docker容器作为解决方法。
FROM alpine:3.10.2
RUN apk add --no-cache socat
ENTRYPOINT ["socat"]
然后我用以下命令运行容器:
docker run --rm -ti socat STDIO,raw TCP:host.docker.internal:40707
不幸的是,这也不起作用,只是给了我
tcsetattr(5, TCSADRAIN, 0x55aadeb42b40): Not a tty
尽管如此,它似乎在没有raw
的情况下仍然有效。
答案 0 :(得分:0)
回到以前的Socat版本1.7.3.2并使其正常运行,因此Mac(1.7.3.3)上的最新socat似乎出了点问题。