x11 forwarding with paramiko

前端 未结 5 1184
抹茶落季
抹茶落季 2020-12-30 03:15

I\'m trying to run a command with paramiko that should be able to open an X window. The script I\'m using would something as follows:

import par         


        
5条回答
  •  攒了一身酷
    2020-12-30 03:50

    Thanks Gary van der Merwe and dnozay for their code. The code below heavily relies on it and serves for running X programs on Windows. The notable difference is using select.select instead of poll, as poll is not available in Windows. Any improvements or corrections are welcome.

    import select
    import sys
    import paramiko
    import Xlib.support.connect as xlib_connect
    import os
    import socket
    import subprocess
    
    
    
    # run xming
    XmingProc = subprocess.Popen("C:/Program Files (x86)/Xming/Xming.exe :0 -clipboard -multiwindow")
    ssh_client = paramiko.SSHClient()
    ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh_client.connect(SSHServerIP, SSHServerPort, username=user, password=pwd)
    transport = ssh_client.get_transport()
    channelOppositeEdges = {}
    
    local_x11_display = xlib_connect.get_display(os.environ['DISPLAY'])
    inputSockets = []
    
    def x11_handler(channel, (src_addr, src_port)):
        local_x11_socket = xlib_connect.get_socket(*local_x11_display[:3])
        inputSockets.append(local_x11_socket)
        inputSockets.append(channel)
        channelOppositeEdges[local_x11_socket.fileno()] = channel
        channelOppositeEdges[channel.fileno()] = local_x11_socket
        transport._queue_incoming_channel(channel)
    
    session = transport.open_session()
    inputSockets.append(session)
    session.request_x11(handler = x11_handler)
    session.exec_command('xterm')
    transport.accept()
    
    while not session.exit_status_ready():
        readable, writable, exceptional = select.select(inputSockets,[],[])
        if len(transport.server_accepts) > 0:
            transport.accept()
        for sock in readable:
            if sock is session:
                while session.recv_ready():
                    sys.stdout.write(session.recv(4096))
                while session.recv_stderr_ready():
                    sys.stderr.write(session.recv_stderr(4096))   
            else: 
                try:
                    data = sock.recv(4096)
                    counterPartSocket  = channelOppositeEdges[sock.fileno()]
                    counterPartSocket.sendall(data)
                except socket.error:
                    inputSockets.remove(sock)
                    inputSockets.remove(counterPartSocket)
                    del channelOppositeEdges[sock.fileno()]
                    del channelOppositeEdges[counterPartSocket.fileno()]
                    sock.close()
                    counterPartSocket.close()
    
    print 'Exit status:', session.recv_exit_status()
    while session.recv_ready():
        sys.stdout.write(session.recv(4096))
    while session.recv_stderr_ready():
        sys.stdout.write(session.recv_stderr(4096))
    session.close()
    XmingProc.terminate()
    XmingProc.wait()
    

提交回复
热议问题