2012-11-23 42 views
3

我一直在Python/Django中實現rsync來在文件之間傳輸數據。這裏是我的views.py:如何引發此異常或錯誤消息?

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(['sshpass', '-p', password, 'rsync', '--list-only', source], 
          stdout=subprocess.PIPE, 
          env={'RSYNC_PASSWORD': password}).communicate()[0] 
    command = command.split(' ')[-1] 

     result = subprocess.Popen(['ls', '/home/nfs/django/genelaytics/user'], stdout=subprocess.PIPE).communicate()[0].splitlines() 

     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)) 

我從窗體的遠程主機,用戶名和密碼輸入。但是這些密碼,用戶名或服務器名稱可能不正確。即使他們不正確,這段代碼將我轉換爲thanks.html,但這些服務器上的文件當然沒有列出,因爲用戶名,密碼,主機名不正確。我如何驗證它?如何提出異常或錯誤的用戶名,密碼或主機名錯誤?

+0

您可能需要閱讀[返回代碼](https://en.wikipedia.org/wiki/Exit_status)和[Popen](http://docs.python.org/2/library/subprocess# subprocess.Popen) – goncalopp

+0

你可以請更具體一點嗎?我想顯示如下消息:主機名不正確或用戶名/密碼不正確! – sachitad

+0

當然。如果你真的想用Popen(而不是像Marwan Alsabbagh所建議的那樣的庫)來做到這一點,你應該檢查每個Popen調用的返回代碼,並將其與每個程序返回的返回代碼列表進行比較(sshpass, rsync的)。你可以在程序的手冊上找到這些信息,或者如果失敗了,可以通過反覆試驗來找到。 – goncalopp

回答

1

在python中,如果你想使用ssh或sftp(通過SSH連接複製文件),那麼paramiko庫是最好的選擇。如果你只是想檢查該功能是否提供主機,用戶名,密碼組合是否有效將做的工作:

import paramiko 

def test_ssh(host, username, password): 
    ssh = paramiko.SSHClient() 
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
    ssh.connect(host, username=username, password=password) 

功能的一個例子電話是:

test_ssh('10.0.0.10', 'myuser', 'mypassword') 

,如果它是能夠正確連接到主機,它將成功返回。否則,它將通過一個例外來確定失敗的細節。例如,當人把一個無效的主機下面的異常被提出:

socket.error: [Errno 113] No route to host 

無效的用戶名,密碼,將提高:

paramiko.AuthenticationException: Authentication failed. 

您可以捕獲這些異常,你通常會做在Python和顯示什麼您希望給您的用戶的消息類型。我會建議,而不是使用sshpass和子進程來使用paramiko。

+0

謝謝你的回答。 – sachitad

1

在你做任何事情之前,停止。您正在使用全局變量來存儲用戶名和密碼。這意味着隨後的來自其他用戶的請求可以訪問先前的用戶數據。 不要這樣做。如果你在Python中使用全局變量,你可能會做錯了:如果你使用它在Django中的請求之間傳遞數據,那你肯定是做錯了。

請注意I've warned you about this before。請停止執行根本不安全的體系結構。

+2

儘管我完全同意並贊同你的答案的精神,但我很好奇HTTP請求如何能夠顯示代碼中以前進程的密碼值 - 除非在Django本身存在某種安全缺陷? – goncalopp

+0

它不會透露價值,沒有。但它可以很好地允許隨後的請求*使用該值:大概是將密碼存儲在全局中的原因是以不同的視圖訪問它,並且攻擊者可以想象地直接看到該視圖並使用先前的視圖,存儲用戶名/密碼以訪問外部資源。 –