如何通过SSH将密码作为参数传递给Python脚本?
我有一个python脚本,它创建一个linux用户,并将用户名和密码作为参数。我想如何通过SSH将密码作为参数传递给Python脚本?,python,security,ssh,Python,Security,Ssh,我有一个python脚本,它创建一个linux用户,并将用户名和密码作为参数。我想 直接调用脚本(例如,/pass.py) 从调用同一VM上的脚本 python(例如,subprocess.Popen('/pass.py')) 通过python从不同的VM调用脚本 嘘。(例如,subprocess.Popen(['ssh','host','pass.py')) TL;DR检查最终代码snippit和问题 getpass适用于第一种情况 password = getpass.getpass()
- 直接调用脚本(例如,
)/pass.py
- 从调用同一VM上的脚本
python(例如,
)subprocess.Popen('/pass.py')
- 通过python从不同的VM调用脚本
嘘。(例如,
)subprocess.Popen(['ssh','host','pass.py')
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中使用子流程运行此脚本
:
# 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\u input
,它适用于情况2和3。它不会回显密码
因此,我考虑以下内容,它将--script
作为参数,并通过原始输入请求密码:
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()
这满足了我的所有三个案例,并且似乎没有响应密码
假设这是安全的,并且密码不会被记录,我是否正确?您可以在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()