博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python之控制台输入密码的方法
阅读量:6079 次
发布时间:2019-06-20

本文共 7170 字,大约阅读时间需要 23 分钟。

一、raw_input()或input():

for python 2.x

[root@master test]# /usr/local/python2.7/bin/python test.py Please input your password:123your password is 123[root@master test]# cat test.py #!/usr/bin/python# -*- coding=utf-8 -*-#for python 2.x#input = raw_input("Please input your password:")#print "your password is %s" %input

for python 3.x

[root@master test]# /usr/local/python3.4/bin/python3 test.py Please input your password:123your password is 123[root@master test]# cat test.py #!/usr/bin/python# -*- coding=utf-8 -*-#for python 3.xinput = input("Please input your password:")print ("your password is %s" %input)

 

Note:这种方法最简单,但是不安全,很容易暴露密码。

二、getpass.getpass():

for python 2.x

[root@master test]# /usr/local/python2.7/bin/python test.py Please input your password:your password is 123[root@master test]# cat test.py #!/usr/bin/python# -*- coding=utf-8 -*-import getpass#for python 2.xinput = getpass.getpass("Please input your password:")print "your password is %s" %input

for python 3.x

[root@master test]# /usr/local/python3.4/bin/python3 test.py Please input your password:your password is 123[root@master test]# cat test.py #!/usr/bin/python# -*- coding=utf-8 -*-import getpass#for python 3.xinput = getpass.getpass("Please input your password:")print ("your password is %s" %input)

 

Note:这种方法很安全,但是看不到输入的位数,让人看着有点不太习惯,而且没有退格效果。

三、termios:

for python 2.x

[root@master test]# /usr/local/python2.7/bin/python test.py Enter your password:***your password is 123[root@master test]# cat test.py #!/usr/bin/python# -*- coding=utf-8 -*-import sys, tty, termios #for python 2.xdef getch():    fd = sys.stdin.fileno()   old_settings = termios.tcgetattr(fd)   try:     tty.setraw(sys.stdin.fileno())     ch = sys.stdin.read(1)   finally:     termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)   return ch def getpass(maskchar = "*"):   password = ""   while True:     ch = getch()     if ch == "\r" or ch == "\n":       print       return password     elif ch == "\b" or ord(ch) == 127:       if len(password) > 0:         sys.stdout.write("\b \b")         password = password[:-1]     else:       if maskchar != None:         sys.stdout.write(maskchar)       password += ch if __name__ == "__main__":   print "Enter your password:",   password = getpass("*")   print "your password is %s" %password

for python 3.x

[root@master test]# /usr/local/python3.4/bin/python3 test.py Enter your password:***your password is 123[root@master test]# cat test.py #!/usr/bin/python# -*- coding=utf-8 -*-import sys, tty, termios #for python 3.xdef getch():    fd = sys.stdin.fileno()   old_settings = termios.tcgetattr(fd)   try:     tty.setraw(sys.stdin.fileno())     ch = sys.stdin.read(1)   finally:     termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)   return ch def getpass(maskchar = "*"):   password = ""   while True:     ch = getch()     if ch == "\r" or ch == "\n":       print       return password     elif ch == "\b" or ord(ch) == 127:       if len(password) > 0:         sys.stdout.write("\b \b")         password = password[:-1]     else:       if maskchar != None:         sys.stdout.write(maskchar)       password += ch if __name__ == "__main__":   print ("Enter your password:",)  password = getpass("*")   print ("your password is %s" %password)

Note:这种方法可以实现输入显示星号,而且还有退格功能,该方法仅在Linux上使用。

四、msvcrt.getch()

F:\Python\Alex\s12\zhulh>python test.pyPlease input your password:***your password is:123#!/usr/bin/python# -*- coding=utf-8 -*-import msvcrt,sysdef pwd_input():        chars = []       while True:          try:              newChar = msvcrt.getch().decode(encoding="utf-8")          except:              return input("你很可能不是在cmd命令行下运行,密码输入将不能隐藏:")          if newChar in '\r\n': # 如果是换行,则输入结束                            break           elif newChar == '\b': # 如果是退格,则删除密码末尾一位并且删除一个星号                if chars:                     del chars[-1]                    msvcrt.putch('\b'.encode(encoding='utf-8')) # 光标回退一格                   msvcrt.putch( ' '.encode(encoding='utf-8')) # 输出一个空格覆盖原来的星号                   msvcrt.putch('\b'.encode(encoding='utf-8')) # 光标回退一格准备接受新的输入                           else:              chars.append(newChar)              msvcrt.putch('*'.encode(encoding='utf-8')) # 显示为星号      return (''.join(chars) )    print("Please input your password:")pwd = pwd_input()  print("\nyour password is:{0}".format(pwd))sys.exit()

