Python envoi de commande sur une socket

Je vais avoir un peu de mal. Je veux créer un programme simple qui se connecte au serveur et l'exécution d'une commande à l'aide de sous-processus, puis renvoie le résultat au client. C'est simple, mais je ne peux pas le faire fonctionner. Droit maintenant, c'est ce que j'ai:
client:


import sys, socket, subprocess
conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = sys.argv[1]
port = int(sys.argv[2])
socksize = 1024
conn.connect((host, port))
while True:
    shell = raw_input("$ ")
    conn.send(shell)
    data = conn.recv(socksize)
    #msglen = len(data)
    output = data
    iotype = subprocess.PIPE
    cmd = ['/bin/sh', '-c', shell]
    proc = subprocess.Popen(cmd, stdout=iotype).wait()
    stdout,stderr = proc.communicate()
    conn.send(stdout)
    print(output)
    if proc.returncode != 0:
        print("Error")

serveur:


import sys, socket, subprocess
host = ''               
port = 50106
socksize = 1024

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host, port))
print("Server started on port: %s" %port)
s.listen(1)
print("Now listening...\n")
conn, addr = s.accept()
while True:
    print 'New connection from %s:%d' % (addr[0], addr[1])
    data = conn.recv(socksize)
    cmd = ['/bin/sh', '-c', data]
    proc = subprocess.Popen(cmd, stdout=subprocess.PIPE).wait()
    stdout,stderr = cmd.communicate()
    if not data:
        break
    elif data == 'killsrv':
        sys.exit()
Pourquoi ne pas utiliser quelque chose comme paramiko?
Ouais.. l'utilisation de SSH pour que. Même si vous aurez seulement être en mesure de passer à une seule chaîne de commande si vous utilisez ssh exec - de sorte que vous aurez à prendre soin de correctement citant des arguments.
Quels sont les symptômes?
Bien, c'est ce qui se passe après je tape une commande. Traceback (most recent call last): File "client.py", la ligne 119, in <module> main() du Fichier "client.py", à la ligne 27, dans les principales connect() File "client.py", à la ligne 78, connect, stdout,stderr = proc.communiquer() AttributeError: 'int' object n'a pas d'attribut "communiquer"
Je suis assez sûr que vous voulez utiliser proc.communicate() pas cmd.communicate(). Aussi, il semble comme une idée dangereuse pour envoyer des commandes en texte brut. Êtes-vous essayer de faire quelque chose de mensonge: trustedsec.com/files/simple_py_shell.py ?

OriginalL'auteur AustinM | 2011-02-13