【问题标题】:How to securley pass Password as Argument to a Python Script over SSH?如何通过 SSH 安全地将密码作为参数传递给 Python 脚本?
【发布时间】: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()

这满足了我的所有三个案例,并且似乎没有回显密码。

我是否正确假设这是安全的并且不会记录密码?

【问题讨论】:

    标签: python security ssh


    【解决方案1】:

    您可以在 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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多