- #!/usr/bin/env python
- import sys
- import random
- import string
- def usage():
- print "Usage: ./randompasswd.py num [num in (8-16)]"
- exit(1)
- def randomPassword(num):
- passwd = ''
- seed = string.letters + string.digits + string.punctuation
- for i in xrange(num):
- passwd += seed[random.randrange(0,len(seed))]
- # random.randint(0,lent(seed))也可以
- return passwd
- def main():
- if len(sys.argv) == 2:
- try:
- num = int(sys.argv[1])
- except:
- usage()
- if num in xrange(8,16):
- print randomPassword(num)
- else:
- usage()
- else:
- print randomPassword(10)
- if __name__ == '__main__':
- main()
留着或许用得上。
又加一个自动修改密码的,以后再完善之:
- #!/usr/bin/env python
- import pexpect
- import sys
- import string
- import time
- from random import Random
- def genpwd():
- pwdchars=string.letters + string.digits +'~!@#$%^&*-_=+?'
- pwdlength = Random().sample([20, 21, 22], 1).pop()
- return ''.join(Random().sample(pwdchars, pwdlength))
- def changepwd(user,newpwd):
- passwd=pexpect.spawn("passwd %s" % user)
- #passwd.logfile = sys.stdout
- #fout = file('pwd.log','w') #写入日志,-a是追加
- #passwd.logfile=fout #passwd.logfile_read,记录spawn的输出
- #这里应该是New UNIX password:
- #和Retype new UNIX password:
- #passwd.logfile_send 记录输入部分,就是密码。
- for repeat in (1,2):
- passwd.expect("password: ")
- passwd.delaybeforesend = 0.05 ####见注释####
- passwd.sendline(newpwd)
- time.sleep(0.1)
- print passwd.before,passwd.after
- # before记录匹配之前产生的输出,这里是:
- # Changing password for user xyz.
# New UNIX
- # Retype new UNIX
- # after 记录匹配的内容,这里是:passwd
- def main():
- user=sys.argv[1]
- newpwd=genpwd()
- print "change password for %s" %user
- print "newpwd:%s" % newpwd
- changepwd(user,newpwd)
- if __name__ == "__main__":
- main()
注释:在 expect 之后,某些应用程序,如 ssh,会做如下动作:
#1. SSH 打印 "password:" 提示符给用户
#2. SSH 关闭 echo.
#3. SSH 等待用户输入密码
# 但是现在第二条语句 sendline 可能会发生在 1 和 2 之间,即在 关掉 echo 之前输入了 password 给子程序 , 从 而在 stdout,该 password 被 echo 回显出来,出现了 security 的问题, 所以此时可以通过设置 delaybeforesend 来在将数据写(发送)给子程序之前增加一点点的小延时
===========================================
child.after,child.before都是在当匹配结束时有结果。
看这个例子
- child = pexpect.spawn('/bin/ls /')
- # child.expect (pexpect.EOF)
- print child.before
结果为空。因为执行了ls ,此时需要匹配结束,所以去掉了结束标记没结果。
还有
- p = pexpect.spawn( ‘ ls -l ’ )
- fout = open ('log.txt', "w")
- p.logfile = fout
- fout.close()
运行该脚本后,你会发现其实 log.txt 是空的,没有记录 ls -l 命令的内容,原因是没有调用 send 或 read_nonblocking,真正的内容没有被 flush 到 log 中。如果在 fout.close() 之前加上 p.expect(pexpect.EOF),log.txt 才会有 ls -l 命令的内容。
更多https://www.ibm.com/developerworks/cn/linux/l-cn-pexpect1
https://www.ibm.com/developerworks/cn/linux/l-cn-pexpect2
阅读(1348) | 评论(0) | 转发(0) |