如何用Django中的subprocess.Popen解析服务器密码?

时间:2012-11-09 11:01:42

标签: django django-views

我有一个简单的表单,用户输入其服务器的远程主机,用户名和密码。我在views.py中使用upload_file视图处理表单。我想使用用户提供的输入运行以下命令:

rsync --list-only username@serveraddress

要运行以下命令,用户必须键入密码,验证成功后,将列出该文件。我已经从用户输入密码,但我不知道如何使用它。在立即运行上述命令后,必须在终端中输入密码。如何在Django中实现相同的功能?这是我的views.py:

def upload_file(request):
    if request.method == 'POST':    
        #session_name = request.POST.get['session']
        url = request.POST.get('hostname', False)
        username = request.POST.get('username', False)
        source = str(username) + "@" + str(url)
        command = subprocess.Popen(['rsync', '--list-only', source], stdout=subprocess.PIPE).communicate()[0]
    return render_to_response('thanks.html', {'res':result, 'res1':command}, context_instance=RequestContext(request))
    else:
        pass
    return render_to_response('form.html', {'form': 'form'},  context_instance=RequestContext(request))

1 个答案:

答案 0 :(得分:3)

我认为这个问题的标题有点过分,也许应该是“如何传递服务器密码......”。无论如何,如果我理解正确,你可以设置环境变量RSYNC_PASSWORD:

command = subprocess.Popen(['rsync', '--list-only', source],
                           stdout=subprocess.PIPE,
                           env={'RSYNC_PASSWORD': my_password}).communicate()[0]
请注意,环境变量可能对其他系统用户可见

如果这让你害怕,可以使用rsync选项--password-file(参见rsync手册)

再多一点:通过指定env调用者环境不再传递给rsync进程。