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

2024-04-09

如何实时捕获脚本的输入/输出(例如使用 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(使用前将#替换为@)

Bash:如何仅在完整的行中复制交互式脚本的输入/输出? 的相关文章

  • Bash:循环遍历字符串数组后无法读出带空格的字符串

    我正在使用循环读取数组的内容 该数组包含名为 music 的目录层次结构中的所有目录和文件 内容是 find 命令先前输出的字符串 这个想法是根据流派 艺术家和标题将 directory contents 中每个数组元素的完整目录路径分成子
  • exec git 命令拒绝重定向到 Go 中的文件

    我试图从 go 调用 git log 并将输出重定向到给定文件 cmdArgs string log numstat reverse fmt Sprintf s HEAD 89c98f5ec48c8ac383ea9e27d792c3dc77
  • 使用 mkfifo 和传输流,这可能吗?

    我想执行一个 bash 脚本来执行以下操作 应用程序 ffmpeg 生成实时传输流 ts 文件 我需要处理这个实时流 执行解复用等 现在我知道这必须通过 FIFO 来完成 但这是我的任务 我需要重定向 ffmpeg 的输出以写入 fifo
  • Expect 远程 SSH 登录并执行命令的脚本

    我正在使用以下 Expect 脚本远程 SSH 登录 Raspberry Pi 并执行命令 usr bin expect set timeout 60 spawn ssh lindex argv 1 lindex argv 0 expect
  • 将 JSON 数组转换为 bash 数组并保留空格

    我想将 JSON 文件转换为 bash 字符串数组 稍后我可以对其进行迭代 我的JSON结构如下 USERID TMCCP CREATED DATE 31 01 2020 17 52 USERID TMCCP CREATED DATE 31
  • touch命令在一个目录下创建多个文件(不同名称)

    我想制作一个在 bash 中创建目录和文件结构的脚本 我尝试过这样的事情 mkdir p 1 2 touch 1 2 a b c a b c 应该是在一个命令或其他命令中创建的文件 但由于某种原因 结构是这样的 current folder
  • 将数组传递给函数名称冲突

    Specs GNU bash 版本 3 1 17 无法升级 Premise 我一直在摆弄数组 我想知道是否有任何方法可以让函数的本地变量与所述函数外部的数组同名 Example 在下面的示例中 我将尝试显示该问题 Working bin b
  • 如何将长选项与 Bash getopts 内置一起使用?

    我正在尝试解析 tempBash getopts 的选项 我这样调用我的脚本 myscript temp foo bar someFile 这是我用来解析选项的代码 while getopts temp shots o option do
  • 通过 SSH 的 Pygame 不注册击键(Raspberry Pi 3)

    所以我得到了 raspi 3 和简单的 8x8 LED 矩阵 在玩了一些之后 我决定用 pygame 的事件制作一个简单的蛇游戏 显示在该矩阵上 我之前没有 pygame 的经验 除了 LED 矩阵之外 没有连接任何屏幕 显示器 所以最初的
  • 我的 unix 脚本出了什么问题

    bin bash while echo n Player s name read name name ZZZ do searchresult grep name playername if searchresult 0 then echo
  • 如何将命令作为参数传递给 ssh [重复]

    这个问题在这里已经有答案了 我的需要是让这个命令起作用 sshpass p XXXX ssh oStrictHostKeyChecking no email protected cdn cgi l email protection sudo
  • 保存和恢复陷阱状态?管理多个陷阱处理程序的简单方法?

    有什么好的方法可以覆盖bash陷阱处理程序不会永久破坏可能已设置或尚未设置的现有处理程序 动态管理任意陷阱例程链怎么样 有没有办法保存陷阱处理程序的当前状态 以便以后可以恢复 在 Bash 中保存和恢复陷阱处理程序状态 我将提交以下堆栈实现
  • 从 TypeScript 运行任何 Linux 终端命令?

    有没有办法直接从 TypeScript 类中执行 Linux 终端命令 这个想法是做类似的事情 let myTerminal new LinuxTerminal let terminalResult myTerminal run sudo
  • 无法使用 git 配置文件进行 ssh

    我知道它被问了很多次 但我无法得到我的问题的答案 我正在尝试使用配置文件 ssh 到系统 配置文件是 Host qa HostName 10 218 70 345 User user IdentityFile C Users bean ss
  • Bash 脚本大小限制?

    我有一个 bash 脚本 在 RHEL 或 OS X 上运行时出现以下错误 第 62484 行 意外标记 换行符 附近出现语法错误 第 62484 行 o gz 这是一个自动生成的脚本 用于解决我公司使用的 Grid Engine 计算集群
  • SSH 到 Openshift 服务器失败

    我正在 openshift 服务器上使用 jboss catridge 我希望与其他人共享此实例并添加其他用户的公钥 id rsa pub 当其他人尝试访问该实例时 他会收到以下错误 我在他的实例中尝试了同样的方法 但看到了同样的错误 与
  • shell_exec 的输出被截断为 100 个字符

    当在 shell 中运行以下命令时 curl F file filename http 192 168 0 1 产生以下输出 Accuracy 0 0 1 classification Accuracy 0 0 1 classificati
  • 如何删除最后一次出现模式后的所有行?

    我想删除最后一次出现模式之后的所有行 除了模式本身 file txt honor apple redmi nokia apple samsung lg htc file txt 我想要什么 honor apple redmi nokia a
  • Godaddy 托管上的 CakePHP 控制台

    我一直在努力让我的 CakePHP 网站在 Godaddy 网格托管 帐户上运行 我的蛋糕应用程序设置是从帐户的子目录托管的 并且可以通过子域访问 我必须调整我的 htaccess 文件才能使其正常工作 现在我需要让 CakePHP 控制台
  • bash 支持字边界正则表达式吗?

    我试图在再次添加该单词之前匹配列表中是否存在该单词 以避免重复 我正在使用 bash 4 2 24 并尝试以下操作 foo bmyword b also foo

随机推荐