2016-10-10 116 views
-1

我正在建立一個網站,其中有一個表格可以捕獲用戶數據並在用戶數據上運行一些cgi。 cgi的第一步就是需要將文件從linux webserver複製到windows機器上。服務器將使用活動目錄角色帳戶作爲副本憑證。我希望簡單地使用這樣的事情:Python從Linux複製文件到WIndows

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

不幸的是我得到了密碼錯誤歸於無效時,當我在bash中運行該命令。理想情況下,我會使用這種方法來安裝遠程窗口c $共享,然後複製文件,但我願意嘗試其他模塊,如果他們更有意義。

我有這樣的東西,但它不起作用,創建必要的臨時目錄,但從不安裝任何東西。我很樂意嘗試使用別的東西,但很想知道這裏有什麼問題。

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 $共享所需的權限)以及在Linux服務器上安裝文件系統的root權限,以實現日常的普通操作?好惡。更好的方法是在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

這種方法有兩個缺點:第一個是,你從你的網絡服務器安裝Windows共享。您不需要動態安裝它,並且絕對不應該爲每個請求安裝它。分離您的實施和基礎設施。在/ etc/fstab中掛載所需的目錄,並讓您的web服務器依賴目錄的存在。

但是接下來還有另外一個問題:爲什麼要將文件複製到另一臺機器上?你想在那裏處理它們嗎?你想如何通知Windows機器需要處理數據?爲什麼不在其上運行另一個Web服務器,並在需要處理某些內容時發送請求。此時,您可以刪除所有網絡文件系統並在請求中發送文件。所以你將有基於Linux的前端服務器,它通過向Windows後端服務器發送HTTP請求來執行一些操作。這也將允許您在處理準備就緒時通知前端。

+0

謝謝,我明白你的意思。我想你明白了基本的想法。 linux apache服務器運行一個使用https並需要用戶登錄的表單。該表單收集的數據是用戶名,一些其他簡單變量和遠程Windows桌面機主機名。這些數據用於創建應答文件,該文件被複制到遠程桌面機器以及我不負責的其他軟件組件。然後我需要在遠程機器上觸發一個exe文件。在此過程中所有內容都將被刪除 –

0

首先,刪除異常塊,因爲它隱藏了錯誤的詳細信息,反正Popensubprocess方法僅拋出異常時,他們無法啓動(沒有發現因爲命令)命令,這意味着mount實際上是調用。

其次,你真的不需要Popen,但call(和作爲獎金,你直接將返回代碼)

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

在你的情況下,問題一般異常塊。

這種方法:

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

返回一個整數,因此,如果您刪除異常塊,因爲你要添加一個字符串一個整數(TypeError: Can't convert 'int' object to str implicitly),你會得到錯誤。這是一個簡單的錯誤,你可以看到它是否不適合愚蠢的例外情況,誤導你。

但與通用的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 

該文件的權限設置爲500

的smbclient的命令然後使用在遠程機器上創建一個目錄並將文件複製到該目錄。

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

謝謝大家的建議,最有幫助!

相關問題