185

Я случайно набрал свой пароль в командной строке bash, ошибочно приняв строку Last login: ... за Wrong password (я спешил). Что я делаю, чтобы скрыть мой след?

То, что я сделал, отредактировало .bash_history и удалило оскорбительную строку (пришлось один раз заново зарегистрироваться, чтобы увидеть пароль в файле, чтобы я мог его удалить, и заново войти, чтобы увидеть, как он исчезает из истории, доступной под клавишей UPARROW).

Есть ли другое место, где можно сохранить историю команд? Система CentOS 6.5.

11 ответов11

181

Вы можете удалить только оскорбительную строку из истории bash вместо очистки всей истории. Просто удалите строку с флагом -d , затем сохраните (запишите) новую историю с флагом -w :

$ history
351 ssh me@site.com
352 my_password
$ history -d 352
$ history -w
121

Есть две части к этому:

  • bash хранит историю в файле ~/.bash_history который по умолчанию записывается в конце сеанса
  • history которая хранится в памяти

Чтобы быть в безопасности, вы должны очистить его от сессии:

history -c

и обрежьте файл истории при необходимости:

> ~/.bash_history

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

export HISTFILE=/dev/null
23

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

kill -9 $$

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

Большинство других подходов включают очистку по факту (т.е. после того, как данные уже попали на диск), что имеет гораздо больше шансов на ошибку (пропуская копию), особенно если система может использовать btrfs или аналогичные.

11

Мой любимый трюк для этого - нажимать стрелку вверх, возвращать команду назад, вводить что-то (может быть и не нужно), нажимать стрелку вниз, вводить "ls" и нажимать ввод. Чувствую себя очень странно, но на самом деле это работает. Об этом узнал, когда я раздражался после того, как отредактировал неправильную команду в своей истории, а затем разрушил ее, не нажимая ctrl-c, чтобы отменить редактирование. Я думаю, Bash поддерживает ревизионистскую историю. ;-)

$ passw0rd
$ <up arrow><backspace x8>cd<down arrow>echo hi
$ history|tail -3

Похоже:

$ passw0rd
passw0rd: command not found
$ echo hi
hi
$ history|tail -3
 2445* cd
 2446  echo hi
 2447  history|tail -3
$ 
11

После того, как вы случайно набрали что-то, что не хотели сохранять в истории, вы можете набрать: unset HISTFILE

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

10

В дополнение к другим ответам, может быть уместно, что пароль также находится в буфере прокрутки терминала - история отображаемого текста - теперь, и, более проблематично, возможно, на жестком диске, если эмулятор терминала действительно сохранил история на диск. Это происходит в KDE konssole, если размер истории установлен на "неограниченный прокрутку", чтобы никогда не отбрасывать вывод.

5

С помощью команды $<space> command не добавляется в историю, иногда полезна

$  history | grep mywierdgrep
$ history | grep mywierdgrep
 2005  history | grep mywierdgrep
4

Еще одна альтернатива, позволяющая избежать сохранения в файле истории (перед выходом из системы), - это просто выполнить команду chmod 444 ~/.bash_history и затем выйти из системы. Войдите снова и сбросьте разрешения (или нет, в зависимости от того, какой вы параноик!).

1

Я вижу неоднократно упоминалось

Имейте в виду, что это не работает, если вы установили «PROMPT_COMMAND = history -a» [..] Вы должны будете отредактировать свою .bash_history, чтобы удалить ее.

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

$ history
351 ssh me@site.com
352 my_password
$ history -d 352 ; history -w
0

Многие ответы здесь пытаются удалить указанную команду из истории текущего сеанса bash, прежде чем она будет записана в $HISTFILE (по умолчанию ~/.bash_history). Однако, если вы установили PROMPT_COMMAND=history -a команда с вашим паролем немедленно записывается в ваш $HISTFILE когда приглашение отображается после завершения команды. Вам нужно отредактировать свой $HISTFILE чтобы удалить его.

Этот параметр обычно используется для чередования команд из нескольких открытых сеансов bash.

-3

Вы также захотите проверить журналы системного журнала. Неверные имена входа обычно регистрируются в системном журнале.

/var/log/messages или эквивалент для вашей ОС.

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