Ticket #2041: ssh-2hop-splitconnect.patch
File ssh-2hop-splitconnect.patch, 4.4 KB (added by , 3 years ago) |
---|
-
xpra/net/ssh.py
240 240 ssh_client = SSHClient() 241 241 ssh_client.load_system_host_keys() 242 242 ssh_client.connect(host, port, sock=sock) 243 chan = do_ssh_paramiko_connect_to(ssh_client.get_transport(),244 host, username, password,245 243 transport = ssh_client.get_transport() 244 do_ssh_paramiko_connect_to(transport, host, username, password) 245 chan = paramiko_run_remote_xpra(transport, proxy_command, remote_xpra, socket_dir, display_as_args) 246 246 peername = (host, port) 247 247 conn = SSHProxyCommandConnection(chan, peername, target, socket_info) 248 248 conn.timeout = SOCKET_TIMEOUT … … 269 269 except SSHException as e: 270 270 log("start_client()", exc_info=True) 271 271 raise InitException("SSH negotiation failed: %s" % e) 272 chan_to_middle = do_ssh_paramiko_connect_to(middle_transport, proxy_host, proxy_username, proxy_password, dest_host=host, dest_port=port) 272 do_ssh_paramiko_connect_to(middle_transport, proxy_host, proxy_username, proxy_password) 273 log("Opening proxy channel") 274 chan_to_middle = middle_transport.open_channel("direct-tcpip", (host, port), ('localhost', 0)) 275 273 276 transport = Transport(chan_to_middle) 274 277 transport.use_compression(False) 275 278 try: … … 277 280 except SSHException as e: 278 281 log("start_client()", exc_info=True) 279 282 raise InitException("SSH negotiation failed: %s" % e) 280 chan = do_ssh_paramiko_connect_to(transport, host, username, password, proxy_command, remote_xpra, socket_dir, display_as_args) 283 do_ssh_paramiko_connect_to(transport, host, username, password) 284 chan = paramiko_run_remote_xpra(transport, proxy_command, remote_xpra, socket_dir, display_as_args) 285 281 286 peername = (host, port) 282 287 conn = SSHProxyCommandConnection(chan, peername, target, socket_info) 283 288 conn.timeout = SOCKET_TIMEOUT … … 297 302 except SSHException as e: 298 303 log("start_client()", exc_info=True) 299 304 raise InitException("SSH negotiation failed: %s" % e) 300 chan = do_ssh_paramiko_connect_to(transport, 301 host, username, password, 302 proxy_command, remote_xpra, socket_dir, display_as_args) 305 do_ssh_paramiko_connect_to(transport, host, username, password) 306 chan = paramiko_run_remote_xpra(transport, proxy_command, remote_xpra, socket_dir, display_as_args) 303 307 conn = SSHSocketConnection(chan, sock, sockname, peername, target, socket_info) 304 308 conn.timeout = SOCKET_TIMEOUT 305 309 conn.start_stderr_reader() … … 312 316 def __init__(self): 313 317 nomodule_context.__init__(self, "gssapi") 314 318 315 # (1) If the arguments after "proxy_command" are "None", then we're opening a port-forward 316 # (2) If "parachan" is set, that means we're using a port-forward 317 def do_ssh_paramiko_connect_to(transport, host, username, password, 318 xpra_proxy_command=None, remote_xpra=None, socket_dir=None, display_as_args=None, 319 dest_host=None, dest_port=None): 319 320 def do_ssh_paramiko_connect_to(transport, host, username, password): 320 321 from paramiko import SSHException, RSAKey, PasswordRequiredException 321 322 from paramiko.agent import Agent 322 323 from paramiko.hostkeys import HostKeys … … 544 545 transport.close() 545 546 raise InitException("SSH Authentication on %s failed" % host) 546 547 547 if remote_xpra is None:548 log("Opening proxy channel")549 return transport.open_channel("direct-tcpip", (dest_host, dest_port), ('localhost', 0))550 548 549 def paramiko_run_remote_xpra(transport, xpra_proxy_command=None, remote_xpra=None, socket_dir=None, display_as_args=None): 550 from paramiko import SSHException 551 551 assert len(remote_xpra)>0 552 552 log("will try to run xpra from: %s", remote_xpra) 553 553 for xpra_cmd in remote_xpra: