将数据导入需要TTY(终端)的Linux程序

26

我在Linux上有一个程序,如果它的标准输入/输出不是TTY(终端设备),就会拒绝运行。是否有一个易于使用的工具,可以创建一个PTY,使用新创建的TTY启动程序,并将所有数据复制到标准输入/输出?

使用场景不是交互式的,而是脚本化的。我正在寻找最轻量级的解决方案,最好不要创建TCP连接,并且不需要安装太多其他工具和库。

2个回答

38

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

这里有一个未准备好用于生产环境的(无法正常退出)unbuffer.c 参考实现:http://www.man7.org/tlpi/code/online/dist/pty/unbuffer.c.html。我可以从这里获取源代码(unbuffer.c):http://www.man7.org/tlpi/code/download/tlpi-101113-dist.tar.gz。 - pts
1
在Mac OS上,可以使用homebrew通过以下命令安装unbuffer: brew install expect - forivall

1
你可以使用 socat 来实现这个功能:echo your stdin strings | socat EXEC:"your_program",pty STDIO >/stdout_file 例如,使用 bashecho 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接