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

时间:2016-04-14 18:48:50

标签: python security ssh

我有一个创建linux用户的python脚本,给定用户名和密码作为参数。我想

  • 直接调用脚本(例如./pass.py
  • 从中调用同一VM上的脚本 python(例如subprocess.Popen('/pass.py')
  • 从python中调用来自不同VM的脚本 SSH。 (例如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()

这满足了我的所有三种情况,并且似乎没有回显密码。

我认为这是安全的并且密码不会被记录,我是否正确?

1 个答案:

答案 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()