Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1067081
  • 博文数量: 186
  • 博客积分: 4939
  • 博客等级: 上校
  • 技术积分: 2075
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-08 17:15
文章分类

全部博文(186)

文章存档

2018年(1)

2017年(3)

2016年(11)

2015年(42)

2014年(21)

2013年(9)

2012年(18)

2011年(46)

2010年(35)

分类: Python/Ruby

2011-04-02 11:23:36

  1. #!/usr/bin/env python
  2. import sys
  3. import random
  4. import string

  5. def usage():
  6.     print "Usage: ./randompasswd.py num [num in (8-16)]"
  7.     exit(1)

  8. def randomPassword(num):
  9.     passwd = ''
  10.     seed = string.letters + string.digits + string.punctuation
  11.     for i in xrange(num):
  12.         passwd += seed[random.randrange(0,len(seed))]
  13.         # random.randint(0,lent(seed))也可以

  14.     return passwd

  15. def main():
  16.     if len(sys.argv) == 2:
  17.         try:
  18.             num = int(sys.argv[1])
  19.         except:
  20.             usage()

  21.         if num in xrange(8,16):
  22.             print randomPassword(num)
  23.         else:
  24.             usage()
  25.     else:
  26.         print randomPassword(10)

  27. if __name__ == '__main__':
  28.     main()

留着或许用得上。

又加一个自动修改密码的,以后再完善之:

 

  1. #!/usr/bin/env python

  2. import pexpect
  3. import sys
  4. import string
  5. import time
  6. from random import Random

  7. def genpwd():
  8.         pwdchars=string.letters + string.digits +'~!@#$%^&*-_=+?'
  9.         pwdlength = Random().sample([20, 21, 22], 1).pop()
  10.         return ''.join(Random().sample(pwdchars, pwdlength))

  11. def changepwd(user,newpwd):
  12.         passwd=pexpect.spawn("passwd %s" % user)
  13.         #passwd.logfile = sys.stdout
  14.         #fout = file('pwd.log','w') #写入日志,-a是追加
  15.         #passwd.logfile=fout #passwd.logfile_read,记录spawn的输出
  16.         #这里应该是New UNIX password:
  17.         #和Retype new UNIX password:
  18.         #passwd.logfile_send 记录输入部分,就是密码。 
  19.         for repeat in (1,2):
  20.                 passwd.expect("password: ")
  21.                 passwd.delaybeforesend = 0.05 ####见注释####
  22.                 passwd.sendline(newpwd)
  23.                 time.sleep(0.1)
  24.                 print passwd.before,passwd.after
  25.                 # before记录匹配之前产生的输出,这里是:
  26.                 # Changing password for user xyz.
                    # New UNIX
  27.                 # Retype new UNIX
  28.                 # after 记录匹配的内容,这里是:passwd
  29. def main():
  30.         user=sys.argv[1]
  31.         newpwd=genpwd()
  32.         print "change password for %s" %user
  33.         print "newpwd:%s" % newpwd
  34.         changepwd(user,newpwd)

  35. if __name__ == "__main__":
  36.         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都是在当匹配结束时有结果。

看这个例子

  1. child = pexpect.spawn('/bin/ls /')
  2. # child.expect (pexpect.EOF)
  3. print child.before

结果为空。因为执行了ls ,此时需要匹配结束,所以去掉了结束标记没结果。

还有

  1. p = pexpect.spawn( ‘ ls -l ’ )
  2. fout = open ('log.txt', "w")
  3. p.logfile = fout
  4. 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

阅读(1274) | 评论(0) | 转发(0) |
0

上一篇:oop

下一篇:淘宝cdn技术分享启发

给主人留下些什么吧!~~