2015-02-20 2 views
2

Я искал все, как это сделать, и кажется, что это было упомянуто несколько раз в качестве предложения, мне еще предстоит найти пример.Настройка HISTFILE на именованный канал

Я попытался следующие:

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" 

Я запустил его со сравнимым «миром привет», который записывается в трубу, и он отображает его (поэтому я знаю, что труба существует и может принимать данные).

Когда я устанавливаю bashrc на вышеописанное и перезапускаю свой терминал, я не получаю командную строку до тех пор, пока я не дважды удалю элемент управления C (предположим, что он пытается записать именованный канал, но у меня нет работы сценарий, поэтому я не могу «прочитать его», поэтому я должен его убить). По мере того как я продолжаю, он сохранит историю, но это потому, что она находится в баране и не подталкивается к файлу.

Я нашел это, у которого может быть какая-то полезная информация, но я просто не уверен, как заставить его работать на то, что я пытаюсь сделать. https://askubuntu.com/questions/67283/is-it-possible-to-make-writing-to-bash-history-immediate Когда я попытался ввести некоторые из них в сочетании с именованным каналом, у меня никогда не было командной строки. Я, наконец, только что закрыл оболочку и прокомментировал эти строки.

Моя конечная цель состоит в том, что я хотел бы иметь возможность принимать каждую команду по мере ее выпуска, а затем вставлять их в онлайн-базу данных или что-то в этом роде, поэтому я могу иметь что-то похожее на историю просмотра веб-страниц, но для команд. Он расскажет мне, какие команды я использовал на каждом устройстве, даты и время.

Моя первоначальная мысль состоит в том, что я мог бы сделать это через именованный канал, но у меня нет подсказки, если бы это даже работало или имеет логический смысл.

Я надеялся, что смогу настроить именованный канал, а затем запустить python или что-то прочитать трубу, как она написана, и нажать данные онлайн, чтобы сказать firebase или что-то еще.

У меня есть несколько вопросов.

  1. Является ли именованная труба даже хорошей идеей для всего этого? (если у вас нет других идей?)
  2. Есть ли другой способ постоянно удалять данные удаленно?

* фон: Я установил драйверы для WiFi USB ключ на основном компьютере несколько месяцев назад, но компьютер не будет загружаться прямо сейчас (вопросы питания я думаю), я обновил Ubuntu на свой нетбук (Я запускал старую версию, которая больше не обновлялась.), И обычный Wi-Fi не работал, поэтому я подключил USB-WiFi, и он работает (но это шелушащийся). Я знаю, чтобы решить те проблемы, которые мне пришлось выполнить несколько других шаги, но как бы то ни было, теперь мне нужно google вещи (и я не помню, были ли рекомендации, которые я получил, были прямолинейными или нет сейчас, или если бы мне пришлось поиграть). Это подтолкнуло меня к мысли, что возможность поиска истории с помощью устройства с течением времени будет выглядеть как-то аккуратно.Я рассказываю о загрузке источника BASH и впрыскивании чего-то там, а также перекомпиляции и использовании этого, но я должен был бы сделать это для каждого устройства, было бы гораздо проще всего перебросить несколько вещей на ПК в начале установить и сделать с ним.

* ОБНОВЛЕНИЕ В ОТНОШЕНИИ К ВОПРОСУ/КОММЕНТАРИИ Разделение на разные файлы с помощью PID - хороший способ определить историю команд, я не уверен, как каждый раз удалять каждую команду в удаленной базе данных при каждом обновлении , Мне почти пришлось бы открыть файл pid с именем, захватить содержимое и нажать на удаленный db, и стереть содержимое, надеясь, что не заблокирует магазин? команды от запуска, чтобы сохранить следующую следующую команду (при условии, что вы куча команд забиваете за раз). Есть ли у вас какие-либо предложения, будет ли это проблемой или нет?

+1

Вы можете установить 'HISTFILE' выражение, включающее что-то уникальное для каждой оболочки, например. pid, затем используйте решение с этой страницы askubuntu. В этот момент у вас будет отдельный файл histfile для каждой оболочки, с которой вы могли бы запросить внешний процесс. Конечно, это может также сломать загрузку файла histfile в новой оболочке; может быть, какая-то другая схема, кроме pid. –

ответ

1

Я боюсь, что нет простого способа перехватить историю так, как вы хотели бы сделать. Я только что посмотрел на источник bash, и есть много проблем, из-за которых практически невозможно заменить простой файл истории на канал:

1) bash ПРОЧИТАЕТ историю при запуске, но, конечно, это может работать, только если история - это простой файл (если только программа yor не очень умна и не вводит символ в качестве поддельной истории, но смотрите на следующие пункты). Вероятно, это причина, по которой ваша оболочка зависает.

2) bash ограничивает размер файла, поэтому он должен играть с сервисами, которые применяются только к простым файлам (например, «усекать», «lseek» ...).

3) способ истории управления bash зависит от его версии/сборки. Я не удивлюсь, если решение, которое использовалось для работы над версией, перестало работать над другим.

Возможно, лучшим решением является мониторинг событий файловой системы, чтобы обнаружить изменения в файле истории. Не так просто, как слушать трубку, но если вас это интересует, вы можете взглянуть на inotify API.

+0

Одним из зависаний для мониторинга обновлений файлов истории является то, что он не будет толкать историю после каждой команды, только когда она, наконец, подталкивает к файлу истории, я * верю *, я читал, что он будет только толкать, когда вы закроете сеанс , Кроме того, я бы не смог сломать сессию (это действительно идеальный вариант, если я делаю разные операции в каждом окне). Мне придется постоянно думать о том, как обойти это. – onaclov2000

Смежные вопросы