客户端代码:
如果注释最下面三行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="ip add |awk '/10.1/ {print $2}'|grep -oP '(d+.){3}d+'" 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 ' % 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()