我希望能够在启动交互式进程时注入初始命令,以便我可以执行以下操作:
echo "initial command" | INSERT_MAGIC_HERE some_tool
tool> initial command
[result of initial command]
tool> [now I type an interactive command]
Run Code Online (Sandbox Code Playgroud)
什么行不通:
只是管道输入初始命令不起作用,因为这导致stdin没有连接到终端
写入/ dev/pts/[number]将输出发送到终端,而不是输入到进程,就像它来自终端一样
什么会有缺点:
创建一个分叉子命令,写入stdin,然后从自己的stdin转发所有内容.下行 - 终端控制事物(如线与字符模式)不起作用.也许我可以用代理伪终端做些什么?
使用命令行选项创建xterm的修改版本(我正在为此任务启动一个),以在遇到所需的提示字符串后注入其他命令.丑陋.
制作我正在尝试运行的工具的修改版本,以便它在命令行上接受初始命令.打破标准安装.
(顺便提一下,当前感兴趣的工具是android的adb shell - 我想在手机上打开一个交互式shell,自动运行命令,然后进行交互式会话)
我正在编写一个程序,从stdin读取输入,操作输入,并将输出写入stdout.但是,许多程序检查stdin是终端还是管道(通过调用类似函数isatty),并以不同方式生成输出.我如何让我的程序假装成TTY?
该解决方案应适用于Linux和macOS.任何生成独立二进制文件的编程语言都是可以接受的,但Go是首选.
请注意,我问的是一个编程问题,而不是要求一个工具.所以,我喜欢script或unbuffer不喜欢的东西.
我正在试图弄清楚如何在linux中使用伪终端,基本上我想创建一个telnetd克隆,我之前在一个问题中提到过.
我理解主从终端的概念,我对如何在C中使用系统调用有了基本的把握.
我的问题涉及打开slave/master文件描述符后的下一步.如何在奴隶中推出getty?网上是否有使用forkpty(),openpty()或其他API的好资源?
C中的一些例子会有所帮助.这是一个非常相似的问题,但没有人真正提供任何例子.
我目前正在尝试使用ncurses编写一个最小的终端多路复用器.但是,当我尝试execvshell时,它不会打印到窗口,而是启动一个新的子进程来控制窗口(即忽略ncurses).
我怎样才能防止这种情况并让ncurses控制它?有没有办法获得tty并控制它?
编辑
感谢Ross Ridge的评论,我现在知道我需要创建一个伪终端,然后我将其读入一个ncurses窗口.但是,我无法弄清楚如何在ncurses窗口中打印stdout.是否有读取文件描述符的ncurses函数?或者我必须使用read()与printw()不知何故?