在使用makedirs()后,其他应用权限被拒绝
我有一个在服务器上运行的Python应用,它会创建一些文件夹,像这样:
if not os.path.exists(destinationPath):
os.makedirs(destinationPath, 777)
我还有一个客户端应用(也是用Python写的),它通过SFTP把文件上传到服务器,使用的是Paramiko模块。这个客户端在需要的时候也会在服务器上创建文件夹,像这样:
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
我该如何让每个应用创建的文件夹都能被对方使用呢?我尝试过设置权限(就像上面服务器代码的第一部分所示),但似乎没有效果?
3 个回答
1
1
os.makedirs
的说明里写着:
默认的权限模式是0777(八进制)。
你传入的777其实是个完全不同的数字,因为它没有前面的0来表示这是八进制的数字。你可能干脆不传这个权限模式,让它使用默认的就好了。
2
我在这里发现了一个类似的问题 链接,结果发现,在某些系统中,os.makedirs()
里的模式参数会被忽略。你需要用 os.chmod
来解决这个问题。
对于我创建的文件夹,我现在偶尔会使用
for dirpath, dirnames, filenames in os.walk(theDirectory):
os.chmod(dirpath, 0777)
来更改新创建文件夹的所有权限。这解决了问题,客户端应用程序可以与服务器应用程序创建的文件夹进行交互。