如何修复 socat 以在 MacO 上正常工作?

How do I fix socat to work properly on MacOs?

我已经在 MacOs Mojave 上尝试了 socat 的 Homebrew 版本,但当 运行 使用:

时它无法工作
socat STDIO,raw TCP:localhost:40707

这给出了错误:

tcsetattr(7, TCSADRAIN, 0x10457ad30): Device not configured

没有 raw 它工作正常,但是我想要原始的,因为我希望能够在 socat 连接到的 shell 中操作文本对话框。

所以我下载了 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 上工作正常。谁能帮我解决这个问题?

更新:我决定尝试创建一个 docker 容器 运行ning socat 作为解决方法。

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 的情况下也能正常工作。

回到以前的 Socat 版本 1.7.3.2 并让它工作,所以 Mac (1.7.3.3) 上的最新 socat 似乎有问题。