Skript oder Einzeiler, um Kennwörter in .bash_history zu bereinigen

  • Ich gebe manchmal versehentlich mein su-Passwort in ein Linux-Terminal ein, das die eingegebenen Zeichen wiederholt. Es wird in ~/.bash_history aufgenommen, was mich unsicher macht. Hat jemand ein kurzes Skript (bash one-liner?), Um .bash_history von Klartext-Passwörtern zu säubern?

    Wenn Sie sed hinterlassen, werden eigene Spuren in der .bash_history-Datei verwendet. Wenn der readline- und / oder der Verlaufsdienst vorübergehend deaktiviert werden könnte, könnte dies funktionieren:

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

    Dies könnte zu zusätzlichen Problemen / Löchern führen, wenn das Passwort häufig als Bestandteil anderer Phrasen / Wörter verwendet wird.

    Im Idealfall sollte das Skript die Hash-Passwd-Liste (/etc/shadow) nur durchlesen, um eine Liste mit Suchbegriffen zu erstellen. Dann müsste es Teile der Datei, die es überprüft (.bash_history), zum Vergleich hashieren. Das Problem ist, zu wissen, wie viel von dem Text in der Datei während des Vergleichs hash, da die Länge des Kennworts unbekannt ist. Alternativ kann es das Passwort auf eine sichere Art und Weise abfragen, wie dies passwd tut, bevor es grep / sed ausführt.

    25 August 2011
    hobs
4 answers
  • Nicht nur ein Einzeiler, sondern eine Funktion:

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

    fügen Sie dies hinzu Zeile zu Ihrem .bashrc oder .bash_profile. Wenn er ausgeführt wird, speichert

    1. den Puffer in Ihrer .bash_history
    2. am Ende der Datei.
    3. Stellt die bearbeitete Datei im aktuellen Verlaufspuffer wieder her.

    Sie können mit den Pfeiltasten auf und ab gehen, eine Zeile mit dd entfernen und die Datei mit [Esc] schließen und schreiben: wq

    Jetzt müssen Sie nur noch eh in der Befehlszeile und bearbeiten Sie Ihr Protokoll

    eh steht für "Edit history"

    15 February 2012
    user886694
  •  $ 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
     

    Das echo gibt Ihnen die Aufforderung. Das stty schützt Sie vor Personen, die über Ihre Schulter schauen. Stellen Sie sicher, dass Sie etwas entgehen (z. B. umgekehrte Schrägstriche).

    26 August 2012
    yingted
  • Da es keine Antworten gab, die den Trick für mich ausrichteten, dachte ich, ich würde das Skript, das ich gerade verwende, weitergeben. Es ist sicherlich kein One-Liner und nicht mal Bash ... aber es funktioniert.

     #!/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,
     
    27 August 2011
    hobs
  • Normalerweise mache ich ein echo > .bash_history, um das zu löschen. Obwohl Ihr Passwort an ungewöhnlichen Orten angezeigt werden kann, sollten Sie zuerst ein sudo grep "password" -R / machen, um zu sehen, ob es sich irgendwo anders im System befindet, und dann den Verlauf löschen.

    25 August 2011
    rook