2016-10-10 18 views
-1

私は、ユーザーデータをキャプチャし、ユーザーデータでいくつかのCGIを実行する形式のWebサイトを構築しています。 cgiの最初のステップの1つは、Linux WebサーバーからWindowsマシンにファイルをコピーする必要があることです。サーバーは、コピー信任状にアクティブなディレクトリー役割acountを使用しています。PythonのLinuxからWIndowsへのコピーファイル

mount -t cifs -o username=someUsername,password=somePasword //someMachine/someShare /someMountPoint 

残念ながら、私はパスワードに関するエラーが、私はbashでそのコマンドを実行したときに無効である帰属取得:私は単にこのような何かを使用することを望んでいました。理想的には、この方法を使用してリモートウィンドウをマウントしてファイルをコピーしますが、もっと理にかなっていると他のモジュールを試してみます。

私はこれに似ていますが、うまくいかず、必要な一時ディレクトリを作成しますが、何もマウントしません。私は何か他のものを使ってみてうれしいですが、ここで間違っていることを知りたいです。

import subprocess 
import random 


def makeDir(): 
    tempDir = random.randrange(111111,999999) 
    subprocess.Popen(["mkdir","/mntDir/"+str(tempDir)]) 
    return tempDir 

def mountShare(hostname, username, password): 
    mountDir = makeDir() 
    try: 
     subprocess.Popen(["mount","-t","cifs", "-o", 
         "username="+username+",password="+password, 
         "//"+hostname+"/c$", 
         "/mntDir/"+mountDir]) 
    except: 
     print("Mounting failed") 

+0

