Скрыть «историю -d» в истории Bash

14

Если я случайно ввожу свой пароль или что-то еще, что может быть чувствительным, в bash, я могу легко удалить эту строку с помощью history -d ROW#, но я всегда остаюсь с history -d ROW#командой в истории, показывающей всем, что кто-то исправил ошибку.

Могу ли я добавить что-то в команду, чтобы она не появлялась в истории Bash?

Калле Линг
источник

Ответы:

27

Чтобы не сохранять ни одной команды в вашей истории, просто поставьте перед ней пробел (отмеченный здесь):

$ echo test
test
$ history | tail -n2
 3431  echo test
 3432  history | tail -n2
$ echo test2
test2
$ history | tail -n2
 3431  echo test
 3432  history | tail -n2

Это поведение задается в вашем ~/.bashrcфайле, а именно в этой строке:

HISTCONTROL=ignoreboth

man bash говорит:

HISTCONTROL
Список значений, разделенных двоеточиями, управляющий тем, как команды сохраняются в списке истории. Если в списке значений есть пробел игнорирования , строки, начинающиеся с пробела, не сохраняются в списке истории . Значение ignoredups приводит к тому, что строки, соответствующие предыдущей записи истории, не сохраняются. Значение ignoreboth является сокращением для ignorespace и ignoredups .

ignoredupsКстати, причина, почему history | tail -n2появляется только один раз в истории в вышеупомянутом тесте.


История терминала сохраняется в оперативной памяти и сбрасывается на ваш, ~/.bash_historyкак только вы закрываете терминал. Если вы хотите удалить конкретную запись из вашей, ~/.bash_historyвы можете сделать это с помощью sed:

                                   # print every line…
sed '/^exit$/!d' .bash_history     # … which is just “exit”
sed '/^history/!d' .bash_history   # … beginning with “history”
sed '/>>log$/!d' .bash_history     # … ending with “>>log”
sed '\_/path/_!d' .bash_history    # … containing “/path/” anywhere

В последнем я изменил разделитель /по умолчанию, так _как он используется внутри поискового запроса, фактически он равен sed -i '/\/path\//d' .bash_history. Если команда выводит только те строки, которые вы хотите удалить, добавьте -iпараметр и измените !dна, dчтобы выполнить удаление:

                                   # delete every line…
sed -i '/^exit$/d' .bash_history   # … which is just “exit”
sed -i '/^history/d' .bash_history # … beginning with “history”
sed -i '/>>log$/d' .bash_history   # … ending with “>>log”
sed -i '\_/path/_d' .bash_history  # … containing “/path/” anywhere
Десерт
источник
12

Одним из способов было бы установить HISTIGNOREпеременную среды. Изman bash

HISTIGNORE
      A colon-separated list of patterns used to decide which  command
      lines  should  be  saved  on  the history list.  Each pattern is
      anchored at the beginning of the line and must  match  the  com‐
      plete  line  (no  implicit  `*'  is  appended).  Each pattern is
      tested against the line after the checks specified  by  HISTCON‐
      TROL  are  applied. 

[FWIW, по умолчанию HISTCONTROLэто обходной путь типа a-space-in-front].

Так, например

HISTIGNORE='history -d*'

Если вы хотите, чтобы он был постоянным, экспортируйте его из ~/.bashrc

export HISTIGNORE='history -d*'
steeldriver
источник
6

Вы можете

  • Закройте окно терминала (ов) . Это сбросит самую последнюю историю в окне терминала, которое вы закрываете последним (после закрытия других окон) в файл/home/$USER/.bash_history

  • Редактируйте файл/home/$USER/.bash_history без участия bash, например, запустив ваш любимый редактор через Alt+F2

    Таким образом, вы можете просмотреть всю историю и удалить любые команды, которые вам больше не нужны.

    введите описание изображения здесь

    введите описание изображения здесь

sudodus
источник
1

Я обычно использую:

history -w; history -c; $EDITOR $HISTFILE; history -r

Файл истории записывается на диск, очищается в памяти, вы редактируете его так, как хотите, а затем отредактированный файл истории снова считывается.

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

Другой вариант использования -dзаключается в использовании предиктивных номеров истории:

startide sr> # good thing
startide sr> # bad thing
startide sr> history | tail -n 2
17239  # bad thing
17240  history | tail -n 2
startide sr> history -w; history -d 17239; history -d 17239; history -d 17239
startide sr> # other thing
startide sr> history | tail -n 3
17239  # good thing
17240  # other thing
17241  history | tail  -n 3

В этом примере я удаляю плохую вещь, я удаляю команду, чтобы получить номер истории, а затем я удаляю команду, которую я использовала для удаления истории. Все тогда продезинфицировано.

Сет Робертсон
источник
0

Если вы хотите выполнить команду, не сохраняя ее в истории, добавьте ее с дополнительным пробелом

prompt$ echo saved
prompt$  echo not saved \
> #     ^ extra space

Чтобы это работало, вам нужно либо ignorespace, либо ignoreboth в HISTCONTROL. Например, запустить

HISTCONTROL = ignorespace Чтобы сделать этот параметр постоянным, поместите его в свой .bashrc.

bkdroid13
источник