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
默认情况下, 代码 #5:使用 stderr 参数获取标准输出和收集的错误 代码 #6:使用 timeout 参数()来执行一个有超时的命令。 通常,命令的执行不需要底层 shell(例如,sh、bash 等)的帮助。相反,提供的字符串列表被提供给低级系统命令,例如 os.execve()。对于要由 shell 解释的命令,请使用简单的字符串提供它并给出 shell=True 参数。如果试图让Python执行涉及管道、I/O 重定向和其他功能的复杂 shell 命令,这有时很有用,如下所示 - 如果参数来自用户输入,则在 shell 下执行命令会带来潜在的安全风险。在这种情况下, out_bytes = subprocess.check_output(
['cmd', 'arg1', 'arg2'], stderr = subprocess.STDOUT)
try:
out_bytes = subprocess.check_output(['cmd', 'arg1', 'arg2'], timeout = 5)
except subprocess.TimeoutExpired as e:
...
代码#7: out_bytes = subprocess.check_output(
'grep python | wc > out', shell = True)
shlex.quote()
函数可用于正确引用参数以包含在 shell 命令中。
在评论中写代码?请使用 ide.geeksforgeeks.org,生成链接并在此处分享链接。