python socket 實現遠程執行命令 上傳 下載文件

client端:

#!/usr/bin/env python
import socket,time,os
import rlcompleter
h,p="192.168.220.130",12346
sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.connect((h,p))
def runcmd():
        received=sock.recv(8192)
        if received=="changed directoy successful":
            print "changed directoy successful"
        else:
            print received
def putfile(filename):
    print "\033[32;1mstart send %s\033[0m" %filename
    f=open(filename,'rb')
    while 1:
        f_data=f.read(4096)
        if not f_data:break
        sock.sendall(f_data)
    f.close()
    time.sleep(0.5)
    sock.sendall("completed")
    print "send %s completed" %filename
def getfile(filename):
    print "\033[32;1mstart get %s\033[0m" %filename
    os.chdir(dir)
    f=open(filename,'wb')
    while 1:
        data=sock.recv(8192)
        if not data:break
        if data=="completed":
            time.sleep(0.5)
            print "%s have get complete" %filename
            break
        f.write(data)
    f.close()
while 1:
    try:
        cmd=raw_input("\033[32;1mPlease input will run command: \033[0m")
        sock.sendall(cmd)
        action=sock.recv(4096)
        if action=="Has ready" and cmd.split()[0]=="put":
            global dir
            dir,filename=os.path.split(cmd.split()[1])
            os.chdir(dir)
            putfile(filename)
        elif  action=="Has ready" and cmd.split()[0]=="get":
            dir,filename=os.path.split(cmd.split()[1])
            getfile(filename)
#   action=="Has ready" and cmd.split()[0] != "get" and cmd.split()[0] != "put":
        else:
            runcmd()
    except KeyboardInterrupt:
        print "\n\033[31;1mbye bye!\033[0m"
        break
sock.close()

server端:

#!/usr/bin/python
#coding=utf-8
import SocketServer
import os,time
class myserver(SocketServer.BaseRequestHandler):
    def runcmd(self,comm):
            print "\033[33;1mwill run  %s on %s\033[0m" %(comm,self.client_address[0])
            self.request.sendall("Has ready")
            if comm.split()[0]=="cd":
                os.chdir(comm.split()[1])
                self.request.sendall("changed directoy successful")
            else:
                cmd=os.popen(comm)
                result=cmd.read()
                result_data="\n\033[35;1mFeedback from Server \n\033[0m" + result
                self.request.sendall(result_data)
    def handle(self):
        print "\033[32;1m connected from %s\033[0m" %self.client_address[0]
        while 1:
#           print "\033[32;1m connected from %s\033[0m" %self.client_address[0]
            try:
                data=self.request.recv(4096)
#               filepath=data.split()[1]
#               dir=('/').join(filepath.split('/')[:-1])
                if data.split()[0]=="put":
                    global dir
                    dir,filename=os.path.split(data.split()[1])
                    self.recvfile(filename)
                elif data.split()[0]=="get":
                    dir,filename=os.path.split(data.split()[1])
                    self.sendfile(filename)
                else:
                    self.runcmd(data)
            except IndexError:
                print "exit", self.client_address
                break
                                                                            
    def recvfile(self,filename):
        print "\033[32;1mstart receive %s...\033[0m" %filename
        self.request.sendall("Has ready")
        os.chdir(dir)
        f=open(filename,'wb')
        while 1:
            data=self.request.recv(4096)
            if not data:break
            if data=="completed":
                print "%s have received complete" %filename
                break
            f.write(data)
        f.close()
    def sendfile(self,filename):
        print "\033[32;1mstart send %s...\033[0m" %filename
        os.chdir(dir)
        f=open(filename,'rb')
        self.request.sendall("Has ready")
        time.sleep(0.5)
        while 1:
            f_data=f.read(8192)
            if not f_data:break
            self.request.sendall(f_data)
        f.close()
        time.sleep(0.5)
        self.request.sendall("completed")
        print "send %s completed" %filename
if __name__=="__main__":
    h,p='',12346
    server=SocketServer.ThreadingTCPServer((h,p),myserver)
    server.serve_forever()
    server.shutdown()

運行截圖:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章