如何实时捕获脚本的输入/输出(例如使用 tee),但逐行而不是逐个字符?我的目标是仅在退格键和自动完成完成处理后(按下 RETURN 键后)捕获输入到脚本交互式提示中的输入。
具体来说,我正在尝试为 ssh 创建一个包装器脚本,该脚本创建远程服务器上使用的带时间戳的命令日志。剧本 http://pastebin.com/VdaKShX8,它使用 tee 重定向输出进行过滤,效果很好,但每当我使用退格键或向上/向下键滚动浏览远程历史记录时,重定向的输出就会与未提交的字符混在一起。例如:service test stopexitservice test stopart
or cd ..logs[1Pls -al
.
也许有一种方法可以捕获终端的回滚并像 tee 一样重定向它?
更新:我发现了一个基于字符的清理解决方案 https://unix.stackexchange.com/a/139876/37818大多数时候这就是我想要的。不过,我仍然希望得到这个问题的答案(这很可能是msw的答案,很难做到)。
在 Unix 世界中,有两种主要的处理键盘输入的模式。这些被称为“原始”,其中字符一次一个地从终端传递到阅读程序。这是编辑器(等)将使用的模式,因为编辑器需要在您按下某个键时立即响应。
另一个终端规则称为“cooked”,它是逐行行为,您可以将其视为 bash 逐行输入,您可以按退格键,并且在按回车键之前不会执行命令。 ssh 必须以原始的、逐字符的模式接受您的输入,因为它不知道另一端正在运行什么。例如,如果您在远端运行编辑器,则它在发送按键之前无法等待返回。因此,正如一些人所建议的那样,获取远端的 shell 历史记录是获取您键入的 bash 命令的逐个命令记录的唯一合理方法。
为了清楚起见,我过于简单化了;实际上,大多数 bash 安装都以原始模式接受输入,因为它们允许像编辑器一样的命令修改。例如,Ctrl-P 向上滚动命令历史记录或 Ctrl-A 转到行首。 bash 需要能够在键入这些键时立即获取这些键,而不是等待返回。
这是在本地端捕获非常困难的另一个原因:如果您在本地端捕获,流将充满退格键和所有 bash 的编辑命令。要获得远程 shell 实际执行内容的真实记录,您必须像远程 shell 一样解析字符流。如果你运行类似的东西也会有问题
vi /some_file/which_is_on_the_remote/machine
本地 ssh 的输入流将充满移动命令文本片段,包括退格键等,并且很难弄清楚 bash 命令的一部分是什么以及您在与编辑器交谈什么。
涉及计算机的事情很少有是不可能的;从 ssh 调用的本地获取干净的输入确实非常困难。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)