客戶端代碼:
如果註釋最下面三行socket發送,可以直接在本機修改密碼不發送數據到服務端。
# -*- coding: utf-8 -*- #author:Guoyabin import random import string import os from socket import * serverip = '10.1.2.221' port = 9999 buffersize = 1024 addr = (serverip,port) client = socket(AF_INET,SOCK_STREAM) client.connect(addr) def Psswd(length): chars=string.ascii_letters+string.digits return ''.join([random.choice(chars) for i in range(length)]) def get_wanip_info(): get_ip_cmd="/sbin/ifconfig |grep 'inet addr'|awk -F\: '{print $2}'|awk '{print $1}' | grep -v '^127' | grep -v '^192'" ethip=os.popen(get_ip_cmd).readline().strip() return ethip #密碼長度 passwd = Psswd(18) username = 'root' try: os.system('echo %s | /usr/bin/passwd --stdin %s' %(passwd,username)) print get_wanip_info(),'=>',passwd print "root passwd change success!!!!" except: print "root passwd change error!!!!" data = str(get_wanip_info()+'=>'+passwd) client.send('%s\r\n' % str(get_wanip_info()+'=>'+passwd)) client.close()
本着方便的原則,增加服務端用來接收密碼。使運維管理員更方便批量執行腳本,修改密碼。
# -*- coding: utf-8 -*- #author:Guoyabin import socket import threading import time server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #監聽端口: server.bind(('10.1.2.221', 9999)) server.listen(10) print('Waiting for connection...') def tcplink(sock, addr): while True: data = sock.recv(1024) time.sleep(1) if not data or data.decode('utf-8') == 'exit': break #爲防止惡意telnet發送數據包,增加=>驗證。 if '=>' not in data: break print data savepasswd(data) sock.close() def savepasswd(passwd): now=time.strftime("%Y-%m-%d %H:%M:%S") errfile=open('passwd.txt','a') errfile.write(now+' '+str(passwd)) errfile.close() while True: # 接受一個新連接: sock, addr = server.accept() # 創建新線程來處理TCP連接: t = threading.Thread(target=tcplink, args=(sock, addr)) t.start()
服務器端改良版,使用socketserver模塊替代socket。讓多線程io程序更健壯一些。
使用下面代碼,替換上面服務端代理
# -*- coding:utf-8 -*- #author:Guoyabin import socketserver import time class recvpasswd(socketserver.BaseRequestHandler): def handle(self): conn=self.request #封裝所有對象請求 while True: date=conn.recv(1024).decode() if date=='exit': break if len(date)==0: #空數據則斷開 break if '=>' not in date: #防止惡意數據寫入 break print(self.client_address,date) #self.savepasswd(date) def savepasswd(self,passwd): now=time.strftime("%Y-%m-%d %H:%M:%S") errfile=open('passwd.txt','a') errfile.write(now+' '+str(passwd)) errfile.close() if __name__=='__main__': server=socketserver.ThreadingTCPServer(('0.0.0.0',9999),recvpasswd) server.serve_forever()