diff --git a/asyncssh/connection.py b/asyncssh/connection.py index e81a92c..993ebbc 100644 --- a/asyncssh/connection.py +++ b/asyncssh/connection.py @@ -459,7 +459,13 @@ async def _connect(options: _Options, config: DefTuple[ConfigPaths], canon_host = await _canonicalize_host(loop, options) - host = canon_host if canon_host else options.host + if isinstance(options.config, SSHServerConfig): + host = options.host + else: + host = options.config._orig_host + + host = canon_host if canon_host else host + canonical = bool(canon_host) final = options.config.has_match_final() diff --git a/tests/server.py b/tests/server.py index 58153f6..af1568c 100644 --- a/tests/server.py +++ b/tests/server.py @@ -133,7 +133,7 @@ async def asyncSetUpClass(cls): skey_ecdsa.write_public_key('skey_ecdsa.pub') skey_cert = skey.generate_host_certificate( - skey, 'name', principals=['127.0.0.1', 'localhost']) + skey, 'name', principals=['127.0.0.1', '127.0.0.2', '127.0.0.3', 'localhost']) skey_cert.write_certificate('skey-cert.pub') skey_ecdsa_cert = skey_ecdsa.generate_host_certificate( diff --git a/tests/test_forward.py b/tests/test_forward.py index fa9ee24..bb6d9db 100644 --- a/tests/test_forward.py +++ b/tests/test_forward.py @@ -247,6 +247,17 @@ def unix_connection_requested(self, dest_path): return self._upstream_conn +class _JumpServer(Server): + def __init__(self, remote_port): + self._remote_port = remote_port + + def begin_auth(self, username): + """user jumper is allowed to use this server""" + return username != "jumper" + + def connection_requested(self, dest_host, dest_port, orig_host, orig_port): + return dest_port == self._remote_port + class _CheckForwarding(ServerTestCase): """Utility functions for AsyncSSH forwarding unit tests""" @@ -379,6 +390,39 @@ async def test_proxy_jump(self): finally: os.remove('.ssh/config') + @asynctest + async def test_proxy_jump_user(self): + """Test connecting a tunnneled SSH connection using ProxyJump + with a User + """ + def jump_server(): + return _JumpServer(self._server_port) + + jump_listener = await self.create_server(jump_server) + jump_port = jump_listener.get_port() + + write_file('.ssh/config', +f""" +Host jump + HostName 127.0.0.3 + Port {jump_port} + User jumper + +Host target + Hostname 127.0.0.2 + Port {self._server_port} + +Match final host 127.0.0.2 + ProxyJump jump +""".encode()) + try: + async with self.connect(host='target', username='ckey'): + pass + finally: + os.remove('.ssh/config') + jump_listener.close() + await jump_listener.wait_closed() + @asynctest async def test_proxy_jump_multiple(self): """Test connecting a tunnneled SSH connection using ProxyJump"""