summaryrefslogtreecommitdiff
path: root/paramiko
diff options
context:
space:
mode:
authorRobey Pointer <robey@twitter.com>2009-07-19 16:08:13 -0700
committerRobey Pointer <robey@twitter.com>2009-07-19 16:08:13 -0700
commite06dbde805df433e4c2c36d72276e45aba147b0b (patch)
tree3f2699fdc120ff3dd9fc3c2e73ae9c152c8c156b /paramiko
parent15f4bdb10576fc0fc49da926121d88a497a5a983 (diff)
downloadparamiko-e06dbde805df433e4c2c36d72276e45aba147b0b.tar.gz
patch from gary poster: allow multiple hostnames to be specified per block in the ssh config file format. bug #332382
Diffstat (limited to 'paramiko')
-rw-r--r--paramiko/config.py41
1 files changed, 23 insertions, 18 deletions
diff --git a/paramiko/config.py b/paramiko/config.py
index 1e3d6802..065dd918 100644
--- a/paramiko/config.py
+++ b/paramiko/config.py
@@ -26,28 +26,28 @@ import fnmatch
class SSHConfig (object):
"""
Representation of config information as stored in the format used by
- OpenSSH. Queries can be made via L{lookup}. The format is described in
- OpenSSH's C{ssh_config} man page. This class is provided primarily as a
- convenience to posix users (since the OpenSSH format is a de-facto
+ OpenSSH. Queries can be made via L{lookup}. The format is described in
+ OpenSSH's C{ssh_config} man page. This class is provided primarily as a
+ convenience to posix users (since the OpenSSH format is a de-facto
standard on posix) but should work fine on Windows too.
-
+
@since: 1.6
"""
-
+
def __init__(self):
"""
Create a new OpenSSH config object.
"""
self._config = [ { 'host': '*' } ]
-
+
def parse(self, file_obj):
"""
Read an OpenSSH config from the given file object.
-
+
@param file_obj: a file-like object to read the config file from
@type file_obj: file
"""
- config = self._config[0]
+ configs = [self._config[0]]
for line in file_obj:
line = line.rstrip('\n').lstrip()
if (line == '') or (line[0] == '#'):
@@ -66,15 +66,20 @@ class SSHConfig (object):
value = line[i:].lstrip()
if key == 'host':
- # do we have a pre-existing host config to append to?
- matches = [c for c in self._config if c['host'] == value]
- if len(matches) > 0:
- config = matches[0]
- else:
- config = { 'host': value }
- self._config.append(config)
+ del configs[:]
+ # the value may be multiple hosts, space-delimited
+ for host in value.split():
+ # do we have a pre-existing host config to append to?
+ matches = [c for c in self._config if c['host'] == host]
+ if len(matches) > 0:
+ configs.append(matches[0])
+ else:
+ config = { 'host': host }
+ self._config.append(config)
+ configs.append(config)
else:
- config[key] = value
+ for config in configs:
+ config[key] = value
def lookup(self, hostname):
"""
@@ -83,13 +88,13 @@ class SSHConfig (object):
The host-matching rules of OpenSSH's C{ssh_config} man page are used,
which means that all configuration options from matching host
specifications are merged, with more specific hostmasks taking
- precedence. In other words, if C{"Port"} is set under C{"Host *"}
+ precedence. In other words, if C{"Port"} is set under C{"Host *"}
and also C{"Host *.example.com"}, and the lookup is for
C{"ssh.example.com"}, then the port entry for C{"Host *.example.com"}
will win out.
The keys in the returned dict are all normalized to lowercase (look for
- C{"port"}, not C{"Port"}. No other processing is done to the keys or
+ C{"port"}, not C{"Port"}. No other processing is done to the keys or
values.
@param hostname: the hostname to lookup