【发布时间】:2014-06-28 02:00:49
【问题描述】:
如何实时捕获脚本的输入/输出(例如使用 tee),但逐行而不是逐个字符?我的目标是仅在退格和自动完成完成处理后(按 RETURN 键后)捕获键入到脚本的交互式提示中的输入。
具体来说,我正在尝试为 ssh 创建一个包装脚本,该脚本创建一个带有时间戳的远程服务器上使用的命令日志。 The script 使用 tee 重定向输出以进行过滤,效果很好,但是每当我使用退格键或向上/向下键滚动浏览远程历史记录时,重定向的输出就会与未提交的字符混杂在一起。例如:service test stopexitservice test stopart 或 cd ..logs[1Pls -al。
也许有一种方法可以捕获终端的回滚并像使用 tee 一样重定向?
更新:我找到了一个character-based cleanup solution,它大部分时间都能满足我的需求。但是,我仍然希望得到这个问题的答案(这很可能是 msw 很难做到的答案)。
【问题讨论】:
-
试试这个来自 unix.stackexchange.com 的答案:unix.stackexchange.com/questions/14684/…。但是,最好在远程机器上使用 bash 历史记录。
-
因为我经常连接到这么多不同的远程服务器,所以我需要一种将日志保存在本地的自动化方式。链接中的一个答案处理退格擦除,但不是向上/向下命令完成,这会导致在通过命令
exit、service test stop和service test start分页时生成诸如service test stopexitservice test stopart之类的日志(即使我实际上不要使用这些命令)。不过,谢谢! -
为每个登录会话创建一个新的历史文件(带有时间戳)。确保其经常更新。编写一个小型 crontask,将历史文件(使用 sftp)移动到本地存储库。 rsync 可能会有所帮助。如有必要,编写一个 ssh 包装器来记录您连接到的远程计算机(但您必须避免从远程计算机进行 ssh。)另一种选择:使用 sshfs 将历史文件保存在本地计算机上。
-
这可能是我唯一的选择,但我仍然希望有一个本地解决方案。远程服务器大多不是由我管理的,登录通常是 root 或共享的(当然是非生产的),并且 ssh 会话通常是链式的,因此调整所有服务器的历史记录甚至运行自动下载会很耗时,而且/ 或不礼貌。
-
然后在您的提示中添加一个时间戳。 (PS1)——或者弄清楚如何使用 bash 历史来实现它,我仍然认为这是你最好的选择。
标签: bash ssh io-redirection tee