Я попробовал Homekrew версию socat на MacOs Mojave, и она не работает при запуске с:
socat STDIO,raw TCP:localhost:40707
Это выдает ошибку:
tcsetattr(7, TCSADRAIN, 0x10457ad30): Device not configured
Без raw
все работает нормально, однако я хочу использовать 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 в качестве обходного пути.
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
.