2012-01-31 15:43:03 +0000 2012-01-31 15:43:03 +0000
152
152
Advertisement

Удалить определённую строку из файла истории Bash.

Advertisement

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

Advertisement
Advertisement

Ответы (12)

152
152
152
2012-01-31 16:09:25 +0000

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

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

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

118
118
118
2012-01-31 16:01:05 +0000

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

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

41
Advertisement
41
41
2012-02-01 22:19:06 +0000
Advertisement

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

$ export HISTCONTROL=ignorespace

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

$ history -c -w
  ^-- additional space character
```.
33
33
33
2013-06-18 16:33:19 +0000

Прежде всего, если команда, которую вы собираетесь выдать, чувствительна, небезопасна, или вам просто не нужно, чтобы она загромождала вашу историю, лучше всего/быстрее всего просто не допустить ее попадания в историю в первую очередь. Убедитесь, что $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)$ history -d $((HISTCMD-1))

Заметьте лидирующее место; эта команда требует ignorespace, иначе она просто удалит сама себя!

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

(bash)$ history 5
  598 ok
  599 sensitive
  600 unsafe
  601 doesn 


В данном случае 602 и 599. Тогда проблема: 

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

(Без ignorespace это было бы 603…599.)

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

(bash)$ kill -9 $$

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

Если, однако, команда(ы), которые вы хотите удалить, были из предыдущего сеанса, они уже были добавлены к $HISTFILE при выходе. Манипулирование историей с помощью вышеуказанных команд все равно будет только приложить оставшиеся new элементы к $HISTFILE, on exit. Для overwrite the $HISTFILE с представлением текущей сессии истории entire, _ straight now_, выдаёт:

(bash)$ history -w

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

В данном случае 602 и 599. Тогда проблема:

0x1&

(Без 0x6& это было бы 603…599.)

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

0x1&

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

Если, однако, команда(ы), которые вы хотите удалить, были из предыдущего сеанса, они уже были добавлены к 0x6& при выходе. Манипулирование историей с помощью вышеуказанных команд все равно будет только приложить оставшиеся new элементы к 0x6&, on exit. Для overwrite the 0x6& с представлением текущей сессии истории entire, _ straight now_, выдаёт:

0x1&

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

17
Advertisement
17
17
2013-07-19 12:50:40 +0000
Advertisement

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

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

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

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

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

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

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

Простая команда sed может выполнить эту задачу:

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

, но по мере ввода вы создаете другую строку истории, содержащую шаблон поиска (sensitive info), который вы пытаетесь удалить. Так что вы можете:

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.

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

Наконец, чтобы быть уверенным, что она не останется в файле another forgotten:

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, она не будет обрабатывать файлы с новыми строками в их именах.

12
12
12
2015-04-01 16:00:26 +0000

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

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

5
Advertisement
5
5
2013-01-07 05:53:04 +0000
Advertisement

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

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

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

history -d $((HISTCMD-2))
3
3
3
2012-10-26 14:09:51 +0000

Если вам нужно удалить ряд строк из истории, следующая функция 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. Чтобы использовать функцию imediatelly, вам нужно, чтобы файл был снова прочитан запущенной оболочкой (. $HOME/.bashrc). Затем удалить, например, команды 200-210 из истории:

$ histdel 200 210

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

3
Advertisement
3
3
2014-03-04 11:16:04 +0000
Advertisement

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

$ history

Это отобразит id истории и команды, например,

. . 211 ls 212 javac Welcome.java 213 java приветствовать . .

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

$ history -d 211

Здесь 211 - это id истории. Теперь проверьте это, используя

$ history

. . 211 javac Welcome.java 212 java welcome . . .

3
3
3
2013-04-03 21:16:15 +0000
history | sed -i 59d

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

2
2
2
2015-09-30 04:57:29 +0000

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

Я выполняю :history -w && nano "${HISTFILE}" && history -c && exit

Все просто:

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

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

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

1
1
1
2017-03-27 14:10:10 +0000

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

Advertisement

Похожие вопросы

6
10
11
5
15
Advertisement
Advertisement