将HISTFILE设置为命名管道

时间:2015-02-20 18:44:07

标签: python linux bash

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

我尝试了以下内容:

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. 还有另一种方法可以不断地远程推送数据吗?
  3. *背景:几个月前我在主电脑上安装了wifi usb加密狗的驱动程序,但是PC现在无法启动(我认为电源问题),我在上网本上升级了ubuntu(我正在运行)旧版本不再更新了。)和正常的wifi无法正常工作,所以我插入了usb wifi并且它可以工作(但是很脆弱)我知道解决这些问题我必须执行其他一些步骤,但是事实上,现在我需要谷歌的东西(我不记得我得到的建议是否简单或现在没有,或者如果我不得不小提琴)。这让我想到能够随着时间的推移逐个设备搜索历史将是一个很好的事情。我想要下载BASH源并在那里注入一些内容并重新编译和使用它,但是我必须为每个设备做到这一点,在开始时只需将一些东西扔到PC中就更方便了。安装并完成它。

    *对问题/意见的最新回应 虽然通过PID分割成不同的hist文件是描述命令历史的好方法,但我不确定如何在每次更新时将每个命令推送到远程数据库,我几乎要打开pid命名文件,抓住内容并推送到远程数据库,并删除内容,希望不会阻止shopt?运行命令来存储下一个发生的命令(假设你一次有一堆命令)。你有什么建议是否有问题?

1 个答案:

答案 0 :(得分:1)

我担心没有简单的方法可以按照你想要的方式拦截历史。我刚看了一下bash源代码,有很多问题几乎不可能用管道替换普通的历史文件:

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

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

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

也许更好的解决方案是监视文件系统事件,以便检测历史文件的更改。不像听管道那么简单,但如果你有兴趣可以查看inotify API