Piping data to Linux program which expects a TTY (terminal)
unbuffer
, part of expect (sudo apt-get install expect-dev
on Ubuntu Lucid), can fool a program into thinking it's connected to a TTY.
$ tty
/dev/pts/3
$ echo | tty
not a tty
$ echo | unbuffer tty
/dev/pts/11
You can use socat
for this: echo your stdin strings | socat EXEC:"your_program",pty STDIO >/stdout_file
For example with bash
: echo ls | socat EXEC:'bash',pty STDIO >/tmp/ls_out
Or as described here, for a program run with 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