summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Forcier <jeff@bitprophet.org>2022-03-11 18:08:39 -0500
committerJeff Forcier <jeff@bitprophet.org>2022-03-11 18:33:50 -0500
commit5fcb8da16d4b33fa52880c1c3e848654a698d34d (patch)
tree87173c289c907f0bf0f1c2bbba9a4ef11064d945
parent1bf3dce7255ff2055dcdbc4d29454fb0184dfaf7 (diff)
downloadparamiko-5fcb8da16d4b33fa52880c1c3e848654a698d34d.tar.gz
OpenSSH docs state %C should also work in IdentityFile and Match exec
(at least, of what we presently ourselves support - it's also allowed in others)
-rw-r--r--paramiko/config.py4
-rw-r--r--tests/configs/match-exec2
-rw-r--r--tests/test_config.py23
3 files changed, 22 insertions, 7 deletions
diff --git a/paramiko/config.py b/paramiko/config.py
index c2a58e4e..9c21e4e5 100644
--- a/paramiko/config.py
+++ b/paramiko/config.py
@@ -62,11 +62,11 @@ class SSHConfig(object):
TOKENS_BY_CONFIG_KEY = {
"controlpath": ["%C", "%h", "%l", "%L", "%n", "%p", "%r", "%u"],
"hostname": ["%h"],
- "identityfile": ["~", "%d", "%h", "%l", "%u", "%r"],
+ "identityfile": ["%C", "~", "%d", "%h", "%l", "%u", "%r"],
"proxycommand": ["~", "%h", "%p", "%r"],
# Doesn't seem worth making this 'special' for now, it will fit well
# enough (no actual match-exec config key to be confused with).
- "match-exec": ["%d", "%h", "%L", "%l", "%n", "%p", "%r", "%u"],
+ "match-exec": ["%C", "%d", "%h", "%L", "%l", "%n", "%p", "%r", "%u"],
}
def __init__(self):
diff --git a/tests/configs/match-exec b/tests/configs/match-exec
index 763346ea..62a147aa 100644
--- a/tests/configs/match-exec
+++ b/tests/configs/match-exec
@@ -12,5 +12,5 @@ Host target
User intermediate
HostName configured
-Match exec "%d %h %L %l %n %p %r %u"
+Match exec "%C %d %h %L %l %n %p %r %u"
Port 1337
diff --git a/tests/test_config.py b/tests/test_config.py
index 892b4c92..08096cff 100644
--- a/tests/test_config.py
+++ b/tests/test_config.py
@@ -218,6 +218,9 @@ Host explicit_user
Host explicit_host
HostName ohai
ControlPath remoteuser %r host %h orighost %n
+
+Host hashbrowns
+ ControlPath %C
"""
)
result = config.lookup("explicit_user")["controlpath"]
@@ -226,6 +229,9 @@ Host explicit_host
result = config.lookup("explicit_host")["controlpath"]
# Remote user falls back to local user; host and orighost may differ
assert result == "remoteuser gandalf host ohai orighost explicit_host"
+ # Supports %C
+ result = config.lookup("hashbrowns")["controlpath"]
+ assert result == "fc995d9f41ca1bcec7bc1d7f1ca87b9ff568a6d4"
def test_negation(self):
config = SSHConfig.from_text(
@@ -280,7 +286,6 @@ ProxyCommand foo=bar:%h-%p
def test_identityfile(self):
config = SSHConfig.from_text(
"""
-
IdentityFile id_dsa0
Host *
@@ -291,6 +296,9 @@ IdentityFile id_dsa2
Host dsa2*
IdentityFile id_dsa22
+
+Host hashbrowns
+IdentityFile %C
"""
)
for host, values in {
@@ -303,8 +311,15 @@ IdentityFile id_dsa22
"hostname": "dsa22",
"identityfile": ["id_dsa0", "id_dsa1", "id_dsa22"],
},
+ "hashbrowns": {
+ "hostname": "hashbrowns",
+ "identityfile": [
+ "id_dsa0",
+ "id_dsa1",
+ "d5c0115d09912e39ff27844ea9d6052fc6048f99",
+ ],
+ },
}.items():
-
assert config.lookup(host) == values
def test_config_addressfamily_and_lazy_fqdn(self):
@@ -740,10 +755,10 @@ class TestMatchExec(object):
@patch("paramiko.config.getpass")
@patch("paramiko.config.invoke.run")
def test_tokenizes_argument(self, run, getpass, socket):
- socket.gethostname.return_value = "local.fqdn"
getpass.getuser.return_value = "gandalf"
- # Actual exec value is "%d %h %L %l %n %p %r %u"
+ # Actual exec value is "%C %d %h %L %l %n %p %r %u"
parts = (
+ "bf5ba06778434a9384ee4217e462f64888bd0cd2",
expanduser("~"),
"configured",
"local",