下面提到的全部是使用Python 2.7Python的插座聽
你好,
我目前試圖將套接字上偵聽數據由遠程程序發送Windows機器。然後將這些數據打印到屏幕上,然後請求用戶輸入,然後將其返回到遠程程序。在測試中,我已經能夠讓遠程程序給我一個命令行程序菜單(cmd,ipconfig,whoami,ftp),然後程序返回一個數字作爲菜單選項的選擇。
遠程程序接收到我的響應併發送所選命令的輸出。 ipconfig和whoami完美工作,但cmd和ftp只會返回終端的輸出一次。 (即我可以輸入一個命令到FTP程序,併發送過多的遠程程序之前,我從來沒有聽到後面)
我的代碼失敗的部分是 if ready[0]:
永遠不會成爲第一個談話後準備第二次。
我知道遠程程序運行正常,因爲我可以使用netcat代替我的代碼並無限期地運行cmd終端。
我該如何正確實現一個可以解釋這種連接類型的python套接字偵聽器?
我的「節目」的全部:
import socket, sys, struct, time, select
host = ''
port = 50000
connectionSevered=0
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error:
print 'Failed to create socket'
sys.exit()
print '[+] Listening for connections on port '+str(port)+'.'
s.bind((host,port))
s.listen(5)
def recvall(the_socket,timeout=2):
global connectionSevered
data=''; # Data found by recv
total_data=[]; # Finally list of everything
s.setblocking(0) #make socket non blocking
begin=time.time() #beginning time
while 1:
ready = select.select([client], [], [], .2)
if time.time()-begin > timeout:
print 'Timeout reached'
#Leave loop, timer has reached its threshold
break
if ready[0]:
print 'In ready loop!'
try:
data = client.recv(4096) #attempt to fetch data
if data:
begin=time.time() #reset timeout timer
total_data.append(data)
data='';
except socket.error:
print '[+] Lost connection to client. Printing buffer...'
connectionSevered=1 # Let main loop know connection has errored
pass
time.sleep(1)
#join all parts to make final string
return ''.join(total_data)
client, address = s.accept()
print '[+] Client connected!'
while (connectionSevered==0): # While connection hasn't errored
print "connectionSevered="+str(connectionSevered) # DEBUG
recvall(s)
response = raw_input() #take user input
client.sendto(response) #send input
client.close(0)
請讓我知道如果你需要更多的信息,任何幫助將不勝感激,我很新的這一點,好學。
您是否嘗試過使用「SocketServer」類?它有很好的文檔記錄,似乎比「套接字」更容易使用(也可以用於偵聽):http://docs.python.org/2/library/socketserver.html – halflings 2013-04-08 00:04:01
這太複雜了,什麼你想達到什麼目的? – tomasz 2013-04-11 20:54:22