скрипт или однострочник для очистки паролей в .bash_history - PullRequest
1 голос
/ 25 августа 2011

Я иногда ошибочно набираю свой пароль su в терминале linux, который отображает набранные символы.Это записывается в ~/.bash_history, что заставляет меня чувствовать себя неуверенно.У кого-нибудь есть короткий скрипт (bash one-liner?) Для очистки .bash_history паролей в виде простого текста?

Использование sed оставляет свои собственные следы в файле .bash_history, но если служба readline и / или истории может быть временно отключена, это может сработать:

sed -ir -e 's/su_password/PASSWORD_REMOVED/g' ~/.bash_history

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

В идеале сценарий должен просто просмотреть хешированный список паролей (/etc/shadow), чтобы создать список условий поиска.Затем нужно будет хэшировать части проверяемого файла (.bash_history) для сравнения.Проблема в том, что неизвестно, сколько текста в файле хэшируется во время сравнения, поскольку длина пароля неизвестна.В качестве альтернативы он может запросить пароль безопасным способом, как это делает passwd, перед выполнением grep / sed.

Ответы [ 4 ]

1 голос
/ 15 февраля 2012

Не просто однострочник, а функция:

eh () { history -a ; vi + ~/.bash_history ; history -r ; }

добавьте эту строку в ваш .bashrc или .bash_profile.При запуске

  1. сохраняет буфер в вашу .bash_history
  2. открывает .bash_history в vi, за исключением указателя внизу файла.
  3. восстанавливаетотредактированный файл в текущий буфер истории

Находясь в vi, вы можете перемещаться вверх и вниз с помощью клавиш со стрелками, удалять строку с dd, закрывать и записывать файл с помощью [Esc]:wq

теперь вам просто нужно набрать eh в командной строке и отредактировать свою историю

eh означает «редактировать историю»

0 голосов
/ 26 августа 2012
$ echo -n password=; stty -echo; sed -i "s/$(head -1)/PASSWORD_REMOVED/g" ~/.bash_history; stty echo
top-secret password that never appears anywhere else to make it easy to guess
$ #you have to type it in and press enter

echo дает вам подсказку. stty помогает защитить людей, смотрящих через плечо. Убедитесь, что вы избежали чего-либо (то есть обратной косой черты).

0 голосов
/ 27 августа 2011

Поскольку не было ответов, которые бы помогли мне, я решил поделиться сценарием, который я сейчас использую.Это, конечно, не одна строка и даже не bash ... но это работает.

#!/usr/bin/env python
import os
user=os.getenv('USER')
if not user:
    user='hobs'
home=os.getenv('HOME')
if not home:
  home=os.path.normpath(os.path.join(os.path.sep+'home',user))
histfile=os.getenv('HISTFILE')
if not histfile:
    histfile=os.path.join(home,'.bash_history')
from optparse import OptionParser
p = OptionParser(usage="%prog [options] password", add_help_option=True)
p.add_option('-p', '--password', '--pass', '--pw', dest='pw',
             default =None,
             help="The plaintext password string you'd like to find and replace throughout your bash history file(s)", )
p.add_option('-r', '--replacement-password', '--replacement', '--filler', '--substitution', dest='rep',
             default ='',
             help="The replacement string, passphrase identifier, tag, or filler you'd like to leave behind wherever the password was found and removed.", )
p.add_option('-f', '--bash_history', '--historyfile', '--file', '--path', '--filename', dest='hfile',
             default =histfile,
             help="The text file where your password may have been accidentally recorded and where you'd like it removed. Default = ~/.bash_history.", )
(o, a) = p.parse_args()
if a and not o.pw:
    o.pw=' '.join(a) # password can have spaces in it
    print o.pw
    print len(o.pw)
# TODO: Check if the history buffer will record the invocation of this script that includes a plaintext password
#       Alternatively, launch the search/replace task in the background to start
#       after history has had a chance to record the last command in the history buffer
if o.pw:
    import warnings
    warnings.warn("Make sure you invoked "+p.get_prog_name()+" in such a way that history won't record this command (with a plaintext password) in the history file. It would be much  better if you didn't supply the password on the command line and instead allowed this script to securely prompt you for it.",RuntimeWarning)
if not o.pw:
    import getpass
    o.pw=getpass.getpass()
if len(o.pw)<4:
    raise ValueError(p.get_prog_name() + " doesn't accept passwords shorter than 4 characters long to prevent accidental corruption of files by purging common character combinations. The password you supplied is only "+str(len(o.pw))+" characters long.")
import fileinput
for line in fileinput.FileInput(o.hfile,inplace=1):
    line = line.replace(o.pw,o.rep)
    print line,
0 голосов
/ 25 августа 2011

Я обычно делаю echo > .bash_history, чтобы очистить это. Хотя ваш пароль может отображаться в странных местах, поэтому вы можете сначала выполнить sudo grep "password" -R /, чтобы узнать, есть ли его где-нибудь еще в системе, а затем очистить свою историю.

...