python socke ftp功能实现 shell命令,上传,下载
网上教程多,但是都不全,只有下载代码
本人练习,附加了注释,帮助新人练习
一定要吃透socket来回仍包的原理
编写时,要2个脚本一起开工,才能理解包来回仍的逻辑
功能实现
1,执行shell命令
2,执行上传
3,执行下载
服务端
import socket
import SocketServer,commands,os
def message( code ):
print "------",code
def sendmessage(obj,code):
obj.request.send(str( len(code) ))
obj.request.send(code)
class MyTCPHandler(SocketServer.BaseRequestHandler):
def handle(self):
print '已建立连接:', self.client_address
while True:
cmd = self.request.recv(1024)
if not cmd:
print 'Lost connection with', self.client_address
break
print cmd
if ( cmd == "wqtest" ):
cmd_result="login pass"
self.request.send(str( len(cmd_result) ))
self.request.send(cmd_result)
while True:
cmd = self.request.recv(1024)
if not cmd:
print 'Lost connection with', self.client_address
break
print cmd
user_command=cmd.split()
if ( user_command[0] == "shell" ):
print "执行cmd命令"
sendmessage(self,"执行cmd命令")
cmd_result = commands.getstatusoutput(user_command[1])
print "parameter2:",user_command[1]
print "result len:",len(cmd_result)
print "result 1:",cmd_result[0]
print "result 2:",cmd_result[1]
sendmessage(self,cmd_result[1])
elif ( user_command[0] == "input" ):
print "执行上传命令"
sendmessage(self,"执行上传命令")
feedback = self.request.recv(100)
if ( feedback.startswith("ready") ):
file_size = int(feedback.split()[-1])
self.request.send("recv_ready")
recv_size = 0
file_name = user_command[1]
f = file(os.path.basename(file_name),'wb')
print "--->",file_name
while not file_size == recv_size:
if file_size - recv_size > 1024:
data = self.request.recv(1024)
recv_size += len(data)
else:
data = self.request.recv( file_size - recv_size )
recv_size += ( file_size - recv_size )
f.write(data)
print file_size,recv_size
print "get %s done" % file_name
elif ( user_command[0] == "get" ):
print "执行下载命令"
file_name = user_command[1]
print "client wants to download file:", user_command[1]
if ( os.path.isfile( user_command[1] ) ):
print "pass"
file_size = os.path.getsize(user_command[1])
res = "ready %s" % file_size
else:
print "faile"
res = "file doesn't exist"
print '---->',res
sendmessage(self,res)
print feedback
feedback = self.request.recv(100)
if ( feedback == "recv_ready"):
f = file(user_command[1],'rb')
send_size = 0
while not file_size == send_size:
if file_size - send_size > 1024:
data = f.read(1024)
send_size += 1024
else:
data = f.read(file_size - send_size)
send_size += ( file_size - send_size )
print file_size,send_size
self.request.send(data)
else:
print '---send file:%s done----' % user_command[1]
f.close()
else:
cmd_result="login false"
message(cmd_result)
sendmessage(self,cmd_result)
if __name__ == "__main__":
HOST,PORT="",9999
server = SocketServer.ThreadingTCPServer((HOST,PORT),MyTCPHandler)
server.serve_forever()
客户端
import socket,os
HOST = '172.0.71.48'
PORT = 9999
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
def recv_all(obj,msg_length):
raw_result = ''
while True:
if msg_length <= 4096:
data = obj.recv(msg_length)
print '======',data
raw_result += data
break
else:
data=obj.recv(4096)
raw_result += data
msg_length -=4096
return raw_result
def recv_result(obj):
res_size = obj.recv(1024)
print 'size:',res_size
result = recv_all(obj,int(res_size))
print 'result:',result
return result
while True:
user_input = raw_input("请输入口令?").strip()
if( len(user_input)) == 0:
continue
else:
s.send(user_input)
result = recv_result(s)
if ( result == "login pass" ):
while True:
user_input = raw_input("请输入命令?").strip()
user_command=user_input.split()
print "数组长度:",len(user_command)
if ( len(user_command) == 2 ):
if ( user_command[0] == "get" ):
print "clinet get"
s.send(user_input)
feedback = recv_result(s)
print "----->",feedback
if ( feedback.startswith("ready") ):
file_size = int(feedback.split()[-1])
s.send("recv_ready")
recv_size = 0
file_name = user_command[1]
f = file(os.path.basename(file_name),'wb')
print "--->",file_name
while not file_size == recv_size:
if file_size - recv_size > 1024:
data = s.recv(1024)
recv_size += len(data)
else:
data = s.recv( file_size - recv_size )
recv_size += ( file_size - recv_size )
f.write(data)
print file_size,recv_size
print "get %s done" % file_name
else:
print feedback
s.send("recv_faile")
elif ( user_command[0] == "input" ):
print "clinet input"
s.send(user_input)
recv_result(s)
if ( os.path.isfile( user_command[1] ) ):
print "pass"
file_size = os.path.getsize(user_command[1])
res = "ready %s" % file_size
print '---->',res
s.send(res)
feedback = s.recv(100)
if ( feedback == "recv_ready"):
f = file(user_command[1],'rb')
send_size = 0
while not file_size == send_size:
if file_size - send_size > 1024:
data = f.read(1024)
send_size += 1024
else:
data = f.read(file_size - send_size)
send_size += ( file_size - send_size )
print file_size,send_size
s.send(data)
else:
print '---send file:%s done----' % user_command[1]
f.close()
else:
print "faile"
res = "file doesn't exist"
print '---->',res
s.send(res)
elif ( user_command[0] == "shell" ):
print "clinet shell"
s.send(user_input)
recv_result(s)
recv_result(s)
else:
print "please input the commands like get *,input *,shell *"
else:
print "wrong in your commands,the parameter must equal two !"
s.close()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)