📜  Python|在运行时提示输入密码并以错误消息终止

📅  最后修改于: 2022-05-13 01:54:27.647000             🧑  作者: Mango

Python|在运行时提示输入密码并以错误消息终止

假设我们的脚本需要密码,但由于该脚本用于交互使用,它可能会提示用户输入密码,而不是将其硬编码到脚本中。

Python 的getpass 模块精确地完成了它所需要的工作。它将允许用户非常容易地提示输入密码,而无需在用户终端上显示键入的密码。

代码 #1:它是如何完成的?

import getpass
user = getpass.getuser()
passwd = getpass.getpass()
  
# must write svc_login() 
if svc_login(user, passwd):
    print('Yay !')
else:
    print('Boo !')

在上面的代码中, svc_login()函数是为进一步处理密码输入而编写的代码。显然,确切的处理是特定于应用程序的。在上面的代码中getpass.getuser()不会提示用户输入他们的用户名。相反,它使用当前用户的登录名,根据用户的 shell 环境,或者作为最后的手段,根据本地系统的密码数据库(在支持pwd模块的平台上)。

为了明确提示用户输入他们的用户名,这可能更可靠,使用了内置的输入函数。

user = input('Enter your username: ')

同样重要的是要记住,某些系统可能不支持将键入的密码输入隐藏到getpass()方法。在这种情况下, Python会尽其所能预先警告用户出现问题(即,它会提醒用户密码将以明文形式显示),然后再继续。

执行外部命令并获取其输出 -

代码 #2:使用subprocess.check_output()函数

import subprocess
out_bytes = subprocess.check_output(['netstat', '-a'])

这将运行指定的命令并将其输出作为字节字符串返回。要将生成的字节解释为文本,请添加进一步的解码步骤,如下面的代码所示 -

代码#3:

out_text = out_bytes.decode('utf-8')

如果执行的命令返回非零退出代码,则会引发异常。

代码 #4:捕获错误并获取与退出代码一起创建的输出

try:
    out_bytes = subprocess.check_output(['cmd', 'arg1', 'arg2'])
      
except subprocess.CalledProcessError as e:    
    # Output generated before error
    out_bytes = e.output 
    # Return code
    code = e.returncode 

默认情况下, check_output() 只返回写入标准输出的输出。

代码 #5:使用 stderr 参数获取标准输出和收集的错误

out_bytes = subprocess.check_output(
        ['cmd', 'arg1', 'arg2'], stderr = subprocess.STDOUT)

代码 #6:使用 timeout 参数()来执行一个有超时的命令。

try:
    out_bytes = subprocess.check_output(['cmd', 'arg1', 'arg2'], timeout = 5)
except subprocess.TimeoutExpired as e:
    ...

通常,命令的执行不需要底层 shell(例如,sh、bash 等)的帮助。相反,提供的字符串列表被提供给低级系统命令,例如 os.execve()。对于要由 shell 解释的命令,请使用简单的字符串提供它并给出 shell=True 参数。如果试图让Python执行涉及管道、I/O 重定向和其他功能的复杂 shell 命令,这有时很有用,如下所示 -
代码#7:

out_bytes = subprocess.check_output(
        'grep python | wc > out', shell = True)

如果参数来自用户输入,则在 shell 下执行命令会带来潜在的安全风险。在这种情况下, shlex.quote()函数可用于正确引用参数以包含在 shell 命令中。