Ответы:
Вам необходимо выйти из системы и снова войти в нее или запустить, history -a
чтобы текущая история была сохранена на диске.
Тогда просто отредактируйте файл ~/.bash_history
.
vim ~/.bash_history
) с пробела; Команды, начинающиеся с пробела, обычно не регистрируются (см. $HISTCONTROL
).
Вы можете добиться удаления из файла истории с помощью командной строки в два этапа:
history -d <line_number>
удаляет указанную строку из истории в памяти.history -w
записывает текущую историю в памяти в ~/.bash_history
файл.Два шага вместе навсегда удаляют строку из истории в памяти, а также из файла .bash_history .
history -w
из истории?
<line_number>
просто history | grep [unwanted_content]
получить список со всеми строками, содержащими [unwanted_content]
(например, пароли).
Чтобы предотвратить добавление команды в историю в первую очередь, убедитесь, что переменная окружения HISTCONTROL
содержит среди значений, разделенных двоеточиями, значение ignorespace
, например (добавьте, например, в .bashrc
):
$ export HISTCONTROL=ignorespace
Это предотвратит добавление в историю любой команды с начальным пробелом. Затем вы можете полностью очистить историю, запустив
$ history -c -w
^-- additional space character
Прежде всего, если команда, которую вы собираетесь выдать, чувствительна, небезопасна или вам просто не нужно, чтобы она загромождала вашу историю, лучше всего / быстрее всего просто предотвратить ее попадание в историю. Убедитесь, что $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
с помощью текстового редактора.
$HISTFILE
, на выходе .» На самом деле, это не совсем верно. Кажется, он только добавляет оставшиеся новые элементы, которые «выпирают» из первоначальной длины истории. Например, если я удаляю 5 оригинальных предметов и добавляю 15 новых, добавляются только последние 10 новых, тогда как я ожидаю, что все 15 новых будут добавлены. Я думаю, что это ошибка, потому что я не вижу, как это всегда желательно функциональность.
Несколько техник:
Если вы ввели какой-либо пароль в командной строке, а затем понимаете, что все команды записываются в журнал, вы можете:
Принудительно завершить текущий сеанс без сохранения истории:
kill -9 $$
Это отбросит всю текущую историю.
Набирайте ↑ (up arrow)в сеансе open 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 -l "$SENSITIVEINFO" |
tr \\n \\0 |
xargs -0 sed -e "s/$SENSITIVEINFO/Santa Claus/g" -i
заменит все вхождения конфиденциальной информации во всех файлах в дереве каталогов с корнем в .
. Примечание: даже если эта команда использует xargs -0
, она не будет обрабатывать файлы с символами новой строки в их именах.
Найдите строку, которую хотите удалить, нажимая, ↑ (up arrow)пока она не появится, затем нажмите Ctrl+ U. Это должно удалить линию.
Если вы используете history
команду, вы увидите, что строка заменена звездочкой.
*
.
Если вам нужно удалить несколько строк одновременно, я обычно использую это:
history | grep <string> | cut -d ' ' -f 3 | awk '{print "history -d " $1}'
Если вам нужно удалить последнюю команду, которую вы можете использовать:
history -d $((HISTCMD-2))
history | grep <string>
все равно показывает все строки, которые, как он утверждал, удалял ...
history | grep XYZ | grep -v grep | tac | awk '{print "history -d", $1}'
Если вам нужно удалить ряд строк из истории, следующая функция 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. Поэтому, хотя приведенное выше - больше, чем задает вопрос, оно может быть полезно для некоторых читателей.)
for
заявления: for n in $(seq "$2" "$1")
некоторые стилистически предпочитают, и, если seq
не работает, попробуйте for ((n="$2"; n>="$1"; n--))
.
Просто попробуйте это,
$ history
это будет отображать идентификатор истории и команды, например,
,
,
211 ls
212 javac Welcome.java
213 java добро пожаловать
.
,
использовать,
$ history -d 211
Здесь 211 - идентификатор истории. Теперь проверьте это с помощью
$ history
,
,
211 javac Welcome.java
212 java добро пожаловать
.
,
Я знаю, что прошло много времени с тех пор, как на этот вопрос был задан и дан ответ, но я покажу вам мой метод очистки файла истории и выхода из системы одновременно.
Я бегу :
history -w && nano "${HISTFILE}" && history -c && exit
То, что он делает, просто:
history -w
: пишет кэшированную историю внутри "${HISTFILE}"
nano "${HISTFILE}"
Позвольте мне отредактировать "${HISTFILE}"
Вы можете использовать скрипт Sed или что угодно, чтобы очистить свой"${HISTFILE}"
history -c
: очистить кэшированную историю, поэтому последняя команда не добавляется.exit
: выйти из системы, добавив кешированную историю ... но она пуста;)После этой команды вы выйдете с чистым файлом истории. Войдите, чтобы проверить свою историю;)
Надеюсь, это кому-нибудь поможет.