2013-03-17 89 views
0

当我有它创建文件夹这样权限makedirs()后拒绝到其他应用

if not os.path.exists(destinationPath): 
     os.makedirs(destinationPath, 777) 

我有一个客户端应用程序(也用Python)的服务器上运行的Python应用程序文件上传到服务器通过SFTP使用Paramiko module。如果需要,客户端还会在服务器上创建文件夹,如下所示:

makeCommand = 'mkdir -p "' + remotePath + '"' 
     ssh.exec_command(makeCommand) 

这个工作正常。我遇到的问题是,如果服务器应用程序创建文件夹,则客户端无法访问该文件夹(无法上传到该文件夹​​或创建子文件夹)。我收到以下错误

line 104, in upload 
ftMan.sftp.put(localFile, remoteFile) 
File "build/bdist.macosx-10.8-intel/egg/paramiko/sftp_client.py", line 565, in put 
File "build/bdist.macosx-10.8-intel/egg/paramiko/sftp_client.py", line 245, in open 
File "build/bdist.macosx-10.8-intel/egg/paramiko/sftp_client.py", line 635, in _request 
File "build/bdist.macosx-10.8-intel/egg/paramiko/sftp_client.py", line 682, in _read_response 
File "build/bdist.macosx-10.8-intel/egg/paramiko/sftp_client.py", line 710, in _convert_status 
IOError: [Errno 13] Permission denied 

我怎样才能让每个应用程序创建,其他也可以使用文件夹?我试过设置权限(正如你可以在上面的服务器的第一段代码中看到的),但这似乎并没有工作?

+0

每当你编写一个创建具有'777'权限的文件的脚本时,一只小猫就会死亡。 – 2013-03-17 13:52:56

+0

哈,@BurhanKhalid,我使用777只是为了检查它是否会起作用,稍后会更改为更适合的权限:) – Cian 2013-03-17 13:55:42

回答

1

我发现了一个类似的问题here,事实证明os.makedirs()中的mode参数在某些系统上被忽略。你需要使用os.chmod来解决这个问题。 对于文件夹创建我现在做

for dirpath, dirnames, filenames in os.walk(theDirectory): 
     os.chmod(dirpath, 0777) 

偶尔改变创建的文件夹的所有权限。这已经解决了问题,客户端应用程序可以与由服务器应用程序创建的文件夹进行交互。

1

os.makedirs文档说:

默认模式是0777(八进制)。

您正在传递777,这是一个完全不同的数字,这要归功于缺少前导0来表示八进制。你可能根本不应该传递该模式,并让它使用默认值。

+0

默认会导致相同的问题。对于缺少的领先0,你是对的,我需要补充一点。但即使是默认模式,在尝试上传时也会出现相同的错误。 – Cian 2013-03-17 13:59:40

+0

你能否在两种情况下检查它实际上以哪种模式结束? – 2013-03-17 14:10:20

+0

这两种情况(传递0777或传递任何东西)似乎正在创建一个权限为755的文件夹? – Cian 2013-03-17 14:16:07

1

这听起来像你忘了设置你的umask。试试这个:你作出有关方式中的任意调用

os.umask(0)

之前。

+0

谢谢,当应用程序启动时会调用一次就足够了,或者任何正在进行涉及模式的调用的类都需要调用它吗? – Cian 2013-03-18 11:31:51

+1

这个*应该*是全过程。这是[umask](http://linux.die.net/man/2/umask)(2)的低级接口,您应该查看角落和边缘情况。它不*以任何有意义的方式面向对象或其他“好”。 – Kevin 2013-03-18 20:31:19