【问题标题】:Setting HISTFILE to a named pipe将 HISTFILE 设置为命名管道
【发布时间】:2015-02-20 18:44:06
【问题描述】:

我一直在寻找如何做到这一点,似乎已经多次提到它作为建议,我还没有找到一个例子。

我尝试了以下方法:

mkfifo /tmp/testpipe
mknod /tmp/testpipe p

最后我更新了我的 ~/.bashrc 文件以包含以下内容: HISTFILE=/tmp/testpipe

我在网上找到了一个应该读取管道的脚本:

#!/bin/bash

pipe=/tmp/testpipe

trap "rm -f $pipe" EXIT

if [[ ! -p $pipe ]]; then
    mkfifo $pipe
fi

while true
do
    if read line <$pipe; then
        if [[ "$line" == 'quit' ]]; then
            break
        fi
        echo $line
    fi
done

echo "Reader exiting"

我已经用写入管道的类似“hello world”运行它,它确实显示了它(所以我知道管道存在,并且可以接收数据)。

当我将 bashrc 设置为上述并重新启动我的终端时,直到我两次点击控制 C 后才得到命令提示符(假设它正在尝试写入命名管道,但我没有正在运行的脚本所以我不能“阅读它”,所以我必须杀死它)。随着我继续,它会保留历史记录,但那是因为它在 ram 中并且没有被推送到文件中。

我发现这可能有一些有用的信息,但我只是不确定如何使它适用于我正在尝试做的事情。 https://askubuntu.com/questions/67283/is-it-possible-to-make-writing-to-bash-history-immediate 当我尝试结合命名管道输入其中一些内容时,我从来没有得到命令提示符。我终于关闭了 shell,并注释掉了这些行。

我的最终目标是我希望能够在发出每个命令时将它们推送到在线数据库或其他东西,这样我就可以拥有类似于网页的东西类似浏览历史,但用于命令。它会告诉我我在每台设备上使用了哪些命令、日期和时间。

我最初的想法是,我也许可以通过命名管道来做到这一点,但我不知道这是否可行或合乎逻辑。

我希望我可以设置命名管道,然后启动 python 或其他东西来读取写入的管道,然后将数据推送到网上说 firebase 或其他东西。

我想我有几个问题。

  1. 命名管道对于整个事情来说是个好主意吗? (如果没有,您还有其他想法吗?)
  2. 还有其他方法可以持续远程推送数据吗?

*背景:几个月前我在我的主电脑上安装了一个 wifi usb 加密狗的驱动程序,但那台电脑现在无法启动(我认为是电源问题),我在上网本上升级了 ubuntu(我正在运行不再更新的旧版本。)并且普通的wifi无法正常工作,所以我插入了usb wifi并且它可以工作(但很不稳定)我知道要解决这些问题我必须执行一些其他步骤,但是事实上,现在我需要用谷歌搜索(我不记得我现在得到的建议是否直截了当,或者如果我不得不摆弄)。这让我想到,随着时间的推移,能够通过设备搜索历史记录将是一件好事。我想下载 BASH 源并在其中注入一些东西并重新编译和使用它,但是我必须为每个设备都这样做,在开始时将一些东西扔到 PC 中会更方便安装并完成它。

*针对问题/评论的更新 虽然通过 PID 拆分为不同的历史文件是描述命令历史记录的好方法,但我不确定每次更新发生时如何将每个命令推送到远程数据库,我几乎必须打开 pid 命名文件,抓取内容并推送到远程数据库,并在希望不阻塞商店的同时擦除内容?命令从运行到存储下一个发生的命令(假设您一次有一堆命令)。对于这是否会成为问题,您有什么建议吗?

【问题讨论】:

  • 您可以将 HISTFILE 设置为一个表达式,包括每个 shell 的唯一内容,例如pid,然后使用该 askubuntu 页面中的解决方案。那时,每个 shell 都有一个单独的 histfile,您可以使用外部进程对其进行查询。当然,这也可能会破坏在新 shell 上加载 histfile;也许 pid 以外的其他方案是合适的。

标签: python linux bash


【解决方案1】:

恐怕没有简单的方法可以按照您想要的方式截取历史记录。我刚刚查看了 bash 源代码,并且有许多问题几乎无法用管道替换普通的历史文件:

1) bash 在启动时读取历史记录,但当然,这只有在历史记录是纯文件时才有效(除非您的程序非常聪明并将字符作为虚假历史记录注入 - 但请参阅下一点)。这可能就是你的 shell 挂起的原因。

2) bash 限制文件大小,因此它必须使用仅适用于普通文件的服务(例如“truncate”、“lseek”...)。

3) bash 处理历史的方式取决于其版本/构建。如果用于在一个版本上运行的解决方案停止在另一个版本上运行,我不会感到惊讶。

也许更好的解决方案是监视文件系统事件以检测历史文件的更改。不是听管子那么简单,有兴趣的可以去inotify API看看。

【讨论】:

  • 监控历史文件更新的一个问题是它不会在每个命令之后推送历史,只有当它最终推送到历史文件时,我相信我读到它只会在您关闭会话时推送。此外,我无法按会话将其分解(如果我在每个窗口中执行不同的操作,这确实是理想的)。我将不得不继续思考解决此问题的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-26
  • 2010-11-11
  • 1970-01-01
  • 1970-01-01
  • 2013-05-31
相关资源
最近更新 更多