diff options
author | Jeff Forcier <jeff@bitprophet.org> | 2013-04-28 18:08:55 -0700 |
---|---|---|
committer | Jeff Forcier <jeff@bitprophet.org> | 2013-04-28 18:08:55 -0700 |
commit | 675d79d743be0b9753ef36ca25b3af5e38de0ae2 (patch) | |
tree | c9417247199d1b92e89a443d990fe0aabbd37204 | |
parent | a1fa1ba9cc2cf6cc65ffebb629da30333de84058 (diff) | |
parent | aee2355d24277405867a8cb4ce8ce9616fee9d5b (diff) |
Merge pull request #153 from glasserc/log_bad_hostkeys
Warn on parse failure when reading known_hosts
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | paramiko/hostkeys.py | 11 |
2 files changed, 10 insertions, 3 deletions
@@ -32,6 +32,8 @@ v1.11.0 (DD MM YYYY) 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 1ddb25b7..f048b715 100644 --- a/paramiko/hostkeys.py +++ b/paramiko/hostkeys.py @@ -28,6 +28,7 @@ import UserDict 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 @@ class HostKeyEntry: 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,9 +62,12 @@ class HostKeyEntry: @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 + log.warn("Not enough fields found in known_hosts in line %s (%r)" % + (lineno, line)) return None fields = fields[:3] @@ -78,6 +82,7 @@ class HostKeyEntry: 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,11 +165,11 @@ class HostKeys (UserDict.DictMixin): @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 - e = HostKeyEntry.from_line(line) + e = HostKeyEntry.from_line(line, lineno) if e is not None: _hostnames = e.hostnames for h in _hostnames: |