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

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

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

решение1

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

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

решение2

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

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

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

решение3

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

$ export HISTCONTROL=ignorespace

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

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

решение4

Несколько методик:

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

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

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

     kill -9 $$
    

    Это приведет к удалению всей текущей истории.

    1. Как правильно заметилS0AndS0'комментарий, другой способ - изменитьимя файла истории:

      HISTFILE=
      
  2. Введите текст ↑ (up arrow)в открытом сеансе bash, пока не отобразится конфиденциальная информация, затем используйте клавиши редактирования строк, такие как Ctrl+ W, чтобы удалить конфиденциальную информацию, изатем ↓ (down arrow)пока не будет предложена новая пустая строка,допечатаю Enter.

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

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

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 -lZ "$SENSITIVEINFO" |
    xargs -0 sed -e "s/$SENSITIVEINFO/Santa Claus/g" -i

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

Связанный контент