diff --git a/NEWS b/NEWS index 792a1d02b152faa06499141287d311c0f02af625_TkVXUw==..ac165c385b7d4b47931352c885c4b2ad5baa21d0_TkVXUw== 100644 --- a/NEWS +++ b/NEWS @@ -32,6 +32,8 @@ v1.10.2 (DD MM 2013) -------------------- +* #153, #67: Warn on parse failure when reading known_hosts + file. Thanks to `@glasserc` for patch. * #146: Indentation fixes for readability. Thanks to Abhinav Upadhyay for catch & patch. diff --git a/paramiko/hostkeys.py b/paramiko/hostkeys.py index 792a1d02b152faa06499141287d311c0f02af625_cGFyYW1pa28vaG9zdGtleXMucHk=..ac165c385b7d4b47931352c885c4b2ad5baa21d0_cGFyYW1pa28vaG9zdGtleXMucHk= 100644 --- a/paramiko/hostkeys.py +++ b/paramiko/hostkeys.py @@ -28,6 +28,7 @@ from paramiko.common import * from paramiko.dsskey import DSSKey from paramiko.rsakey import RSAKey +from paramiko.util import get_logger class InvalidHostKey(Exception): @@ -48,7 +49,7 @@ self.hostnames = hostnames self.key = key - def from_line(cls, line): + def from_line(cls, line, lineno=None): """ Parses the given line of text to find the names for the host, the type of key, and the key data. The line is expected to be in the @@ -61,6 +62,7 @@ @param line: a line from an OpenSSH known_hosts file @type line: str """ + log = get_logger('paramiko.hostkeys') fields = line.split(' ') if len(fields) < 3: # Bad number of fields @@ -64,6 +66,8 @@ fields = line.split(' ') if len(fields) < 3: # Bad number of fields + log.warn("Not enough fields found in known_hosts in line %s (%r)" % + (lineno, line)) return None fields = fields[:3] @@ -78,6 +82,7 @@ elif keytype == 'ssh-dss': key = DSSKey(data=base64.decodestring(key)) else: + log.warn("Unable to handle key of type %s" % (keytype,)) return None except binascii.Error, e: raise InvalidHostKey(line, e) @@ -160,7 +165,7 @@ @raise IOError: if there was an error reading the file """ f = open(filename, 'r') - for line in f: + for lineno, line in enumerate(f): line = line.strip() if (len(line) == 0) or (line[0] == '#'): continue @@ -164,7 +169,7 @@ line = line.strip() if (len(line) == 0) or (line[0] == '#'): continue - e = HostKeyEntry.from_line(line) + e = HostKeyEntry.from_line(line, lineno) if e is not None: _hostnames = e.hostnames for h in _hostnames: