我在Linux上有一个程序,如果它的标准输入/输出不是TTY(终端设备),就会拒绝运行。是否有一个易于使用的工具,可以创建一个PTY,使用新创建的TTY启动程序,并将所有数据复制到标准输入/输出?
使用场景不是交互式的,而是脚本化的。我正在寻找最轻量级的解决方案,最好不要创建TCP连接,并且不需要安装太多其他工具和库。
unbuffer
是expect的一部分(在Ubuntu Lucid上要安装sudo apt-get install expect-dev
),可以欺骗一个程序,让它认为自己已经连接到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
unbuffer
:brew install expect
。 - forivall