python2批量修改linux密碼

客戶端代碼:

如果註釋最下面三行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()


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章