本文實例講述了Python socket套接字實現C/S模式遠程命令執(zhí)行功能。分享給大家供大家參考,具體如下:
要求:
使用python的socket套接字編寫服務器/客戶機模式的遠程命令執(zhí)行腳本。
serverCmd.py 遠程機器上用來執(zhí)行客戶端發(fā)送命令的腳本
clientCmd.py 本地機器上,向遠程服務器發(fā)送命令的腳本
servers.txt 本地機器上,存放所有的遠程服務器IP地址文件(僅支持第一個IP)發(fā)送:cmd [command]形式消息,讓遠程主機執(zhí)行命令(本地主機無回顯)
發(fā)送:close session消息,雙方關閉會話。
下載地址: 點擊此處本站下載。
注:
1. 代碼注釋較少,建議有一定套接字編程基礎。
2. 或者直接簡單部分修改IP使用。
3. clientCmd.py和servers.txt(修改IP地址后)放在同一目錄。
4.程序為簡單Demo,僅為學習記錄。
serverCmd.py
#!/usr/bin/env python# coding:utf-8# Build by LandGrey#import timeimport socketimport threadingimport tracebackimport subprocessdef parsecmd(strings): midsplit = str(strings).split(" ") if len(midsplit) >= 2 and midsplit[0] == "cmd": try: command = subprocess.Popen(strings[4:], shell=True) command.communicate() print "/n" except Exception, e: print e.message traceback.print_exc()def recvdata(port): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind(('', port)) s.listen(1) print "[+] Server is running on port:%s at %s" % (str(port), time.strftime("%Y%m%d %H:%M:%S", time.localtime())) while True: mainsocket, mainhost = s.accept() print "[+] Connect success -> %s at %s" % (str(mainhost), time.strftime("%Y%m%d %H:%M:%S", time.localtime())) if mainhost: while True: data = mainsocket.recv(1024) if data: print "[+] Receive:%s" % data mainsocket.sendall("[Server]success") parsecmd(data) if data == "close session": mainsocket.close() print "[+] Quit success" break breakif __name__ == "__main__": # some public variable connPort = 47091 onethreads = threading.Thread(target=recvdata, args=(connPort,)) onethreads.start()
clientCmd.py
#!/usr/bin/env python# coding:utf-8# Build by LandGrey#import timeimport socketdef readtarget(): global server_list with open(r"servers.txt") as f: for line in f.readlines(): if line[0:1] != "#" and len(line.split(".")) == 4: server_list.append(line)def connserver(host, port): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((host, port)) while True: print "/n[*] Please input command:" data = raw_input() if not data: break s.sendall(data) recvdata = s.recv(1024) print "[+] Send %s:%s -> %s" % (host, str(connPort), data) time.sleep(0) if recvdata: print "[+] Receive :%s" % recvdata if data == "close session": s.close() breakif __name__ == "__main__": server_list = [] connPort = 47091 readtarget() if server_list != []: for host in server_list: connserver(host, connPort)
新聞熱點
疑難解答