我有一个创建linux用户的python脚本,给定用户名和密码作为参数。我想
./pass.py
)subprocess.Popen('/pass.py')
)subprocess.Popen(['ssh', 'host', 'pass.py')
)TL; DR检查最终的代码snippit和问题
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
另外,如果我使用subprocess
在python中运行此脚本:
# 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()
这满足了我的所有三种情况,并且似乎没有回显密码。
我认为这是安全的并且密码不会被记录,我是否正确?
答案 0 :(得分:0)
您可以在SSH会话期间添加-t,这将强制执行无回声终端。在您的客户端:
#!/usr/bin/env python
import subprocess
subprocess.call(["ssh", "-t", remote_host, "./add_user.py", "test_user"])
然后您应该可以在服务器上使用getpass获取远程密码。您也可以直接调用它或通过另一个脚本调用:
#!/usr/bin/env python
import getpass, argparse
parser = argparse.ArgumentParser()
parser.add_argument("username")
args = parser.parse_args()
username = args.username
password = getpass.getpass()