通常の通常の操作のために、Windowsサーバー(C $共有に必要)に対する管理者権限を持つWebサイトと、Linuxサーバー上のファイルシステムをマウントするためのroot権限を実行しますか? Eww。正しいフォルダと共有パーミッションを持つWindowsサーバ上の限られたユーザアカウントを使用する方がはるかに優れていて、Linux側の[smbclient](http://superuser.com/a/562728)のようなものをマウントする必要はありません。全く分かち合う。 (また、[tempfile](https://docs.python.org/3/library/tempfile.html)モジュールをチェックして、あなたのrandom.randrange bodgeを避けるようにしてください) – TessellatingHeckler

+0

はい、アカウントに関しては理想的です。避けてください。このサイトは少人数のグループに限定され、社内ではありますが、セキュリティは明らかに重要です。リモートマシン上で共有を実際に使用することはできません。なぜなら、それらを即座に作成する必要があるからです。しかし、ユーザーにこのための資格情報を提供させることは可能かもしれません。入力をありがとう、私は確かにsmbclientを使用する可能性を見て、私はまた、そのtempfileモジュールの外観が好きです。おかげで –

答えて

0

私はpysmb(https://pythonhosted.org/pysmb/api/smb_SMBConnection.html)にあるSMBConnectionクラスを使用しました。非常にシンプルで、取り付けが不要です。

conn = SMBConnection(user, pw, myname, srv, use_ntlm_v2 = True) 
conn.connect(ip, port=139) 
file2transfer = open(filename,"r") 
conn.storeFile(share,path + filename, file2transfer, timeout=30) 

ユーザーにファイル共有のログオン権限があることを確認します。

+0

これは完璧な解決策です。私は他のコードを取り除き、これで置き換えました。私はそれをはるかに信頼性が高く、速く見つける。 ありがとうございました! –

0

このアプローチには2つの欠点があります:最初のものは、あなたのWebサーバからWindows共有をマウントすることです。あなたはそれを動的にマウントする必要はありません。アカウントごとに、リクエストごとにマウントしないでください。実装とインフラストラクチャを分離します。/etc/fstabに必要なディレクトリをマウントして、Webサーバーにディレクトリの存在を依頼してください。

しかし、もう1つの問題があります。ファイルを別のマシンにコピーしていますか?それらを処理しますか?どのようにデータを処理する必要があることをWindowsマシンに通知したいですか?何かを処理する必要があるときに別のWebサーバーを実行してリクエストを送信しないでください。この時点で、すべてのネットワークファイルシステムを削除し、要求内にファイルを送信することができます。だからあなたはWindowsのバックエンドサーバーにHTTP要求を送信することによっていくつかのアクションを実行するfreshmeat_linux/Linux]ベースのフロントエンドサーバーがあります。これにより、処理が準備完了したときにフロントエンドに通知することもできます。それはとにかく、Popenをエラーの詳細を隠し、彼らは(見つからなかったため、コマンドの)コマンドを起動できないときに、他subprocess方法が唯一の例外を投げるよう

+0

ありがとう、私はあなたが意味するものを参照してください。私はあなたが基本的な考えを理解していると思います。 linux apacheサーバーはhttpsを使用するフォームを実行し、ユーザーのログオンが必要です。フォームで収集されるデータは、ユーザー名、その他の単純な変数、リモートのWindowsデスクトップマシンのホスト名です。このデータは、リモートデスクトップマシンにコピーされる応答ファイルと、私が責任を負う追加のソフトウェアコンポーネントを作成するために使用されます。次に、リモートマシン上でexeを起動する必要があります。プロセス中にすべてが削除されます。 –

0

まず、mountが実際に呼び出されることを意味し、例外ブロックをドロップします。

第二に、あなたのケースで

rc = subprocess.call(["mount","-t","cifs", "-o", 
         "username="+username+",password="+password, 
         "//"+hostname+"/c$", 
         "/mntDir/"+mountDir]) 
if rc: 
    print("mount failed") 

をあなたが本当にPopenが、callを必要としない(とボーナスとして、あなたが直接リターンコードを取得する)、問題一般例外ブロックです。

この方法:あなたが整数(TypeError: Can't convert 'int' object to str implicitly)で文字列を追加しているので、

def makeDir(): 
    tempDir = random.randrange(111111,999999) 
    subprocess.Popen(["mkdir","/mntDir/"+str(tempDir)]) 
    return tempDir 

整数を返すので、あなたは例外ブロックを削除する場合は、エラーが発生します。それはあなたを惑わす愚かな例外の捕獲ではなかったなら、あなたが見たことがある簡単な間違いです。

しかし、引数なしのブロックtry/exceptでは、mount failedという無駄なメッセージが表示されます。 決してあなたのステートメントをtry:/except:で保護してください、それは非生産的です。あなたが本当にはそれを行うにしたい場合は

、次の操作を行います。

try: 
    some_command 
except Exception as e: 
    # print detailed exception, not just "error" 
    print("Something went wrong "+str(e)) 

がそれをまとめるために、ここでは(ボーナスとして、いくつかのわずかな改善で)あなたのコードの修正バージョンです

import subprocess,os 
import random 


def makeDir(): 
    # directly create directory name as a string 
    tempDir = "/mntDir/{}".format(random.randrange(111111,999999)) 
    # no need for a subprocess, python handles this well! 
    os.mkdir(tempDir) 
    # returns the absolute directory name, as string 
    return tempDir 

def mountShare(hostname, username, password): 
    mountDir = makeDir() 
    rc = subprocess.call(["mount","-t","cifs", "-o", 
         "username="+username+",password="+password, 
         "//"+hostname+"/c$", 
         mountDir]) 
    if rc!=0: 
     print("Mounting failed") 
+0

編集していただきありがとうございます。あなたが言うことは、良いアドバイスのおかげで、多くの意味があります! –

0

解決策は共有をマウントするのではなく、smbclientを使用してオンザフライでコピーすることでした。私が使用しているコマンドは以下の形式で、関連する権限を持つアカウントが含まれているあるauthfileを参照:

username = yourUsername 
password = yourPassword 
domain = yourDomain 

このファイルに関する権限がsmbclientのコマンドは、その後に使用されている500

に設定されていますリモートマシン上にディレクトリを作成し、そのディレクトリにファイルをコピーします。

smbclient //hostname/c$ -A /authfile -c "mkdir someDir; cd someDir/; lcd /folderToCopyFrom; prompt; recurse; mput *; exit;" 

アドバイスありがとうございました。

関連する問題