134

Как я могу удалить определенную строку из базы данных history ?

12 ответов12

143

Вы можете добиться удаления из файла истории с помощью командной строки в два этапа:

  1. Набор history -d <line_number> удаляет указанную строку из истории в памяти.
  2. Ввод history -w записывает текущую историю в памяти в файл ~/.bash_history .

Два шага вместе навсегда удаляют строку из истории в памяти, а также из файла .bash_history .

102

Вы должны выйти из системы и снова войти или запустить history -a чтобы текущая история была сохранена на диске.

Затем просто отредактируйте файл ~/.bash_history .

38

Чтобы в первую очередь предотвратить добавление команды в историю, убедитесь, что переменная среды HISTCONTROL содержит среди значений, разделенных двоеточиями, значение ignorespace , например (добавьте, например, в .bashrc):

$ export HISTCONTROL=ignorespace

Это предотвратит добавление в историю любой команды с начальным пробелом. Затем вы можете полностью очистить историю, запустив

$  history -c -w
  ^-- additional space character
31

Прежде всего, если команда, которую вы собираетесь выдать, чувствительна, небезопасна или вам просто не нужно, чтобы она загромождала вашу историю, лучше всего / быстрее всего просто предотвратить ее попадание в историю. Убедитесь, что $HISTCONTROL содержит ignorespace:

(bash)$ echo $HISTCONTROL
ignoredups:ignorespace

Затем выполните любую команду, которую вы не хотите в своей истории, пробелом:

(bash)$  sensitive-cmd-with --password 82cf7dfe
(bash)$  rm -r... # One-off recursive remove; mustn't be accidentally repeated!

Если вы случайно поместили нежелательную команду в историю, при условии, что ваша сессия bash все еще открыта, команда еще не коснулась диска. Чтобы удалить предыдущую команду в истории, выполните:

(bash)$  history -d $((HISTCMD-1))

Обратите внимание на ведущий пробел; эта команда требует ignorespace , иначе она просто удалит себя!

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

(bash)$  history 5
  598  ok
  599  sensitive
  600  unsafe
  601  doesn\'t-work
  602  otherwise-unwanted

В этом случае 602 и 599. Тогда выпустите:

(bash)$  for i in {602..599}; do history -d $i; done

(Без ignorespace это будет 603..599.)

Если вы не хотите, чтобы какая-либо история из вашего текущего сеанса попала на диск, выйдите, используя:

(bash)$ kill -9 $$

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

Однако если команды, которые вы хотите удалить, относятся к предыдущему сеансу, они будут уже добавлены в $HISTFILE при выходе. Управление историей с помощью приведенных выше команд все равно добавит оставшиеся новые элементы в $HISTFILE при выходе. Чтобы перезаписать $HISTFILE текущим сеансом просмотра всей истории, выполните прямо сейчас :

(bash)$  history -w

Конечно, для элементов истории, уже находящихся на диске, альтернативой редактированию истории с помощью команд history -d затем выдаче history -w , является редактирование $HISTFILE с помощью текстового редактора.

14

Несколько техник:

Предотвращение сохранения конфиденциальной информации в файле истории

Если вы ввели какой-либо пароль в командной строке, а затем понимаете, что все команды записываются в журнал, вы можете:

  1. Принудительно завершить текущий сеанс без сохранения истории:

     kill -9 $$
    

    Это отбросит всю текущую историю.

  2. Введите ↑ (стрелка вверх) в открытом сеансе bash, пока не отобразится конфиденциальная информация, затем с помощью клавиш редактирования строки, например Ctrl+W, удалите конфиденциальную информацию, а затем ↓ (стрелка вниз) до появления новой пустой строки перед вводом Введите

Удалить конфиденциальную информацию из файла истории

Если вы понимаете, что конфиденциальная информация уже сохранена, и вы хотите удалить ее, но не всю свою историю:

Простая команда sed может сделать эту работу:

sed -e '/SeNsItIvE InFo/d' -i .bash_history

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

sed -e "/$(head -n1)/d" -i .bash_history

