8

ホームディレクトリから次のコマンドを実行しています。

python -m CGIHTTPServer

これでサーバーが実行されますが、cgi-binディレクトリのスクリプトにアクセスしようとすると次のようになります。

Traceback (most recent call last):
  File "/usr/lib/python2.7/CGIHTTPServer.py", line 251, in run_cgi
    os.execve(scriptfile, args, env)
OSError: [Errno 13] Permission denied

ルートとして実行しても違いはありません。ファイルにはすべての適切な権限があるようです。

student@bandersnatch:~$ ls -lhR
.:
total 12K
drwxr-xr-x 2 student student 4.0K Jun 13 18:38 cgi-bin
drwxr--r-- 2 student student 4.0K Jun 10  2004 kalpy
-rwxrwxrwx 1 student student 2.0K Jun 13 12:37 test.html

./cgi-bin:
total 8.0K
-rwxr-xr-x 1 student student 31 Jun 13 18:38 test.py

編集:test.pyの内容は次のとおりです。

#!/usr/bin/python
print "test"

シェバンは有効です:

~$ which python
/usr/bin/python
4

4 に答える 4

10

万が一、プロセスをルートとして実行していますか?

ソースを使用する場合はCGIHTTPServer.py、を呼び出す直前に、が表示されますexecve

try:
    os.setuid(nobody)
except os.error:
    pass

つまり、UIDを変更できる場合、つまりルートである場合は、CGIスクリプトを誰も実行しません。ルートでない場合、この呼び出しは失敗する可能性が高く、渡されます。

したがって、サーバーをrootとして実行しているため、スクリプトは誰も実行していませんが、このユーザーはスクリプトにアクセスできません。あなたがそれがあなたの家のdirにあるとあなたが言うように、それは予想されます。

私が考えることができる2つの解決策:

  • 推奨:サーバーをrootとして実行しないでください!
  • 回避策:スクリプトを誰も読めないディレクトリにコピーします(/tmpたとえば)。
于 2012-06-13T21:55:00.363 に答える
1

個人的には、気づかない理由がない限り、os.execveの代わりにsubprocess.Popenを使用することをお勧めします。以前、Popen(['open execName.app'])で.appを起動しようとして、Errno13に遭遇しました。代わりに、Popen(['execName.app/Contents/MacOS/execName'、'arg1'、'arg2' ...])を使用する必要がありました。それが役立つかどうかはわかりませんが、試してみてください。

于 2012-06-13T19:46:46.050 に答える
1

私はubuntuLinuxから同じ問題に遭遇しました。修正を加えた「マイク」による解決策に従いました。複数のフォルダがある「/usr」のchmodを行う代わりに、拒否された実行可能ファイルを含むフォルダの権限を変更してください。(静的htmlファイルを同じ場所にロードするときにサーバーが正常に実行され、スクリプトが実行されるときにのみエラーが表示されることを確認できます)。

cd /pathto/folder/with/deniedscript
sudo chmod -R 755 ./

これでスクリプトに権限が付与されたため、正常に実行されるはずです。-Rは、このフォルダー(およびサブフォルダーがある場合)内のすべてのファイルにアクセス許可を与えることに注意してください。

于 2016-09-04T14:15:21.543 に答える
0

Windowsで実行している場合、ファイルはコマンドプロンプトからすぐに実行されます。

LinuxおよびWindowsユーザーの場合はそうではありません!

次のエラーが発生します。

トレースバック(最後の最後の呼び出し):ファイル "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/http/server.py"、行1158、run_cgi os.execve(scriptfile、args、env )PermissionError:[Errno 13]アクセスが拒否されました:

これらの問題を解決するには、次のことを行う必要があります。

Linuxユーザーの場合:

1)LinuxおよびMacOSXシステムで実行されているPython3に合わせてシバンが調整されていることを確認します。

#!/usr/bin/env python3

2)元の実行可能ファイルはウィンドウに書き込まれているため、削除する必要のあるファイルには「\r」が隠されています。考えられる3つの方法は次のとおりです。a)ターミナルコマンドラインタイプ:(tr -d ‘\r’ < input file name > output file name 出力ファイルの名前を新しい名前に変更->古いファイルを消去->次に出力ファイル名を元に戻す)b)ターミナルコマンドラインタイプ:(cat inputfile | col -b > outputfile ちょうど出力ファイルの名前を新しい名前に変更します->古いファイルを消去します->次に出力ファイル名を元に戻します)c)dos2unixをダウンロードし、ターミナルコマンドラインを入力します:dos2unix入力ファイル名

3)ファイルを実行可能にする:ターミナルコマンドラインで次のように入力します:a)chmod 755ファイル名またはb)chmod+xファイル名またはchmoda+xファイル名

Mac OSXユーザーの場合、それはほとんど同じです。

  1. Linuxからステップ1)を繰り返します
  2. Linuxからステップ2)を繰り返します

ステップ3では、次のことが変わります。

apache.org wikiページに基づく:https ://wiki.apache.org/httpd/13PermissionDenied これは、ファイルの場所から/Usersルートディレクトリまでのすべての実行可能ファイルを作成する必要があることを示しています。

次のことを行う必要があります。

3)ターミナルコマンドライン:

a) type command: `cd /Users`
b) type command: `sudo chmod -R 755`

これで、サーバーの.pyファイルを次の方法で実行できます。

sudo webserver.py

および通常の入力ファイル:

python3 inputfile.py

これで、パーミッションエラーが発生しなくなりました。Python 2を実行している場合は、シバンとコマンドラインに必要な調整を加えることができます。

于 2015-03-18T01:00:06.667 に答える