在使用makedirs()后,其他应用权限被拒绝

0 投票
3 回答
7810 浏览
提问于 2025-04-17 19:24

我有一个在服务器上运行的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

听起来你忘了设置你的 umask 了。试试这个:

os.umask(0)

在你进行任何与模式相关的操作之前,先执行这个。

1

os.makedirs的说明里写着:

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

你传入的777其实是个完全不同的数字,因为它没有前面的0来表示这是八进制的数字。你可能干脆不传这个权限模式,让它使用默认的就好了。

2

我在这里发现了一个类似的问题 链接,结果发现,在某些系统中,os.makedirs() 里的模式参数会被忽略。你需要用 os.chmod 来解决这个问题。

对于我创建的文件夹,我现在偶尔会使用

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

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

撰写回答