2012-06-13 4 views
7

を「OSErrorの拒否[ERRNO 13]許可」:PythonのCGIHTTPServerはでクラッシュ:私は私のホームディレクトリから次のコマンドを実行しています

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 

ルートとして実行しても違いはありません。

[email protected]:~$ 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 
+1

_shebang_行が 'test.py'から見えると便利です。定義されたインタプリタが有効な実行可能ファイルでない場合、このエラーが発生する可能性があります。 – rodrigo

+0

ありがとう@rodrigo、私はこの情報を含めるために私の質問を編集しました。 – qwertyboy

答えて

9

あなたは、おそらく、ルートとしてプロセスを実行していますか?

あなたはソースを使用場合は、あなただけのexecveを呼び出す前に、CGIHTTPServer.pyに表示されます。

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

つまりUIDを変更することができるならば、それは、nobodyとしてCGIスクリプトを実行しますつまり、それがルートである場合です。それがルートでない場合、このコールは失敗する可能性が高く、渡されます。

私はあなたがrootとしてサーバを実行しているので、スクリプトはnobodyとして実行されますが、ですが、このユーザはスクリプトにアクセスできません。それはあなたの家の中にあると言いますから、期待されています。私は考えることができる

2種類の溶液:

  • 推奨:rootとして、サーバーを実行しないでください!
  • 回避策:の誰もが(たとえば/tmp)を読むことができるディレクトリにスクリプトをコピーします。
+0

ありがとう@rodrigo - あなたはそれを釘付け。 – qwertyboy

1

、がありますしない限り、ファイルは、すべての必要な権限を持っているように見えます私が気付いていない何らかの理由で、os.execveの代わりにsubprocess.Popenを使用することをお勧めします。私はPopen(['open execName.app'])で.appを起動しようとする前に、Errno 13を実行しました。私はPopen(['execName.app/Contents/MacOS/execName'、 'arg1'、 'arg2' ...])を代わりに使用しなければなりませんでした。それが助けになるかどうかわからないが、それを与える。

+0

私はあなたに従うかわからない、@DaveTheScientist、私はCGIHTTPServerにパッチを当てることを提案していますか? – qwertyboy

0

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

LinuxとWindowsのユーザーには当てはまりません!

私は次のエラーを取得:

トレースバック(最新の呼び出しの最後):ファイル "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/http/server.pyを"、 run_cgi osの1158行目。execve(スクリプトファイル、引数、ENV)PermissionError:[errnoを13]許可が拒否されました:Linuxユーザのための

あなたはこれらの問題を解決するには、以下の必要があります

1)シェバングがあることを確認Pythonの3は、LinuxおよびMac OSXシステム上で実行するための調整:

#!/usr/bin/env python3

2)元の実行可能ファイルは、それらを削除しなければならないファイルに「\ r」を隠されています窓の上に書かれていたので。 a)端末コマンドラインタイプ:tr -d ‘\r’ < input file name > output file name(出力ファイル名を新しい名前に変更 - >古いファイルを消去 - >出力ファイル名を元に戻す) b)端末コマンドラインタイプ:cat inputfile | col -b > outputfile(単に出力ファイルに新しい名前を名前を変更 - >古いファイル消去 - >元に戻し、その後再変更出力ファイル名を) c)は、端末のコマンドラインで入力し、DOS2UNIXをダウンロード:DOS2UNIX入力ファイル名

3 )ファイルを実行可能にします:端末コマンドラインタイプで : A)755名 又はBます。chmod)chmodの+ Xファイル名 又は のchmod A + X filenそれはほぼ同じだマックOSXのユーザーのために雨

:ステップのためにLinuxの

からのLinuxから

  1. ステップ1を繰り返し)
  2. ステップ2を繰り返し)3物事は変わる:

    apache.orgのwikiページに基づいて:https://wiki.apache.org/httpd/13PermissionDenied あなたはすべての実行可能ファイルを、/Usersルートディレクトリまで。

    あなたは次のことを行う必要があります。ターミナルコマンドラインで

    3):通常の介して、

    sudo webserver.py 
    

    と、入力ファイル:

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

    は今、あなたは経由でサーバーの.pyファイルを実行することができます

    python3 inputfile.py 
    

    今や、あなたはもう許可エラーで行くのは良いことではありません! Python 2を実行している場合、シバンやコマンドラインに必要な調整を加えることができます。

1

ubuntu Linuxから同じ問題が発生しました。 "Mike"の解決策に続いて修正を加えました。 複数のフォルダを持つ "/ usr"のchmodを実行する代わりに、拒否された実行可能ファイルを含むフォルダのアクセス許可を変更してください。 (静的なhtmlファイルを同じ場所にロードするときにサーバが正常に動作することを確認でき、スクリプトが実行されたときにのみエラーが表示されます)。

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

スクリプトにはアクセス権があるので、うまく動作するはずです。 -Rは、このフォルダ(およびサブフォルダがあればそれ)のすべてのファイルにアクセス許可を与えることに注意してください。

関連する問題