Python将文件从Linux复制到WIndows

时间:2016-10-10 19:21:49

标签: python linux windows cifs

我正在构建一个网站,其中包含一个表单,用于捕获用户数据并在用户数据上运行一些cgi。 cgi的第一步是它需要将文件从linux webserver复制到windows机器。服务器将使用活动目录角色acount作为复制凭据。我曾希望简单地使用这样的东西:

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

不幸的是,当我在bash中运行该命令时,我收到有关密码归属无效的错误。理想情况下,我会使用此方法来安装远程窗口c $ share然后复制文件,但如果它们更有意义,我愿意尝试其他模块。

我有类似的东西,但它不起作用,创建必要的临时目录,但从不安装任何东西。我很高兴尝试使用别的东西,但很想知道这里有什么问题。

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

4 个答案:

答案 0 :(得分:0)

这种方法有两个缺点:第一种方法是从Web服务器挂载Windows共享。您不需要动态安装它,在任何情况下都不应该为每个请求安装它。分离您的实施和基础设施。在/ etc / fstab中挂载所需的目录,让你的web服务器依赖于目录的存在。

但是还有另一个问题:你在将什么文件复制到另一台机器上?你想在那里处理它们吗?您想如何通知Windows机器它需要处理数据?为什么不在其上运行另一个Web服务器并在需要处理时发送请求。此时,您可以删除所有网络文件系统并在请求中发送文件。因此,您将拥有基于Linux的前端服务器,该服务器通过向Windows后端服务器发送HTTP请求来执行某些操作。这也允许您在处理准备就绪时通知前端。

答案 1 :(得分:0)

首先,删除异常块,因为它隐藏了错误详细信息,无论如何Popen和其他subprocess方法只在无法启动命令时抛出异常(因为找不到命令),这意味着{{ 1}}实际上是被调用的。

其次,你真的不需要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))

答案 2 :(得分:0)

解决方案不是挂载共享,而是使用smbclient动态复制。我使用的命令是指一个authfile,其中包含一个具有相关权限的帐户:

CREATE TABLE public.emp (id int, date_1 date, amt decimal(10,2)) 
DISTRIBUTED BY (id) 
partition by range (date_1) 
(partition year2008 START (date '2008-01-01') INCLUSIVE,
 partition year2009 START (date '2009-01-01') INCLUSIVE,
 partition year2010 START (date '2010-01-01') INCLUSIVE
    END (date '2011-01-01') EXCLUSIVE EVERY (INTERVAL '1 year') );

此文件的权限设置为500。

然后使用smbclient命令在远程计算机上创建目录并将文件复制到该目录。

public.emp_1_prt_year2008
public.emp_1_prt_year2009
public.emp_1_prt_year2010

谢谢大家的建议,最有帮助!

答案 3 :(得分: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 )

确保用户具有文件共享的登录权限。