socat дает «Ресурс временно недоступен» на OS X High Sierra

424
Daniele Testa

Я пытаюсь создать виртуальный локальный com-порт, который перенаправляет все на удаленный компьютер через TCP с помощью этой команды:

sudo socat GOPEN:/dev/ptyp0,ignoreeof TCP:192.168.254.106:8080 2018/09/08 21:48:51 socat[10860] E open("/dev/ptyp0", 012, 0666): Resource temporarily unavailable 

Это недавно установленная OS X High Sierra, поэтому я сомневаюсь, что у меня нет ресурсов.

sudo lsof /dev/ptyp0 

Ничего не показывает ... и я получаю тот же результат, даже если я пытаюсь ptyp1, ptyp2 и т. Д.

0
Почему вы пытаетесь открыть специальный файл устройства, который не существует? Вы просто копируете непонятную команду из какого-то онлайн-источника? Это может быть из Linux или другого варианта Unix, который называет файлы устройств псевдо-TTY не так, как это делает традиция macOS на основе BSD. Возможно, вам понадобится использовать псевдо-TTY имя устройства в стиле macOS. Spiff 5 лет назад 0
@Spiff Не уверен, что вы подразумеваете под "файл, который не существует"? Этот файл действительно существует, как ясно показывает "ls / dev / ptyp *". Daniele Testa 5 лет назад 0

1 ответ на вопрос

1
dirkt

Вы не можете просто открыть случайный pty и ожидать, что он сработает. (На самом деле, вы должны открывать каждый из них по очереди, пока не найдете свободный). Вместо этого используйте правильный socatсинтаксис для него:

socat PTY,link=/tmp/mytty TCP:192.168.254.106:8080 

Это откроет основную сторону доступного псевдотерминала, создаст символическую ссылку под /tmp/mytty(изменяйте соответственно) на ведомой стороне и переместится между ведущей стороной и вашим удаленным портом TCP.

Теперь вы можете использовать /tmp/mytty(или связанный с ним подчиненный pty) как обычный tty. («Виртуальный локальный com-порт» звучит подозрительно, как термин Windows).

Кстати, это будет работать на всех платформах, которые поддерживают псевдо-терминалы, потому что socatиспользует подходящий для платформы метод.

редактировать

То, что вы видите в качестве опции в программе Java, которую вы запускаете, полностью зависит от программы Java, которую вы запускаете, о которой я ничего не знаю (и вы нам ничего не сказали). Вполне возможно, что в Java-программе есть дополнительные опции, чтобы рассказать о других tty. Также возможно, что у него нет таких опций.

Файлы внизу /devявляются частью специальной файловой системы, devfsкоторая показывает устройства, доступные ядру. По-видимому, вы не можете создавать символические ссылки на него.

Так что, если все, что делает ваша Java-программа, это сканирование файлов /dev/cu.*, то вам не повезло.

Вы всегда можете попытаться найти исходный код своей Java-программы и изменить его. Или даже исправьте двоичный файл (замените строку /dev/cuчем-нибудь другим).

Я попробовал команду, и она могла бы сработать. Тем не менее, я все еще не вижу / tmp / mytty в качестве опции в Java-программе, которую я запускаю. Единственный вариант, который я вижу, это "/dev/cu.Bluetooth-Incomming-Port". Может быть, мне нужен какой-то дополнительный параметр или символическая ссылка, чтобы OS X (или Java) знала о создаваемом новом «порте»? Daniele Testa 5 лет назад 0
Я попытался запустить "sudo socat PTY, link = / dev / cu.esp8266 TCP: 192.168.254.106: 8080", но это "Операция не была разрешена". Daniele Testa 5 лет назад 0
Да, похоже, что java-программа просто перечисляет /dev/cu.* Теперь понятно, почему я не могу создавать файлы в / dev / как root на OS X через :( Daniele Testa 5 лет назад 0
Как я уже сказал, `devfs` - это другой тип файловой системы - он дает вам доступ к ресурсам ядра. Очевидно, что символические ссылки не реализованы в этой файловой системе, поэтому вы не можете создавать корневые или нет. dirkt 5 лет назад 0
Конечно, это имеет смысл. Однако, если не существует «стандартного» способа для приложений получить список ttys из ОС (кроме перечисления /dev/cu.*), тогда должен быть способ создания таких ссылок. Я сомневаюсь, что Apple просто проигнорировала эту «функцию». Daniele Testa 5 лет назад 0
«Стандартным способом» в BSD является работа с файлами. Если ваше Java-приложение не поддерживает это и считает, что оно должно присматривать за пользователем, представляя варианты, основанные на шаблонах, которые, по мнению программиста, являются достаточными, то это ошибка Java-приложения. Найди программиста и бей его палкой. И вы можете предложить Apple, чтобы они изменили файловую систему devfs (или с открытым исходным кодом, чтобы другие могли ее изменить). Кстати, Linux много лет назад перешел с devfs на devtmpfs (и udev), где символические ссылки работают нормально. dirkt 5 лет назад 0
И это похоже на символические ссылки [используется для работы] (https://stackoverflow.com/questions/21175410/managing-serial-port-names-in-mac-osx-with-symlinks), но Apple запретила это. dirkt 5 лет назад 0