我正在构建一个网站,其中包含一个表单,用于捕获用户数据并在用户数据上运行一些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
答案 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 )
确保用户具有文件共享的登录权限。