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 - 比较 2 个文件列表及其 md5 校验和

    我有 2 个列表 其中包含带有 md5sum 检查的文件 即使文件相同 列表也具有不同的路径 我想检查每个文件的 md5 和 我们正在讨论数千个文件 这就是为什么我需要脚本来仅显示差异 第一个列表是普通列表 第二个列表是文件的当前状态 我想
  • 运行 shell 命令并将输出发送到文件?

    我需要能够通过 php 脚本修改我的 openvpn 身份验证文件 我已将我的 http 用户设置为免通 sudoer 因为这台机器仅在我的家庭网络中可用 我目前有以下命令 echo shell exec sudo echo usernam
  • 带有二进制数据的 Bash echo 命令?

    有人可以解释一下为什么这个脚本有时只返回十六进制字符串表示形式的 15 个字节吗 for i in 1 10 do API IV openssl rand 16 API IV HEX echo n API IV od vt x1 w16 a
  • Ansible bitbucket 克隆配置 ssh 错误

    总之 当使用 Ansible 配置我的 vagrant box 时 在尝试使用 ssh 克隆我的 bitbucket 私有存储库时 我遇到了一个神秘的错误 该错误指出 主机密钥验证失败 然而 如果我流浪 ssh 然后运行 克隆 命令 私有存
  • 通过 ssh 发送命令并读取输出结果

    我有代码通过 ssh 连接到远程服务器并向其发送 2 个或更多命令 例如 cd export home ops bin和 viewlinkload time 20131205 19 但我没有看到命令执行 也没有收到结果 我需要获取服务器返回
  • Android SSH 示例代码

    我想创建一个 android 活动 用于与远程设备 通过 Wifi 建立 SSH 会话并在远程设备上执行一些 Linux 命令 任何人都可以获得一个快速 简短的示例 用于使用以下命令进行连接 身份验证和发送远程命令Trilead https
  • 通过 Node.js 运行 bash 脚本 - 非法选项 -o pipelinefail

    我正在尝试使用 Node js 执行 bash 脚本child process exec 然而它在文件的第二行爆炸 usr bin env bash set eo pipefail TRACE set x echo we are here
  • 如何运行 bash 压缩脚本?

    有没有一种方法可以直接运行带有 参数 的压缩bash脚本 而无需将其解压缩到文件中 然后运行解压缩的文件 例如 我需要使用一些给定的参数执行 setup mysql gzip 压缩脚本 n wordpress locahost 而不先解压缩
  • Xcode 方案预操作脚本未运行

    点击构建 构建日志中不会打印任何内容 是什么赋予了 Xcode 版本 8 2 1 8C1002 预操作发生在构建之前 因此输出不会进入构建日志 而是进入 stdErr 您可以将输出复制到文件中 exec gt PROJECT DIR pre
  • Bash 目录上的 For 循环

    快速背景 ls src file1 file2 dir1 dir2 dir3 Script bin bash for i in src do if d i then echo i fi done Output src dir1 src di
  • BASH 中带有千位分隔符的数字格式

    我有一个号码12343423455 23353 我想用千位分隔符格式化数字 所以输出将是12 343 423 455 23353 printf 3f n 12345678 901 12 345 678 901
  • 从文件中随机采样行

    我有一个大约 40gb 和 1800000 行的 csv 文件 我想随机采样 10 000 行并将它们打印到一个新文件中 现在 我的方法是将 sed 用作 sed n vars lt input txt gt output txt Wher
  • shell脚本中是否有互斥/信号量机制?

    我正在 shell 脚本中寻找互斥 信号量 并发机制 考虑以下情况 除非 a 用户不关闭共享文件 否则 b 用户应该无法打开 更新它 我只是想知道如何在 shell 脚本中实现互斥量 信号量 临界区等 在 shell 脚本中实现锁定机制 文
  • 使用 pscp 命令时出现“未找到命令”

    我正在使用 PuTTY pscp 将项目文件夹传输到 AWS 实例 我可以使用 ppk 公钥文件进行连接并且ssh命令成功打开并登录 这里我使用命令来传输文件夹 pscp r i C path to my keys converted pe
  • 什么是 C 语言的高效工作流程? - Makefile + bash脚本

    我正在开发我的第一个项目 该项目将跨越多个 C 文件 对于我的前几个练习程序 我只是在中编写了我的代码main c并使用编译gcc main c o main 当我学习时 这对我有用 现在 我正在独自开展一个更大的项目 我想继续自己进行编译
  • 在bash中用其他文件过滤一个文件

    我有一个带有数字的文件 例如 cat file 31038467 32048169 33058564 34088662 35093964 31018168 31138061 31208369 31538163 31798862 和其他例如
  • 如何编写 bash 函数来包装另一个命令?

    我正在尝试编写一个函数包装器mysql command If my cnf存在于 pwd 中 我想自动附加 defaults file my cnf到命令 这就是我正在尝试的 function mysql if e my cnf then
  • 通过 SSH 的 sbt (Scala) 结果找不到命令,但如果我自己这样做就可以工作

    所以我正在尝试做一些涉及跑步的事情sbt通过 SSH 命令 这就是我正在尝试的 ssh my username
  • 如何通过主机从外部 SSH 到 VirtualBox 来宾? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有一个在 Windows 7 计算机上运行的 Ubuntu 虚拟机 如何设置才能通过 SSH 从外部访问 Web 服务器 我找到了步骤
  • bash "&" 不打印 "[1]+ Done "

    我在 bashrc 中调用一个脚本来打印打开终端时收到的新消息数 我希望该调用在访问网络时是非阻塞的 有时需要几秒钟 这意味着我无法使用终端直到完成 但是如果我输入 mailcheck 在我的 bashrc 中 它工作正常 但然后打印一个空

随机推荐