Я випадково набрав пароль у командному рядку bash


189

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

Що я робив - це редагування .bash_historyта видалення рядка-порушника (довелося один раз перереєструватися, щоб побачити пароль, який з’явився у файлі, щоб я міг його видалити, і ще раз повторити його, щоб побачити, як він зник з історії, доступної під клавішею UPARROW).

Чи є ще якесь місце, де можна було б зберегти історію команд? Система CentOS 6.5.


59
Просто змініть пароль :)
gronostaj

96
Змінити пароль не так просто ... Мені потрібно попросити адміністратора перевстановити мій новий відкритий ключ на 15 різних серверах - і хлопець схожий /dev/null.
MaDa

71
Якщо ви не можете легко змінити пароль у будь-який час, то у вас може виникнути серйозна лазівка ​​безпеки. Що ви будете робити, коли хтось фактично отримає ваш пароль? Чи є у вас засоби для негайного відкликання доступу до системи?
gronostaj

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

1
Майте на увазі, що це не працює, якщо ви встановили "PROMPT_COMMAND = історія -a". При цьому на місці команда з вашим паролем негайно записується у вашу .bash_history, коли відображається запит після закінчення команди. Вам доведеться відредагувати свою .bash_history, щоб видалити її.
benrifkah

1
Також зауважте, що якщо рядок була записана у файлі хосторію, а пізніше було відкрито кілька оболонок (термінальних вікон), ВСІ ці оболонки матимуть її в історії історії! Вам потрібно буде або вийняти його з усіх цих оболонок, або, принаймні, з історії ПОСЛУГИ оболонки, яку ви закриєте! Краще дістати його до того, як існує оболонка, яка його використовувала. Історія, коли стосується декількох снарядів, може стати кошмаром.
Антоній

121

Є дві частини до цього:

  • bashзберігає історію у файлі, ~/.bash_historyякий за замовчуванням записується в кінці сеансу
  • те, historyщо зберігається в пам’яті

Щоб бути безпечним, потрібно очистити його з сеансу:

history -c

і обрізати файл історії за потребою:

> ~/.bash_history

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

export HISTFILE=/dev/null

205
Слухай, це адміністратор!
Райстафаріан

5
Каламбур не призначений, вибачте :) Я не дивився на вашу ніку, коли я писав свій коментар.
MaDa

7
Щоб бути параноїком (і все ж чомусь досі не змінювати пароль), чи не слід вам shredфайл чи іншим чином перезаписати його багато разів?
kojiro

1
@MaDa Немає проблем. Я навіть додав ще один спосіб у відповідь, щоб внести свою ніку до картини.
devnull

5
Налаштування HISTFILE=достатньо. З bash(1): Якщо не встановлено, історія команд не зберігається при виході оболонки.
Лекенштейн

23

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

kill -9 $$

Це вбиває оболонку SIGKILL, яку неможливо зловити, тому оболонка не може зберегти нічого під час виходу.

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


2
+1, а не лише більше шансів на помилку, це може бути навіть відшкодовано залежно від того, чи / скільки команд було виконано після неї
Cruncher

Відсутнє слово "автоматично"? Тому що dotancohen показав спосіб збереження історії без виходу з оболонки.
Бен Войгт

3
Оболонку можна налаштувати для збереження історії після виконання кожної команди, а не при виході.
Нік Маттео

1
+1 Це саме те, що я хотів порекомендувати! Окрім того, rm ~/.bash_history~щоб видалити файл резервного копіювання у справі ОП, коли він уже збережений
Томаш

Майте на увазі, що це не працює, якщо ви встановили "PROMPT_COMMAND = історія -a". При цьому на місці команда з вашим паролем негайно записується у вашу .bash_history, коли відображається запит після закінчення команди. Вам доведеться відредагувати свою .bash_history, щоб видалити її.
benrifkah

11

Після того, як ви випадково набрали те, що не хотіли зберегти в історії, ви можете ввести: unset HISTFILE

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


