servidor paramiko: redirecionar a saída de um subprocesso a um canal

votos
0

Eu estou tentando implementar um (falso local) servidor com paramikoque responde a comandos personalizados apenas como o original para fins de teste. Principalmente copiar a partir do fornecido servidor de demonstração , consegui chegar a este método personalizado para lidar com exec_requests para o servidor implementada via paramiko.ServerInterface:

def check_channel_exec_request(self,channel,command):
    print(User wants to execute '%s' %(command))
    comm_main, comm_add = command.decode().split(sep= ,maxsplit=1)
    if comm_main in self.allowed_commands:
        chout = channel.makefile(w)
        subprocess.Popen(command,stdout=chout)
        return True
        else:
            return False

Depois que o servidor está sendo executado através de:

PORT = 50007 # The same port as used by the server
HOST = 'localhost'
host_key = paramiko.RSAKey(filename = <FILEPATH>)

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    sock.bind((HOST,PORT))
    sock.listen(1)
    conn, addr = sock.accept() # Connected!
    with conn:
        trans = paramiko.Transport(conn)
        trans.add_server_key(host_key)
        trans.set_subsystem_handler(job,JobHandler)
        server = FakeCluster() # Custom class sublassing paramiko.ServerInterface
        trans.start_server(server=server)
        chan = trans.accept() # Accept authentication from client
        while trans.is_active(): # Do not close until inactive
            time.sleep(1)
        chan.close()

o cliente iria tentar executar echo 123da seguinte maneira:

PORT = 50007 # The same port as used by the server
HOST = 'localhost' 
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
    sock.bind((HOST,PORT))

    ssh = paramiko.client.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(HOST, PORT,username=<USERNAME>,password=<PASSWORD>)
    ssh.exec_command(echo 123)

Agora, eu estou recebendo o erro de tentar executar o subprocessque 'ChannelFile' has no attribute 'fileno'. Além disso, eu estou querendo saber como executar mais tarde um script Python como um comando personalizado chamado por exec_command. (Talvez chamando um batchfile que chama o script python?)

Publicado 03/12/2017 em 12:46
fonte usuário
Em outras línguas...                            


1 respostas

votos
0

sua pergunta é realmente muito confuso, aqui está o que eu fiz para a comunicação com o servidor remoto.

máquina local: janela

Máquina remota: ubuntu

Comando na máquina remota: 'quem'

import paramiko
ssh=paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('192.268.21.26',port=22,username='root',password='default')
stdin,stdout,stderr=ssh.exec_command('who')
output=stdout.readlines()
print '\n'.join(output)

#output
#root    tty7         2017-11-28 14:13 (:0)

#if you wish to execute a python file there , this should work
stdin,stdout,stderr=ssh.exec_command('python file.py')
Respondeu 04/12/2017 em 05:24
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more