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
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
Vous devez vous connecter pour publier un commentaire.
Danger, Will Robinson!!!
Voulez-vous vraiment envoyer des commandes en texte clair, sans authentification sur le réseau? Il est très, très dangereux.
Le faire via SSH avec paramiko.
Il n'y a pas moyen que je pouvais déduire de cette noble quête de votre question. 🙂
Les sockets module est une couche mince sur la bibliothèque posix; plaine des sockets est fastidieux et difficile à obtenir le droit. À compter d'aujourd'hui (2014), asynchronous I/O et la concurrence ne sont pas parmi Python traits les plus forts - 3.4 est en train de changer, mais les bibliothèques seront en arrière pendant un certain temps. Mon conseil est de passer votre temps d'apprentissage d'un niveau plus élevé de l'API comme Tordu (twistedmatrix.com/trac). Si vous êtes vraiment intéressé par le faible niveau de stuff, de la plongée à la source du projet.
Regarder twistedmatrix.com/documents/current/core/examples/#auto2
Mon conseil est de passer votre temps d'apprentissage d'un niveau plus élevé de l'API comme Tordu (twistedmatrix.com/trac). Si vous êtes vraiment intéressés à l'étude de la source du projet.
Alright. Aucune idée sur comment je pourrais utiliser tordu pour ce type de chose?
Regardez twistedmatrix.com/documents/current/core/examples/#auto2
Pourquoi êtes-vous y compris les commentaires dans votre Réponse? Cela va à l'encontre de l'objectif d'une autre section des commentaires.
OriginalL'auteur Paulo Scardine
Eh bien, je peux comprendre votre frustration Austin; j'ai été dans le même bateau. Cependant, l'essai et l'erreur à travaillé pour la dernière fois. J'espère que vous cherchez:
OriginalL'auteur Shoeb Lakdawala
On ne sait pas pourquoi vous utilisez
subprocess.Popen()
pour la même commande à la fois le client et le serveur. Voici un aperçu de ce que je voudrais essayer de le faire (pseudo-code):client
serveur
OriginalL'auteur Greg Hewgill
Le problème avec votre code est de cette ligne (à la fois client et serveur):
Vous appelez
wait
sur lePopen
objet, ce qui signifie que la variableproc
est d'obtenir un int (retourné par lawait
) au lieu d'unPopen
objet. Vous pouvez tout simplement se débarrasser de lawait
-- depuiscommunicate
attend pour le processus à la fin avant de retourner au travail, et vous n'êtes pas vérifier le code de sortie de toute façon, vous n'avez pas besoin de l'appeler.Puis, dans votre client, je ne pense pas que vous avez besoin même le sous-processus des appels, sauf si vous êtes l'exécution de certains de commande que le serveur est de l'envoi de retour.
OriginalL'auteur bstpierre