apacheでpythonをcgiとして実行してIOerrerになる。
解決済
回答 2
投稿
- 評価
- クリップ 0
- VIEW 3,299
前提・実現したいこと
サイトにフォーム入力したファイルをpythonで受け取りファイルの内容を出力して保存するシステムを作っています。
出力保存ができません。
発生している問題・エラーメッセージ
エラーメッセージ
IOErrer
該当のソースコード
<html>
<head>
<meta http-equiv=content-type content="text/html; charset=UTF-8">
</head>
<body>
<form method="POST" action="/cgi-bin/test.py">
name <input type="text" name="name"><br>
text <textarea name="comment"></textarea><br>
<input type="submit" value="submit">
</form>
</body>
</html>
該当のソースコード
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import cgi
import cgitb
import os
import sys
import codecs
import Cookie
sys.stdout = codecs.getwriter('utf_8')(sys.stdout)
cgitb.enable()
print ('Content-type: text/html; charset=UTF-8')
print ("\r\n\r\n")
#テスト中のテスト
print(u'書けた?')
f = open('/var/www/cgi-bin/test.txt','a')
f.write('pepepepe')
f.close()
試したこと
wwwディレクトリ以下のファイルとディレクトリのパーミッションを全て777にしてみました。
補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
コメントで解決したので、コメントの内容を回答として記載します。
@Y.H> 挙動的にはselinuxが有効になってそうなんですが。
@Y.H> /etc/selinux/config で SELINUX=disabled と設定しシステムを再起動後、getenforce コマンドがDisabled を返すことを確認しましたか?@uprose.noguchi> ありがとうございます。システムを再起動して無事ファイル出力することができました。
やはりselinuxの設定でしたか。
あと、tomohiro_obara さんの回答にもある通り、 /var/www/cgi-bin はファイルを書込みする場所ではないのでプログラムからのみ読み書きするファイルの置き場所は別のディレクトリにしましょう。
apacheの実行ユーザー:グループがapache:apacheだとした場合
sudo mkdir /var/www/data
sudo chmod 755 /var/www/data
sudo chown apahce:apache /var/www/data
と apacheユーザーでのみ書き込み可能なディレクトリを作成し、このディレクトリに書き込みましょう。
/var/www/html , /var/www/cgi-bin は 644,755に戻しておきましょう。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
例えば、以下のような一連のコマンドを実行するとどうなると思いますか?
mkdir -p temp/tmp
chmod 777 temp/tmp
chmod 400 temp
touch temp/tmp/test.txt
許可がなくてエラーになると思います。
これは、temp/tmpディレクトリのパーミションが[drwxrwxrwx]なっていてもです。
通常、/var/www/cgi-binは、データを書き込むような場所と想定されておりません。
データを書き込む場合、別の場所方が良いかと思います。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.09%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
Y.H.
2017/01/19 17:07
OSは何ですか? Redhat/CentOSなどであれば SELinuxの設定は適切ですか?SElinuxを無効にしてどうなりますか?
t_obara
2017/01/19 17:19
まず、基本動作を確認するために、コンソールでコアロジックの確認、その上で、webサーバのログを確認しては?
uprose.noguchi
2017/01/19 17:19
OSはCentOSです。SElinux無効にしてみましたが改善しません。またsshで直接pythonを実行するとファイル出力できますが、サイトからだとできません。
t_obara
2017/01/19 17:24
/var/www/cgi-bin のディレクトリのパーミション、権限の確認、openのエラーチェック
uprose.noguchi
2017/01/19 17:33
<type 'exceptions.IOError'>: [Errno 13] Permission denied: '/var/www/cgi-bin/test.txt' args = (13, 'Permission denied') errno = 13 filename = '/var/www/cgi-bin/test.txt' message = '' strerror = 'Permission denied'エラー内容は上記のようになっています。
uprose.noguchi
2017/01/19 17:34 編集
/var/www/cgi-binのディレクトリのパーミッションは777になっています。drwxrwxrwx. 3 root root 4096 1月 19 08:29 cgi-bin
t_obara
2017/01/19 17:36
上記の結果を見てご自身で問題点を把握できませんか?
uprose.noguchi
2017/01/19 17:40
test.txtのパーミッションも以下のようになっているのでパーミッションに問題はないかと思ったのですが、 -rwxrwxrwx. 1 root root 0 1月 19 08:16 test.txt
Y.H.
2017/01/19 17:58
挙動的にはselinuxが有効になってそうなんですが。/etc/selinux/config で SELINUX=disabled と設定しシステムを再起動後、getenforce コマンドが Disabled を返すことを確認しましたか?
uprose.noguchi
2017/01/19 18:47
ありがとうございます。システムを再起動して無事ファイル出力することができました。teratail初心者なのですがY.H.様をどのように評価すればよろしいでしょうか?
Y.H.
2017/01/19 19:04
回答を作成しました。