Это запустит head -n1 с вводом с терминала. Похоже, что ваш терминал завис (не будет подсказки); просто введите информацию, которую вы хотите удалить из файла. Это хитрость, позволяющая вам вводить (часть) команды без фактического ее ввода в командной строке, что делает ее неподходящей для включения в запись истории. Затем sed будет использовать введенный вами текст для поиска .bash_history и удалит все строки, содержащие конфиденциальную информацию. Примечание: если ваш шаблон конфиденциальной информации содержит косую черту (ы), вы должны экранировать их с помощью обратной косой черты или изменить команду sed чтобы использовать этот синтаксис для указания разделителя, который не появляется в шаблоне:

sed -e "\|$(head -n1)|d" -i .bash_history

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

sed -e "s/$(head -n1)/Santa Claus/g" -i .bash_history.

Удалить конфиденциальную информацию из любого файла в определенном дереве

Наконец, чтобы быть уверенным, что это не останется в другом забытом файле:

SENSITIVEINFO="$(head -n1)"
find . -type f -print0 | xargs -0 grep -l "$SENSITIVEINFO"

перечислит все заинтересованные файлы.

find . -type f -print0 |
    xargs -0 grep -l "$SENSITIVEINFO" |
    tr \\n \\0 |
    xargs -0 sed -e "s/$SENSITIVEINFO/Santa Claus/g" -i

заменит все вхождения конфиденциальной информации во всех файлах в дереве каталогов с корнем в . , Примечание: даже если эта команда использует xargs -0 , она не будет обрабатывать файлы с символами новой строки в их именах.

11

Найдите строку, которую хотите удалить, нажимая ↑ (стрелка вверх), пока она не появится, затем нажмите Ctrl+U. Это должно удалить линию.

Если вы используете команду history , вы увидите, что строка была заменена звездочкой.

4

Если вам нужно удалить несколько строк одновременно, я обычно использую это:

history | grep <string> | cut -d ' ' -f 3 | awk '{print "history -d " $1}'

Если вам нужно удалить последнюю команду, которую вы можете использовать:

history -d $((HISTCMD-2))
3
history | sed -i 59d

59 это номер строки. Не может быть ничего слаще этого :)

3

Просто попробуйте это,

$ history

это будет отображать идентификатор истории и команды, например,

,
,
211 лс
212 javac Welcome.java
213 Java Добро пожаловать
,
,

использовать,

$ history -d 211

Здесь 211 - идентификатор истории. Теперь проверьте это с помощью

$ history

,
,
211 javac Welcome.java
212 Java Добро пожаловать
,
,

3

Если вам нужно удалить ряд строк из истории, следующая функция bash может сэкономить вам некоторое время:

function histdel() {
    [ $# -eq 1 ] && history -d "$1" && history -w
    if [ $# -eq 2 -a "$1" -le "$2" ]; then
        for n in `seq "$2" "$1"`; do
            history -d "$n"
        done
        history -w
    fi
}

Обычно функцию следует добавлять в $HOME/.bashrc . Чтобы использовать функцию немедленно, вам нужно будет снова прочитать файл с помощью вашей запущенной оболочки (. $HOME/.bashrc). Затем удалить, например, команды 200-210 из истории:

$ histdel 200 210

(Примечание. Этот вопрос входит в число лучших результатов поиска, если вы ищете удаление ряда команд из истории Bash. Таким образом, хотя вышесказанное - это больше, чем вопрос, он может быть полезен для некоторых читателей.)

2

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

Я запускаю:history -w && nano "${HISTFILE}" && history -c && exit

То, что он делает, просто:

  1. history -w : записывает кэшированную историю внутри "${HISTFILE}"
  2. nano "${HISTFILE}" : разрешите мне редактировать "${HISTFILE}" Вы можете использовать скрипт sed или что угодно, чтобы очистить свой "${HISTFILE}"
  3. history -c : очистить кэшированную историю, поэтому последняя команда не добавляется.
  4. exit : выйти из системы, добавив кешированную историю ... но она пуста;)

После этой команды вы выйдете с чистым файлом истории. Войдите, чтобы проверить свою историю;)

Надеюсь, это кому-нибудь поможет.

-1

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .