• Python之控制台输入密码的方法


    一、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 == "
    " or ch == "
    ": 
          print 
          return password 
        elif ch == "" or ord(ch) == 127: 
          if len(password) > 0: 
            sys.stdout.write(" ") 
            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 == "
    " or ch == "
    ": 
          print 
          return password 
        elif ch == "" or ord(ch) == 127: 
          if len(password) > 0: 
            sys.stdout.write(" ") 
            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:PythonAlexs12zhulh>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 '
    ': # 如果是换行,则输入结束               
                 break   
            elif newChar == '': # 如果是退格,则删除密码末尾一位并且删除一个星号   
                 if chars:    
                     del chars[-1]   
                     msvcrt.putch(''.encode(encoding='utf-8')) # 光标回退一格  
                     msvcrt.putch( ' '.encode(encoding='utf-8')) # 输出一个空格覆盖原来的星号  
                     msvcrt.putch(''.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("
    your 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  


     

  • 相关阅读:
    npm 常用指令
    跨域详解
    模板
    Set-Cookie
    哈佛大学公开课 幸福课 积极心理学
    Token Authentication vs. Cookies
    Using Cookieless Forms Authentication Tickets
    What Is Token-Based Authentication and Who Uses It?
    Types of authentication wiz. oauth, digest, basic, token-based
    Session Authentication vs Token Authentication
  • 原文地址:https://www.cnblogs.com/Richardzhu/p/5162289.html
Copyright © 2020-2023  润新知