質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.54%

  • Python

    11267questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • CentOS

    3078questions

    CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

  • Apache

    2072questions

    Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

  • Webサーバー

    497questions

    Webサーバーとは、HTTPリクエストに応じて、クライアントに情報を提供するシステムです。

apacheでpythonをcgiとして実行してIOerrerになる。

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,507

前提・実現したいこと

サイトにフォーム入力したファイルを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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 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

    回答を作成しました。

    キャンセル

回答 2

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に戻しておきましょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/19 19:10

    ご丁寧にありがとうございます。そのように作業をします。大変助かりました。感謝します!!ありがとうございます!

    キャンセル

  • 2017/01/20 00:04

    ちなみに、selinuxをdisableで一般に公開するサーバを運用するのはお勧めしません。

    キャンセル

+1

例えば、以下のような一連のコマンドを実行するとどうなると思いますか?
mkdir -p temp/tmp
chmod 777 temp/tmp
chmod 400 temp
touch temp/tmp/test.txt

許可がなくてエラーになると思います。
これは、temp/tmpディレクトリのパーミションが[drwxrwxrwx]なっていてもです。
通常、/var/www/cgi-binは、データを書き込むような場所と想定されておりません。
データを書き込む場合、別の場所方が良いかと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/19 18:21

    /var/www/cgi-bin へのデータ書き込みについては同意です。

    > wwwディレクトリ以下のファイルとディレクトリのパーミッションを全て777にしてみました。
    chmod -R 777 /var/www を実行済、selinux disable での現象発生との事なので原因に興味津々です。

    キャンセル

  • 2017/01/19 18:48

    ご回答ありがとうございました。selinuxを無効にしてシステムを再起動したら無事ファイル出力することができました。

    キャンセル

  • 2017/01/19 19:06

    /var/www/cgi-binとは別のディレクトリ内に書き込むようにします。とても詳しい回答をありがとうございます。

    キャンセル

同じタグがついた質問を見る

  • Python

    11267questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • CentOS

    3078questions

    CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

  • Apache

    2072questions

    Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

  • Webサーバー

    497questions

    Webサーバーとは、HTTPリクエストに応じて、クライアントに情報を提供するシステムです。