Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Piping data to Linux program which expects a TTY (terminal)

Tags:

I have a program in Linux which refuses to run if its stdin/stdout is not a TTY (terminal device). Is there an easy-to-use tool which will create a PTY, start the program with the newly created TTY, and copy all data over stdin/stdout?

The use case is not interactive, but scripting. I'm looking for the most lightweight solution, preferably not creating TCP connections, and not requiring too many other tools and libraries to be installed.

like image 940
pts Avatar asked Nov 20 '10 16:11

pts


People also ask

What is tty terminal in Linux?

The tty command of terminal basically prints the file name of the terminal connected to standard input. tty is short of teletype, but popularly known as a terminal it allows you to interact with the system by passing on the data (you input) to the system, and displaying the output produced by the system.


2 Answers

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 
like image 99
Ignacio Vazquez-Abrams Avatar answered Sep 22 '22 13:09

Ignacio Vazquez-Abrams


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 
like image 40
Anthony O. Avatar answered Sep 19 '22 13:09

Anthony O.