如何通过SSH将密码作为参数传递给Python脚本?

如何通过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()

我有一个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()
但是,如果通过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()