Skip to content

Instantly share code, notes, and snippets.

@hwine
Created July 31, 2015 02:48
Show Gist options
  • Save hwine/31ba4a6699caa55f7fdd to your computer and use it in GitHub Desktop.
Save hwine/31ba4a6699caa55f7fdd to your computer and use it in GitHub Desktop.
decode hashed known_hosts
#!/usr/bin/env python
"""
Find host - decode hashed known_hosts files
Using an unhashed known_hosts file as reference, compare by host
key.
"""
import logging
import argparse
import fileinput
import os.path
logger = logging.getLogger(__name__)
def _parse_known_hosts(decoder):
known_keys = {}
for line in decoder.readlines():
fields = line.split()
try:
hostname, key_format, keyhash = fields
except ValueError:
logger.error("Got %d fields: %s" % (len(fields),
'|'.join(fields)))
raise
l = known_keys.get(keyhash, [])
l.append(hostname)
known_keys[keyhash] = l
return known_keys
def _parse_args():
parser = argparse.ArgumentParser(description=__doc__)
def_decoder = '~/.ssh/known_hosts'
parser.add_argument("--decoder",
help='unhashed known_hosts file (default is %s)' % def_decoder,
type=argparse.FileType('r'),
default=os.path.expanduser(def_decoder))
parser.add_argument("--generate", "-g", default=False,
action='store_true', help="generate decoded file")
parser.add_argument("file", nargs='*',
help="known_host file(s) to decode")
args = parser.parse_args()
return args
def _main():
context = _parse_args()
master_hosts = _parse_known_hosts(context.decoder)
exit_code = 0
for l in fileinput.input(context.file):
h, key_format, key_in_question = l.split()
try:
matches = master_hosts[key_in_question]
if context.generate:
print("%s %s %s" % (','.join(matches), key_format,
key_in_question))
else:
print("%s is %s" % (h, ' '.join(matches)))
except KeyError:
logger.info("%s not found", h)
exit_code = 1
return exit_code
if __name__ == '__main__':
logging.basicConfig(level=logging.INFO, format='%(asctime)s %(message)s')
raise SystemExit(_main())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment