Сховати "історію -d" в історії баш


14

Якщо я випадково введіть свій пароль або що-небудь ще чутливе до bash, я легко можу видалити цей рядок history -d ROW#, але мені завжди залишається history -d ROW#команда в історії, яка показує всім, що хтось виправив помилку.

Чи можу я додати щось до команди, щоб запобігти появі в історії башів?

Відповіді:


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 Розділений
двокрапкою список значень, що керують тим, як команди зберігаються у списку історії. Якщо список значень включає простір ігнорування , рядки, які починаються із символу пробілу, не зберігаються у списку історії . Значення ігнорованих змушує рядки, що відповідають попередньому запису історії, не зберігаються. Значення ignoreboth - це стенограма для простору ігнорування та ігнорування .

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*'

6

Ти можеш

  • Закрийте вікна терміналів . Це перекине останню історію у вікно терміналу, яке ви закриєте останнє (після закриття інших вікон) у файл/home/$USER/.bash_history

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

    Таким чином ви можете оглянути всю історію та видалити будь-які команди, щоб ви більше не хотіли бути там.

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

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


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

Для цього вам потрібно або ігнорувати простір, або ігнорувати в системі HISTCONTROL. Наприклад, бігайте

HISTCONTROL = Ігнорує простір. Щоб зробити цю настройку стійкою, поставте її у свій .bashrc.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.