Intereting Posts
Будет ли изменение имени хоста в OpenBSD повлиять на установленные пакеты? Как я могу установить базу данных TZ на встроенную платформу Linux? md рейд терпит неудачу при первой загрузке дня Помогите мне в установке дистрибутива Linux на Apple TV 2? Обновление калибровочных заголовков Kali '+' и 's' в строках прав Есть ли способ контролировать порт зарядки аккумулятора ноутбука? запуск экрана в оболочке не может найти сеансы, но запуск экрана во время входа в ssh может Время Bash ведет себя странно Сохраняется ли существующий файл при создании символической ссылки с тем же именем? как преобразовать символ ^ I Как исправить определение срока использования экрана GNU при запуске в автономном режиме? Окно диспетчера Bluetooth не открывается Кажется, я использую только часть моей общей памяти Сравнение времени rsync – какова точность сравнения Модифицированных времен

используя pty как сокет?

Я пишу коллекцию скриптов, чтобы поговорить с внешней программой. Моя проблема заключается в том, что сценарии являются «живыми» в течение короткого времени (вызванные нажатием клавиши в более крупной программе), но внешняя программа должна работать между вызовами и изначально была предназначена для интерактивного использования (думаю, отладчик).

  • Если бы я просто хотел написать один скрипт для запуска программы, я бы открыл PTY и отправил / получил данные по этому поводу. Это работает (мои скрипты находятся в LUA, а lpty может работать с PTY), но он не может поддерживать выполнение программы при завершении сценария.

  • Если внешняя программа предложила мне сокет для подключения (например, gdb), я мог бы просто сохранить имя где-нибудь и подключить каждый скрипт к этому сокету. Но это предназначалось только для интерактивного использования.

Я мог бы написать демона, который запускает внешнюю программу, открывает ей PTY, а затем прослушивает сам сокет. Затем скрипты могли подключаться к сокету демона и отправлять данные, которые демон пересылал в программу через PTY и отправлял результаты обратно.

Формат данных, которые я обмениваю с внешней программой, основан на линиях, но я заранее не знаю, сколько строк я собираюсь получить от одной команды. Не проблема с PTY, но немного больше работы с luasocket .

Мне интересно, нет ли лучшего способа сделать это. Могу ли я каким-то образом открыть PTY программе и получить ее «адрес», из которого я могу позже подключиться и отключить несколько раз из моих сценариев? (Только один скрипт может запускаться одновременно, поэтому параллелизм не является проблемой.) Это позволит избежать использования сокетов вообще.

Или есть какая-то комбинация опций в socat которая делает именно это?

Вы не можете «открыть PTY для программы». PTY – псевдотерминал; для этого требуется конечный конец. Если вы хотите напрямую общаться с программой через терминал, программа должна будет создать терминал (т.е. вести себя как эмулятор терминала).

Вместо этого вы можете запускать программу на терминале, например, на экране . Экран позволяет легко вводить ввод и считывать выходные данные из программ.

Однако, за то, что вы делаете, терминал вводит бесполезные осложнения. Сокет – это именно тот инструмент, который вы хотите сделать – прямая двунаправленная связь между двумя программами. (Для однонаправленной связи труба будет правильным инструментом.) Единственное преимущество использования терминала заключается в том, что вы не контролируете один из концов и настаиваете на буферизации вывода блоком, а не по строке, если вывод не является на терминале.