Note:这种方法可以实现输入显示星号,而且还有退格功能,该方法仅在Windows上使用。

 

在这里提供shell实现的输入密码显示星号的方法:

[root@master test]# sh ./passwd.sh Please input your passwd: ***Your password is: 123[root@master test]# cat passwd.sh #!/bin/shgetchar() {    stty cbreak -echo    dd if=/dev/tty bs=1 count=1 2> /dev/null    stty -cbreak echo}printf "Please input your passwd: "while : ; do    ret=`getchar`    if [ x$ret =  x ]; then        echo        break    fi    str="$str$ret"    printf "*"doneecho "Your password is: $str"

这里还有一个获取跨平台按键的例子:

class _Getch:      """Gets a single character from standard input.  Does not echo to the screen."""      def __init__(self):          try:              self.impl = _GetchWindows()          except ImportError:              try:                  self.impl = _GetchMacCarbon()              except AttributeError:                  self.impl = _GetchUnix()      def __call__(self): return self.impl()  class _GetchUnix:      def __init__(self):          import tty, sys, termios # import termios now or else you'll get the Unix version on the Mac      def __call__(self):          import sys, tty, termios          fd = sys.stdin.fileno()          old_settings = termios.tcgetattr(fd)          try:              tty.setraw(sys.stdin.fileno())              ch = sys.stdin.read(1)          finally:              termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)          return ch  class _GetchWindows:      def __init__(self):          import msvcrt      def __call__(self):          import msvcrt          return msvcrt.getch()  class _GetchMacCarbon:      """      A function which returns the current ASCII key that is down;      if no ASCII key is down, the null string is returned.  The      page http://www.mactech.com/macintosh-c/chap02-1.html was      very helpful in figuring out how to do this.      """      def __init__(self):          import Carbon          Carbon.Evt #see if it has this (in Unix, it doesn't)      def __call__(self):          import Carbon          if Carbon.Evt.EventAvail(0x0008)[0]==0: # 0x0008 is the keyDownMask              return ''          else:              #              # The event contains the following info:              # (what,msg,when,where,mod)=Carbon.Evt.GetNextEvent(0x0008)[1]              #              # The message (msg) contains the ASCII char which is              # extracted with the 0x000000FF charCodeMask; this              # number is converted to an ASCII character with chr() and              # returned              #              (what,msg,when,where,mod)=Carbon.Evt.GetNextEvent(0x0008)[1]              return chr(msg & 0x000000FF)  if __name__ == '__main__': # a little test     print 'Press a key'     inkey = _Getch()     import sys     for i in xrange(sys.maxint):        k=inkey()        if k<>'':break     print 'you pressed ',k

 

转载地址:http://jnhgx.baihongyu.com/

你可能感兴趣的文章
反射程序集
查看>>
你所不知道的CSS滤镜技巧与细节
查看>>
duilib 修复 容器控件 rightbordersize和bottombordersize属性显示错误的bug
查看>>
RTP协议分析
查看>>
大数据在云计算中转换的4个步骤
查看>>
云安全:信息安全风险长尾的终结者
查看>>
阿里巴巴CTO王坚:电视不会垮掉
查看>>
【小程序】微信小程序开发实践
查看>>
OpenStack 实现技术分解 (7) 通用库 — oslo_config
查看>>
2013年四起数据泄露事故的经验教训
查看>>
企业需要特别关注的11个BYOD风险
查看>>
JAVA通信编程(一)——串口通讯
查看>>
天翼杯大数据算法应用大赛
查看>>
我的2008
查看>>
2015年05月18日面试总结
查看>>
病毒纷纭 云安全曲线救网
查看>>
从与星瑞格软件的合作看浪潮深化主机生态布局
查看>>
中国人工智能学会通讯——当巧妇遇到“大米”——机器翻译启示录
查看>>
享未来就现在 聚VR一体机春天已经到来
查看>>
针对Android的Pegasus恶意软件版本和针对iOS的有什么不同?
查看>>