PYTHON

tcp ip 통신으로 특정 프로그램(shell) 실행시키기

고요한하늘... 2006. 9. 4. 22:54

####server ####

#!/usr/local/bin/python2.4
import os
import sys
import signal
from subprocess import *
from socket import *
ip=''
port=10000

def issyscommand(command):
    ret= command.find('ls')
    if ret == -1:
        return 0
    else:
        return 1

sock=socket(AF_INET,SOCK_STREAM)
sock.setsockopt(SOL_SOCKET,SO_REUSEADDR,1);
sock.bind((ip,port))
print 'ip   : %s' % (ip)
print 'port : %s' % (port)
sock.listen(5)
signal.signal(signal.SIGCHLD, signal.SIG_IGN)
while 1:
   conn, addr=sock.accept()
   pid=os.fork()
   if pid:
      print "close parent process"
   else:
      while 1:
          conn.settimeout(5)
          command=conn.recv(4096)
          if command:
              break;
      print command
      if issyscommand(command):
          dir=os.path.dirname(command)
          file=os.path.basename(command)
          os.chdir(dir)
          try:
              p=Popen(file,shell=True,stdout=PIPE)
          except:
              print "cannot execute command"
          else:
              conn.settimeout(3)
              conn.send(p.stdout.read())
              conn.close()
              sys.exit()
      else:
          try:
              print command
              p=Popen(command,shell=True,stdout=PIPE)
          except:
              print "cannot execute command"
          else:
              conn.settimeout(3)
              conn.send(p.stdout.read())
              conn.close()
              sys.exit()


 

 

###client####

#!/usr/local/bin/python2.4
from socket import *

tstr="input command =>"
port=10000
while 1:
    print tstr;
    query=raw_input();
    fp=open('ip.list','r')
    for ips in fp:
        if ips[0] == '#' :
           continue;
        if ips[0] == '0' :
           break;
        clientsock = socket(AF_INET,SOCK_STREAM);
        ip=ips[:-1]
        print 'ip   : %s' % (ip[:-1]);
        print 'port : %s' % (port);
        clientsock.connect((ip,port));
        clientsock.send(query);
        try:
            clientsock.settimeout(2)
            result = clientsock.recv(4096);
        except:
            print 'cannt recv'
            clientsock.close();
        else:
            print result;
            clientsock.close();
    fp.close()


'PYTHON' 카테고리의 다른 글

MapReduce  (0) 2007.02.26
실전 swig  (0) 2006.09.05
문자열 포맷팅  (0) 2006.08.28
anydbm  (0) 2006.08.25
main  (0) 2006.08.18