生成并要求输入随机生成的密码

时间:2016-01-02 19:35:27

标签: python windows random getpasswd

我的程序需要记住已分配给变量的特定预定密码,以便用户输入必须与之匹配。

import random

password = [chr(random.randint(33, 126)) for x in range(6)]

print("Your password is: {}".format(" ".join(password)))

import getpass

pswd = getpass.getpass(password)

if (pswd == password):
   print("Access granted")
else:
   print("Access denied")

在代码中,他们会收到密码,然后需要输入密码。我删除了大量无关的编码,因此主要是用户获取密码,之后他们必须输入密码。 因此密码是一组随机字符,然后是用户在需要时需要记住和输入的密码。

这不起作用,我想知道是否有人可以帮忙。

另外,有没有办法删除由于GetPassWarning的输入而在shell上显示的红色文字(getpass.getpass())?

感谢。

3 个答案:

答案 0 :(得分:2)

password设置为加入后获得的字符串,以便将其与用户输入的字符串进行比较。

import random

password = " ".join([chr(random.randint(33, 126)) for x in range(6)])

print("Your password is: {}".format(password)

import getpass

pswd = getpass.getpass("Enter your password: ")

if (pswd == password):
   print("Access granted")
else:
   print("Access denied")

答案 1 :(得分:1)

而不是:

password = [chr(random.randint(33, 126)) for x in range(6)]
print("Your password is: {}".format(" ".join(password))

...使用:

password = "".join(chr(random.randint(33, 126)) for x in range(6))
print("Your password is: {}".format(password))

因此passwordstr而不是list

要防止在密码提示中再次打印密码,并禁止GetPassWarning(仅在无法解决问题时才需要抑制,如另一篇文章中提到的那样可能与{{1}相关3}}模块),你可以改变:

pswd = getpass.getpass(password)

......来:

import warnings

with warnings.catch_warnings():
    warnings.simplefilter("ignore")
    pswd = getpass.getpass("Enter password:")

(通过将password作为第一个参数传递给getpass.getpass,您当前正在告诉它使用密码本身作为密码提示。)

答案 2 :(得分:0)

这里有几个问题,但你已走上正轨!

试试这个:

import random
import getpass

password = "".join([chr(random.randint(33, 126)) for x in range(6)])

print("Your password is: {}".format(password))

pswd = getpass.getpass("Enter password: ")

if (pswd == password):
   print("Access granted")
else:
   print("Access denied")

首先,您需要使用"".join()"而不是" ".join(),除非您希望在每个字符之间留出空格。其次,您需要在定义"".join()"时使用password,因为它需要是一个字符串,相当于您希望用户输入的内容,而不是list。< / p>

第三,getpass.getpass()的参数是提示用户输入密码,而不是密码本身。 getpass()不需要知道密码是什么;它只是帮助您在输入密码时隐藏用户的输入回显。

  

getpass.getpass([prompt [,stream]])

     

提示用户输入密码而不回显。使用字符串提示提示用户,默认为“密码:&#39;”。在Unix上,提示符被写入类文件对象流。 stream默认为控制终端(/dev/tty)或者如果sys.stderr不可用(在Windows上忽略此参数)。

修改

您看到的红色错误是由于此(来自上面链接的getpass()手册页):

  

如果回音免费输入不可用,getpass()会回退到打印一条警告消息,以便从sys.stdin流式传输并发送GetPassWarning

这可能是仅限Windows的问题,在Linux / POSIX环境下,输入将被隐藏。

要在Windows下修复此错误,getpass()会尝试使用msvcrt模块。我没有要测试的Windows计算机,但尝试在Python提示符或脚本中运行import msvcrt,看看它是否有效,并发布您在评论中看到的任何错误。如果msvcrt无法导入,或sys.stdin未按预期运行,您似乎只会在Windows下出现此错误。

此外,正如@Jasper Bryant-Greene中提到的his answer一样,我们可以使用警告过滤器隐藏警告,如果无法解决msvcrt的基本问题:

import warnings

with warnings.catch_warnings():
    warnings.simplefilter("ignore")
    pswd = getpass.getpass("Enter password: ")