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に変換しますが、ユーザー名、パスワード、ホスト名が正しくなかったため、それらのサーバー上のファイルはもちろんリストされていません。どうすれば検証できますか? 例外または間違ったユーザー名、パスワード、またはホスト名のエラーを発生させるにはどうすればよいですか?

4

2 に答える 2

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とsubprocessを使用する代わりに、paramikoを使用することをお勧めします。

于 2012-11-23T07:46:21.320 に答える
1

他のことをする前に、 を止めてください。グローバルを使用してユーザー名とパスワードを保存しています。これは、他のユーザーからの後続の要求が前のユーザーのデータにアクセスできることを意味します。これをしないでください。とにかく Python でグローバルを使用している場合は、おそらく間違っています。Django でリクエスト間でデータを渡すためにグローバルを使用している場合は、間違いなく間違っています。

これについては以前に警告したことに注意してください。根本的に安全でないアーキテクチャの実装をやめてください。

于 2012-11-23T09:06:31.183 に答える