Майте на увазі, що це не працює, якщо ви встановили "PROMPT_COMMAND = історія -a". При цьому на місці команда з вашим паролем негайно записується у вашу .bash_history, коли відображається запит після закінчення команди. Вам доведеться відредагувати свою .bash_history, щоб видалити її.
benrifkah

11

Моя улюблена хитрість для цього - натиснути стрілку вгору, повернути назад команду над командою, ввести щось (можливо, це не буде потрібно), натиснути стрілку вниз, набрати "ls" та натиснути клавішу "Введення". Відчуває насправді хок, але насправді це працює. З'ясував це, коли я роздратувався після редагування неправильної команди в моїй історії, а потім зруйнував її, не натискаючи ctrl-c, щоб скасувати редагування. Я думаю, що Баш підтримує ревізіоністську історію. ;-)

$ 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 = історія -a". При цьому на місці команда з вашим паролем негайно записується у вашу .bash_history, коли відображається запит після закінчення команди. Вам доведеться відредагувати свою .bash_history, щоб видалити її.
benrifkah

10

На додаток до інших відповідей може бути доречно, що пароль також знайдеться в буфері прокрутки терміналів - історія відображуваного тексту - і тепер, і більше проблеми, можливо, на жорсткому диску, якщо емулятор термінала врятував історія на диску. Це відбувається в консолі KDE, розмір історії встановлений на "необмежений прокрутки", щоб ніколи не відкидати жодного виводу.


6

З $<space> command, команда не додається в історію, іноді корисна

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

2
Хоча цікаво, незрозуміло, наскільки це корисно в описаному сценарії. Ви припускаєте, що кожен пароль повинен починатися з пробілу?
Бен Войгт

1
Ні, те, що він пропонує, полягає в тому, що, маючи це на місці, будь-який рядок, який ви вводите, який ви не хочете присвятити історії, повинен бути набраний провідним пробілом. наприклад: "ls" стає "ls", і цей рядок ніколи не відображається ні в історії, ні в списку сеансів стрілок вгору.
Брайан К.

4
Зауважте, що цей фокус провідного простору працює лише в тому випадку, якщо $ HISTCONTROL містить простір ігнорування.
Бернд Джендрісек

2
@ jris198944 Надання пароля через аргумент командного рядка може потенційно викрити його будь-хто в системі, яка працює ps.
jamesdlin

2
І все одно, хоча цей трюк корисний, якщо ви плануєте заздалегідь, це не допоможе оригінальному сценарію, коли хтось випадково ввів пароль у командному рядку.
Джеймсдлін

4

Ще одна альтернатива, щоб уникнути збереження у файлі історії (перед тим, як вийти з системи), є просто

chmod 400 ~/.bash_history 

а потім вийти. Зупиніть записувати історію у файл (оскільки файл доступний лише для читання), щоб весь сеанс bash був відкинутий, а попередня історія збережена.

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


1

Я бачу неодноразово згадуваний

Зверніть увагу, що це не працює, якщо ви встановили "PROMPT_COMMAND = історія -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 виконує команду "Історія -a" між ними. Якщо ви виконайте і -d і -w в одному командному
рядку

0

Багато відповідей тут намагаються видалити відповідну команду з історії поточної сесії curren't до того, як вона буде записана в $HISTFILE(~ / .bash_history за замовчуванням). Однак, якщо ви встановили PROMPT_COMMAND=history -a команду за допомогою свого пароля, він негайно записується до вас, $HISTFILEколи відображається рядок після закінчення команди. Вам потрібно буде відредагувати його, $HISTFILEщоб видалити його.

Цей параметр зазвичай використовується для перемежування команд з декількох відкритих сеансів bash .


-3

Ви також хочете перевірити журнали syslog. Недійсні входи, як правило, реєструються в syslog.

/ var / log / messages або еквівалент для вашої ОС.


1
Проблема полягає не в тому, що він ввів пароль невірно, він вже був увійшов і ввів свій пароль у запит та натисніть клавішу Enter. Це не відображатиметься у файлі повідомлень.
MaQleod
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.