Я случайно набрал пароль в командной строке bash

189

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

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

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

Мада
источник
59
Просто смените пароль :)
gronostaj
96
Сменить пароль не так просто ... Мне нужно попросить администратора переустановить мой новый открытый ключ на 15 разных серверах - и парень такой /dev/null.
MaDa
71
Если вы не можете легко изменить свой пароль в любое время, у вас может быть серьезная лазейка в безопасности. Что вы будете делать, когда кто-то получит ваш пароль? Есть ли у вас какие-либо средства, чтобы немедленно отозвать доступ к системе?
Гроностай
42
Вы можете изменить кодовую фразу из ключа SSH без изменения ключа: ssh-keygen -f id_rsa -p.
JWG
6
Просто заходите, чтобы упомянуть, что, по крайней мере, при сетевых входах в систему Windows вы попадаете По умолчанию администратор (в некоторых высоких серверах) записывает все попытки входа в систему, и, конечно, имена пользователей являются открытым текстом. Все, что нужно предпринять некоторым предприимчивым людям, - это искать строки, не относящиеся к имени пользователя, и сопоставлять их со следующим действительным именем пользователя (или следующей попыткой входа в систему на той же машине). И нет простого способа удалить этот лог-файл администратора. Так что тебе действительно нужно сменить пароль.
Карл Виттофт

Ответы:

184

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

$ history
351 ssh me@site.com
352 my_password
$ history -d 352
$ history -w
dotancohen
источник
1
Имейте в виду, что это не работает, если вы установили "PROMPT_COMMAND = history -a". После этого команда с вашим паролем будет немедленно записана в вашу .bash_history, когда после ее завершения отобразится приглашение. Вы должны будете отредактировать свою .bash_history, чтобы удалить ее.
Бенрифках
1
Также обратите внимание, что если строка была записана в файл хоста, и позже было открыто несколько оболочек (окон терминала), ВСЕ эти оболочки будут иметь ее в истории! Вам нужно будет либо удалить его из всех этих оболочек, либо, по крайней мере, из истории ПОСЛЕДНЕЙ оболочки, которую вы закрываете! Лучше получить его до того, как оболочка, которая его использовала, существует. История при работе с несколькими оболочками может стать кошмаром.
Энтони
121

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

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

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

history -c

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

> ~/.bash_history

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

export HISTFILE=/dev/null
devnull
источник
205
Эй, смотри, это админ!
Raystafarian
5
Пан не собирался, извините :) Я не смотрел на ваш ник, когда писал свой комментарий.
MaDa
7
Чтобы быть параноиком (и все же по какой-то причине все еще не сменить пароль), не следует ли вам shredперезаписать файл или иным образом перезаписать его много раз?
Кодзиро
1
@MaDa Нет проблем. Я даже добавил еще один способ в ответ, чтобы мой ник попал в картинку.
devnull
5
Настройка HISTFILE=достаточно. From bash(1): Если не установлено, история команд не сохраняется при выходе из оболочки.
Лекенштейн
23

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

kill -9 $$

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

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

Р..
источник
2
+1, а не просто больше вероятности ошибки, она даже может быть исправлена ​​в зависимости от того, было ли / сколько команд было выполнено после нее
Cruncher
Отсутствует слово «автоматически»? Потому что dotancohen показал способ сохранить историю, не выходя из оболочки.
Бен Фойгт
3
Оболочка может быть настроена на сохранение истории после выполнения каждой команды, а не при выходе.
Ник Маттео
1
+1 Это именно то, что я хотел порекомендовать! Кроме того, rm ~/.bash_history~чтобы удалить файл резервной копии в случае ОП, когда он уже был сохранен
Томас
Имейте в виду, что это не работает, если вы установили "PROMPT_COMMAND = history -a". После этого команда с вашим паролем будет немедленно записана в вашу .bash_history, когда после ее завершения отобразится приглашение. Вы должны будете отредактировать свою .bash_history, чтобы удалить ее.
Бенрифках
11

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

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

mtak
источник
Имейте в виду, что это не работает, если вы установили "PROMPT_COMMAND = history -a". После этого команда с вашим паролем будет немедленно записана в вашу .bash_history, когда после ее завершения отобразится приглашение. Вы должны будете отредактировать свою .bash_history, чтобы удалить ее.
Бенрифках
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
$ 
Марк Джерде
источник
Это странно . Один недостаток в том, что он, кажется, знает, что вы редактировали историю, так что может быть какой-то способ восстановить старую версию?
MadTux
@MadTux - В общем, но .bash_history - это просто текстовый файл. Таким образом, вы можете выполнить приведенный выше пример, выйти и снова подключиться. Когда вы просматриваете полное содержимое файла .bash_history, там нет ничего, что отличало бы его от того, что вы только что запустили «cd», так что трасса чиста.
Марк Джерде
Имейте в виду, что это не работает, если вы установили "PROMPT_COMMAND = history -a". После этого команда с вашим паролем будет немедленно записана в вашу .bash_history, когда после ее завершения отобразится приглашение. Вы должны будете отредактировать свою .bash_history, чтобы удалить ее.
Бенрифках
10

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

Volker Siegel
источник
6

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

$  history | grep mywierdgrep
$ history | grep mywierdgrep
 2005  history | grep mywierdgrep
jris198944
источник
2
Интересно, но не ясно, насколько это полезно в описанном сценарии. Вы предлагаете, чтобы каждый пароль начинался с пробела?
Бен Фойгт
1
Нет, он предлагает, чтобы с этим на месте любая напечатанная вами строка, которую вы не хотите фиксировать в истории, должна быть напечатана с начальным пробелом. Например: «ls» становится «ls», и эта строка никогда не отображается в истории или в списке сессий со стрелкой вверх.
Брайан С.
4
Обратите внимание, что этот трюк с начальным пробелом работает, только если $ HISTCONTROL содержит пространство игнорирования.
Бернд Джендриссек
2
@ jris198944 Предоставление пароля с помощью аргумента командной строки потенциально может раскрыть его любому, кто работает в системе ps.
jamesdlin
2
И в любом случае, хотя этот трюк полезен, если вы планируете заранее, это не поможет первоначальному сценарию, когда кто-то случайно вводит пароль в командной строке.
jamesdlin
4

Еще одна альтернатива, чтобы избежать сохранения в файл истории (перед выходом из системы), это просто

chmod 400 ~/.bash_history 

а затем выйти из системы. Остановите запись истории в файл (поскольку файл доступен только для чтения), так что весь сеанс bash удаляется, а предыдущая история сохраняется.

Войдите снова и сбросьте права доступа 600(или нет, в зависимости от того, какой вы параноик!).

Адам
источник
1

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

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

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

$ history
351 ssh me@site.com
352 my_password
$ history -d 352 ; history -w
Флорис Крюссельбринк
источник
Не могли бы вы объяснить, что именно делает этот метод работает?
Камиль Мачоровски
PROMPT_COMMAND выполняется только перед отображением следующей командной строки. Проблема с вводом команд -d и -w в отдельных строках заключается в том, что PROMPT_COMMAND будет выполнять команду history -a между ними. Если вы выполняете оба параметра -d и -w в одной командной строке, они выполняются только после этого
Floris Kruisselbrink
0

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

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

benrifkah
источник
-3

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

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

bcarroll
источник
1
Проблема не в том, что он ввел пароль неправильно, он уже вошел в систему и ввел свой пароль в командной строке и нажал клавишу ввода. Это не будет отображаться в файле сообщений.
MaQleod