0

当我在创建这样的文件夹的服务器上运行 Python 应用程序时

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

我有一个客户端应用程序(也在 Python 中)使用Paramiko 模块通过 SFTP 将文件上传到服务器。如果需要,客户端还会像这样在服务器上创建文件夹

    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

如何让每个应用程序创建另一个也可以使用的文件夹?我已经尝试设置权限(如您在上面服务器的第一段代码中所见),但这似乎不起作用?

4

3 回答 3

2

我在这里发现了一个类似的问题,结果发现在某些系统上模式参数os.makedirs()被忽略了。你需要使用os.chmod来解决这个问题。对于创建的文件夹,我现在正在做

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

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

于 2013-03-17T14:35:19.363 回答
1

的文档os.makedirs说:

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

您正在传递 777,这是一个完全不同的数字,因为没有前导 0 来表示八进制。您可能根本不应该通过该模式,并让它使用默认值。

于 2013-03-17T13:47:42.223 回答
1

听起来您忘记设置umask。试试这个:

os.umask(0)

您拨打任何涉及模式的电话之前。

于 2013-03-18T00:50:18.677 回答