python实现控制台密码星号输入
- import msvcrt, sys, os
- print('password: ', end='', flush=True)
-
- li = []
-
- while 1:
- ch = msvcrt.getch()
- #回车
- if ch == b'\r':
- msvcrt.putch(b'\n')
- print('输入的密码是:%s' % b''.join(li).decode())
- break
- #退格
- elif ch == b'\x08':
- if li:
- li.pop()
- msvcrt.putch(b'\b')
- msvcrt.putch(b' ')
- msvcrt.putch(b'\b')
- #Esc
- elif ch == b'\x1b':
- break
- else:
- li.append(ch)
- msvcrt.putch(b'*')
-
- os.system('pause')
-
一、raw_input()或input():
for python 2.x
- [root@master test]# /usr/local/python2.7/bin/python test.py
- Please input your password:123
- your 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:123
- your password is 123
- [root@master test]# cat test.py
- #!/usr/bin/python
- # -*- coding=utf-8 -*-
-
- #for python 3.x
- input = 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.x
- input = 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.x
- input = 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.x
- def 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.x
- def 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.py
- Please input your password:
- ***
- your password is:123
-
- #!/usr/bin/python
- # -*- coding=utf-8 -*-
- import msvcrt,sys
- def 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/sh
-
- getchar() {
- 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 "*"
- done
- echo "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
-