无法在Django中使用Popen传递服务器密码?

时间:2012-11-19 03:39:36

标签: python django subprocess

我无法在Django中使用subprocess.Popen传递服务器密码。这是我的完整views.py:

from django.shortcuts import render_to_response
from django.template import RequestContext
import subprocess

def upload_file(request):
    '''This function produces the form which allows user to input session_name, their remote host name, username 
    and password of the server. User can either save, load or cancel the form. Load will execute couple Linux commands
    that will list the files in their remote host and server.'''

    if request.method == 'POST':    
        # session_name = request.POST['session']
        url = request.POST['hostname']
        username = request.POST['username']
        global password
        password = request.POST['password']
        global source
        source = str(username) + "@" + str(url)

        command = subprocess.Popen(['rsync', '--list-only', source],
                           stdout=subprocess.PIPE, 
                           env={'RSYNC_PASSWORD': password}).communicate()[0]

        result1 = subprocess.Popen(['ls', '/home/zurelsoft/R'], stdout=subprocess.PIPE).communicate()[0]
        result = ''.join(result1)
        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))  

以下是我从用户输入的表单:

<fieldset>
            <legend>Session</legend>
                <label for="input-one" class="float"><strong>Session Name:</strong></label><br />
                <input class="inp-text" name="session" id="sess" type="text" size="30" /><br />

                <label for="input-two" class="float"><strong>RemoteHost:</strong></label><br />
                <input class="inp-text" name="hostname"  id="host" type="text" size="30" />

                <label for="input-three" class="float"><strong>Username:</strong></label><br />
                <input class="inp-text" name="username"  id="user" type="text" size="30" />

                <label for="input-four" class="float"><strong>Password:</strong></label><br />
                <input class="inp-text" name="password"  id="pass" type="password" size="30" />
        </fieldset>

我做错了什么?密码不会从environment_variable传递。

1 个答案:

答案 0 :(得分:1)

您的代码(在RSYNC_PASSWORD中设置密码)是正确的。

我的结论是,您正尝试连接到Rsync中具有不同模块的服务器,如ssh。在ssh的情况下,RSYNC_PASSWORD变量工作。

使用fabric执行命令可能是个好主意?它可以为您处理一些事情,虽然它不会解决您的密码问题。如果您通过ssh连接,我建议设置私钥验证。

有关通过ssh:How to automate rsync without asking for password prompt

进行无密码rsync的更多信息,请参阅此问题