Python之控制臺輸入密碼的方法
阿新 • • 發佈:2018-04-02
getch python2 3.x imp HERE xtra cti nbsp file
一、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
Python之控制臺輸入密碼的方法