2025年3月29日 星期六 甲辰(龙)年 月廿八 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > Python

python实现控制台密码星号输入

时间:08-19来源:作者:点击数:26
城东书院 www.cdsy.xyz

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')
示例
image

一、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
城东书院 www.cdsy.xyz
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