0

このようなフォルダーを作成しているサーバーでPythonアプリを実行している場合

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

Paramikoモジュールを使用して、SFTP経由でサーバーにファイルをアップロードするクライアントアプリ(Pythonでも)があります。クライアントは、このように必要に応じてサーバー上にフォルダーも作成します

    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

umaskを設定するのを忘れたようです。これを試して:

os.umask(0)

モードを含む呼び出しを行う前に。

于 2013-03-18T00:50:18.677 に答える
1

のドキュメントにos.makedirsは次のように書かれています:

デフォルトのモードは 0777 (8 進数) です。

777 を渡しています。これは、8 進数を示す先頭の 0 がないため、まったく異なる数値です。おそらく、モードをまったく渡さず、デフォルトを使用する必要があります。

于 2013-03-17T13:47:42.223 に答える