将数据传输到需要 TTY(终端)的 Linux 程序
Posted
技术标签:
【中文标题】将数据传输到需要 TTY(终端)的 Linux 程序【英文标题】:Piping data to Linux program which expects a TTY (terminal) 【发布时间】:2011-05-13 03:20:29 【问题描述】:我在 Linux 中有一个程序,如果它的标准输入/标准输出不是 TTY(终端设备),它会拒绝运行。是否有一个易于使用的工具来创建 PTY,使用新创建的 TTY 启动程序,并通过 stdin/stdout 复制所有数据?
用例不是交互式的,而是脚本。我正在寻找最轻量级的解决方案,最好不要创建 TCP 连接,并且不需要安装太多其他工具和库。
【问题讨论】:
【参考方案1】: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 的非生产就绪(未正确退出)参考实现:man7.org/tlpi/code/online/dist/pty/unbuffer.c.html 我可以从这里获取源代码(unbuffer.c):man7.org/tlpi/code/download/tlpi-101113-dist.tar.gz . Mac OS,使用自制软件,unbuffer
可以用brew install expect
安装【参考方案2】:
您可以为此使用socat
:echo your stdin strings | socat EXEC:"your_program",pty STDIO >/stdout_file
例如bash
:echo ls | socat EXEC:'bash',pty STDIO >/tmp/ls_out
或described here,对于使用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
【讨论】:
以上是关于将数据传输到需要 TTY(终端)的 Linux 程序的主要内容,如果未能解决你的问题,请参考以下文章