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  

参考:https://www.cnblogs.com/Richardzhu/p/5162289.html

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券