【问题标题】:Is it possible to launch and record only the input of a bash session?是否可以仅启动和记录 bash 会话的输入?
【发布时间】:2021-05-23 18:07:13
【问题描述】:

我正在努力实现以下目标:

让 python 脚本启动一个 shell。用户将该外壳用于他需要的任何目的。关闭 shell 后,python 脚本可以使用仅输入命令的日志进行解析。

我得到的只是通过 popen 和类似方法调用 shell 的方法,但这并不是我所需要的。

【问题讨论】:

  • 你需要那个外壳有多现实?如果它不需要标准输入成为真正的 TTY,这完全是微不足道的(stdin=PIPE,让您的 Python 代码读取标准输入,记录它,然后将其发送到管道,就可以了)。如果您 确实 需要 stdin 成为真正的 TTY,我可能会使用 pexpect 来完成繁重的工作(并鼓励您在真正尝试使用 said 后回来问一个更具体的问题工具)。
  • “为什么不直接使用管道?”顺便说一句,pexpect FAQ @pexpect.readthedocs.io/en/stable/FAQ.html 的部分详细介绍了“不需要标准输入成为真正的 TTY”案例的限制。
  • @CharlesDuffy 它需要是一个实际的外壳。我正在尝试制作一个 python 脚本来记录输入命令并使用它们来创建各种脚本库。
  • ...我的意思是,bash 的副本是一个“真正的 shell”,即使它的标准输入不是 TTY;有些行为有点不对劲。无论如何,如果你使用我的答案,你的子进程认为它有一个 TTY,所以它完全正常工作。
  • (也就是说,我不确定您正在做的事情是否一定会按照您的意愿工作——当标准输入在程序之间切换时,时间会产生影响:重播太快,并且错误的程序可能会消耗内容)。

标签: python linux shell


【解决方案1】:

最简单的方法是使用pexpect。此外,它附带的示例包括script.py,它 开箱即用的行为类似于 UNIX script 命令(同时记录标准输入和标准输出),但只需要进行一行更改即可完成您想要的操作:

p.logfile = fout 更改为p.logfile_send = fout,您将只记录发送到远程进程的数据;或者,您可以将其设为p.logfile_recv = fout,并且您将仅记录该进程收到的数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-22
    • 2013-11-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2015-12-14
    • 1970-01-01
    相关资源
    最近更新 更多