【发布时间】:2016-08-06 12:08:12
【问题描述】:
我有一个创建 linux 用户的 python 脚本,给定用户名和密码作为参数。我想要
- 直接调用脚本(例如
./pass.py) - 从同一虚拟机上调用脚本
蟒蛇(例如,
subprocess.Popen('/pass.py')) - 从不同的虚拟机调用脚本从 python over
SSH。 (例如,
subprocess.Popen(['ssh', 'host', 'pass.py'))
TL;DR 检查最终代码片段和问题
getpass 适用于第一种情况。
password = getpass.getpass()
但是,如果我通过 ssh 运行它,(ssh myhost /path/to/script.py username) 我会得到以下输出:
/usr/lib64/python2.6/getpass.py:83: GetPassWarning: Can not control echo on the terminal.
passwd = fallback_getpass(prompt, stream)
Warning: Password input may be echoed.
Password: password123
另外,如果我在 python 中使用subprocess 运行这个脚本:
# Running from same host
proc = subprocess.Popen(['./pass.py'], stdin=subprocess.PIPE)
# Running from different host
proc = subprocess.Popen(['ssh', 'myhost', '/path/to/pass.py', 'username'], stdin=subprocess.PIPE)
它似乎在subprocess.Popen 附近徘徊并且不接受密码。
但是,如果我去掉 getpass.getpass() 并将其替换为 raw_input,它适用于情况 2 和 3。它不会回显密码。
因此,我正在考虑以下方法,它将--script 作为参数并通过raw_input 询问密码:
import sys, getpass, argparse
parser = argparse.ArgumentParser()
parser.add_argument("username")
parser.add_argument("-s", "--script", action="store_true")
args = parser.parse_args()
username = args.username
if args.script:
password = raw_input("Password: ")
else:
password = getpass.getpass()
这满足了我的所有三个案例,并且似乎没有回显密码。
我是否正确假设这是安全的并且不会记录密码?
【问题讨论】: