Удаление истории из ~ / .bash_history


8

У меня есть пара вопросов об истории терминала или командной строки, которая хранится в ~/.bash_history.

  1. Я могу увидеть файл в терминале с historyкомандой, но если я пытаюсь открыть его с gedit bash_historyфайлом, он полностью пуст. Почему?

  2. Я нашел, как удалить определенное количество строк в файле из терминала с помощью этой строки кода:

    for i in {1..N}; do history -d N; done

    где N - это количество строк (или команд), которые вы хотите удалить, но теперь файл истории показывает эту последнюю команду, и это не очень разумно, если вы пытаетесь раскрыть свои вещи. Итак, вопрос: как я могу дать последнюю строку кода и убедиться, что это не записывается?



На будущее, если вы запустите любую команду с пробелом, эта команда не будет сохранена в вашей истории.
Пэдди Ландау

Ответы:


18
  1. Вы просто забыли предыдущую точку, команда для открытия файла истории терминала (bash)

    gedit ~/.bash_history

    Этот файл обновляется только при закрытии терминала.

  2. Чтобы удалить последние 10 строк из этого файла и не записывать саму эту команду, откройте новый терминал и выполните следующую цепочку команд:

    sed -n -e :a -e '1,10!{P;N;D;};N;ba' ~/.bash_history && history -c && exit

    или

    for i in {1..10}; do sed -i '$d' ~/.bash_history; done && history -c && exit

    или

    head -n -10 ~/.bash_history > ~/.b_h_2 && mv ~/.b_h_2 ~/.bash_history && history -c && exit

    sedили headсоответственно удаляет выбранные строки из ~/.bash_history, history -cочищает историю терминала и exitзакрывает ее.


Более короткая и, как мы надеемся, более быстрая альтернатива for+ sed: head -n -Nгде верхний регистр N- количество удаляемых строк. stackoverflow.com/a/13380679/711006
Мелебиус

2
@Melebius Выглядит многообещающе, но как перенаправить вывод во входной файл, перезаписав его? head -n -N testfile > testfileпросто очищает файл! Я добавил обходной путь, но он, конечно, не короче.
десерт

Вы правы, я забыл, что headне может работать на месте, как sed. В первую очередь я искал одну sedкоманду, заменяющую ваш forцикл. На странице, на которую я ссылаюсь, есть несколько вариантов, но они не так понятны, как ваш код.
Мелебиус

@Melebius Смотрите sed1line.txt для этого - я добавил его выше, он не очень короткий, но должен быть быстрее.
десерт

4

Файл bash_history представляет собой скрытый файл, начинающийся с точки. Вам нужно сделать

gedit ~/.bash_history

Это откроет файл в gedit.


1

Если вы хотите удалить только определенные части вашего журнала команд, то приведенные выше методы вполне подойдут. Если вы хотите остановить ведение журнала команды для определенного сеанса bash, введите команду

unset HISTFILE

Чтобы быть более радикальным, если вы не хотите, чтобы какая-либо из ваших команд была зарегистрирована , то вы можете сделать

rm ~/.bash_history
ln -s /dev/null ~/.bash_history

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


1

Я понимаю, что на это уже есть принятый ответ, но так я делаю это с 80-х годов. Это отличный способ скрыть ваши треки, и это многофазный подход. По большей части это тот, который не замечен, если только вы действительно не обращаете внимание. Вот как это делается.

Откройте терминал / оболочку / сессию и выполните:

 chmod 444 ~/.bash_history

выйдите из оболочки, откройте терминал / оболочку / сессию и выполните: Вот несколько творческих способов навсегда стереть историю

1:

 vi ~/.bash_history
 9999999 dd
 <esc>wq!

2 (создать фальшивую историю)

 sudo echo "which ls" > ~/.bash_history
 sudo echo "cd ~/;ls" >> ~/.bash_history

тогда для хорошей меры:

 chmod 444 ~/.bash_history

выйти из оболочки

откройте новую оболочку и введите

 history

что делает его менее заметным, так это то, что если вы выполните команду ls -ratl, ~ / .bash_history в конце концов исчезнет в погоне за списком каталогов. Он не будет отображаться как ссылка, которая привлекла бы ненужное внимание. Большинство людей не делают -a в корне, что полезно, когда требуется эмуляция.

Недостатком этого подхода является то, что вы теряете способность возвращаться и восстанавливать свою историю. Фактический файл ~ / .bash_history также может оказаться в верхней части списка каталогов, поскольку со временем он может иметь действительно старую дату изменения, что само по себе может привести к обнаружению, что что-то не так.


если вы используете 9999999 ddдля удаления все строки в файле :%d, :1,$dили dGработаете намного лучше
phuclv

0

1) бегать sh; это порождает частичку пепла, который вообще не записывает историю. Редактировать оттуда

2) Добавить строку HISTCONTROL=ignorebothк .bashrc, и сделать , exec bashчтобы навсегда заменить текущую оболочку с инициализируется один, то делать все команды , которые вы не хотите войти с ведущим пространством.


0

так как я пока не могу комментировать, добавлю свои комментарии как ответ:

man history ответит на все это.

Ответ № 1 заключается в том, что история находится в памяти. history -aсохранить в файл немедленно. history -wтакже сохранит, но может испортить другие сессии.

ответ №2:, history -agedit, удалите нужные строки,history -r


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.