Передача данных в программу Linux, которая ожидает TTY (терминал)
У меня есть программа в Linux, которая отказывается запускаться, если ее стандартный ввод / вывод не является TTY (терминальное устройство). Существует ли простой в использовании инструмент, который создаст PTY, запустит программу с вновь созданным TTY и скопирует все данные через stdin/stdout?
Вариант использования не интерактивный, а сценарий. Я ищу наиболее легкое решение, предпочтительно не создающее TCP-соединения и не требующее установки слишком большого количества других инструментов и библиотек.
2 ответа
unbuffer
часть ожидаемая (sudo apt-get install expect-dev
в Ubuntu Lucid) может заставить программу думать, что она подключена к TTY.
$ tty
/dev/pts/3
$ echo | tty
not a tty
$ echo | unbuffer tty
/dev/pts/11
Вы можете использовать
socat
для этого:
echo your stdin strings | socat EXEC:"your_program",pty STDIO >/stdout_file
Например с
bash
:
echo ls | socat EXEC:'bash',pty STDIO >/tmp/ls_out
Или, как описано здесь , для программы, запускаемой с
docker
:
# Run the docker task, here bash, in background
docker run -it --rm --name test ubuntu &
# Send "ls -la" to the bash running inside docker
echo 'ls -la' | socat EXEC:'docker attach test',pty STDIN
# Show the result
docker logs test