gpt4 book ai didi

bash - Bash:如何仅在完整的行中复制交互式脚本的输入/输出?

转载 作者:行者123 更新时间:2023-12-02 14:03:31 25 4
gpt4 key购买 nike

如何实时捕获脚本的输入/输出(例如使用tee),但要逐行而不是逐字符地捕获?我的目标是仅在退格键和自动补全完成处理后(按RETURN键之后),捕获键入到脚本的交互式提示中的输入。

具体来说,我正在尝试为ssh创建包装脚本,该脚本创建带有时间戳的远程服务器上使用的命令的日志。 The script使用tee重定向输出以进行过滤,效果很好,但是每当我使用Backspace键或上/下键滚动浏览远程历史记录时,重定向的输出都会与未提交的字符混杂在一起。例如:service test stopexitservice test stopartcd ..logs[1Pls -al

也许有一种方法可以捕获终端的回滚并像tee一样重定向?

更新:我发现character-based cleanup solution可以满足我大部分时间的需求。但是,我仍然希望对此问题有一个答案(这很可能是msw的答案,很难做到)。

最佳答案

在Unix世界中,有两种处理键盘输入的主要模式。这些被称为“原始”,其中字符一次从终端传递到读取程序。这是编辑器(等)将使用的模式,因为当您按下一个键时,编辑器需要立即做出响应。

另一个终端规则称为“煮熟”,它是您认为是bash逐行输入的逐行行为,您可以在其中退格,直到按回车键才执行命令。 Ssh必须以逐字符的原始模式进行输入,因为它不知道另一端正在运行什么。例如,如果您在另一端运行编辑器,则在发送按键之前它不能等待返回。因此,正如某些人所建议的那样,在最远的地方获取shell历史记录是获取键入的bash命令逐条命令记录的唯一合理方法。

为了简化起见,我简化了一些;实际上,大多数bash安装都是以原始模式输入的,因为它们允许像命令修改一样的编辑器。例如,Ctrl-P向上滚动命令历史记录,或者Ctrl-A转到该行的开头。而且bash需要能够在键入键时立即获取这些键,而不必等待返回。

这是在本地进行捕获非常困难的另一个原因:如果在本地进行捕获,则流中将填充Backspaces和bash所有bash编辑命令的。要获得远程 shell 程序实际执行的真实记录,您必须像解析远程 shell 程序一样分析字符流。如果您运行类似的东西也有问题

vi /some_file/which_is_on_the_remote/machine

本地ssh的输入流将充满运动命令片段,包括退格键等等,这很难确定bash命令的组成部分以及与编辑器的对话内容。

很少有涉及计算机的事情是不可能的。从ssh调用的本地获取干净的输入确实非常困难。

关于bash - Bash:如何仅在完整的行中复制交互式脚本的输入/输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24462930/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com