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

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

新規登録して質問してみよう
ただいま回答率
85.48%
CentOS

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

Apache

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

Webサーバー

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

Python

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

Q&A

解決済

2回答

5055閲覧

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

uprose.noguchi

総合スコア13

CentOS

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

Apache

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

Webサーバー

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

Python

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

0グッド

0クリップ

投稿2017/01/19 08:03

###前提・実現したいこと
サイトにフォーム入力したファイルをpythonで受け取りファイルの内容を出力して保存するシステムを作っています。
出力保存ができません。

###発生している問題・エラーメッセージ

エラーメッセージ IOErrer

###該当のソースコード

html

1<html> 2<head> 3<meta http-equiv=content-type content="text/html; charset=UTF-8"> 4</head> 5<body> 6<form method="POST" action="/cgi-bin/test.py"> 7name <input type="text" name="name"><br> 8text <textarea name="comment"></textarea><br> 9<input type="submit" value="submit"> 10</form> 11</body> 12</html>

###該当のソースコード

python

1#!/usr/bin/env python 2# -*- coding: utf-8 -*- 3 4import cgi 5import cgitb 6import os 7import sys 8import codecs 9import Cookie 10 11sys.stdout = codecs.getwriter('utf_8')(sys.stdout) 12 13cgitb.enable() 14 15print ('Content-type: text/html; charset=UTF-8') 16print ("\r\n\r\n") 17#テスト中のテスト 18print(u'書けた?') 19f = open('/var/www/cgi-bin/test.txt','a') 20f.write('pepepepe') 21f.close()

###試したこと
wwwディレクトリ以下のファイルとディレクトリのパーミッションを全て777にしてみました。

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Y.H.

2017/01/19 08:07

OSは何ですか? Redhat/CentOSなどであれば SELinuxの設定は適切ですか?SElinuxを無効にしてどうなりますか?
t_obara

2017/01/19 08:19

まず、基本動作を確認するために、コンソールでコアロジックの確認、その上で、webサーバのログを確認しては?
uprose.noguchi

2017/01/19 08:19

OSはCentOSです。SElinux無効にしてみましたが改善しません。またsshで直接pythonを実行するとファイル出力できますが、サイトからだとできません。
t_obara

2017/01/19 08:24

/var/www/cgi-bin のディレクトリのパーミション、権限の確認、openのエラーチェック
uprose.noguchi

2017/01/19 08: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 08:35 編集

/var/www/cgi-binのディレクトリのパーミッションは777になっています。drwxrwxrwx. 3 root root 4096 1月 19 08:29 cgi-bin
t_obara

2017/01/19 08:36

上記の結果を見てご自身で問題点を把握できませんか?
uprose.noguchi

2017/01/19 08:40

test.txtのパーミッションも以下のようになっているのでパーミッションに問題はないかと思ったのですが、 -rwxrwxrwx. 1 root root 0 1月 19 08:16 test.txt
Y.H.

2017/01/19 08:58

挙動的にはselinuxが有効になってそうなんですが。/etc/selinux/config で SELINUX=disabled と設定しシステムを再起動後、getenforce コマンドが Disabled を返すことを確認しましたか?
uprose.noguchi

2017/01/19 09:47

ありがとうございます。システムを再起動して無事ファイル出力することができました。teratail初心者なのですがY.H.様をどのように評価すればよろしいでしょうか?
Y.H.

2017/01/19 10:04

回答を作成しました。
guest

回答2

0

ベストアンサー

コメントで解決したので、コメントの内容を回答として記載します。

@Y.H> 挙動的にはselinuxが有効になってそうなんですが。
@Y.H> /etc/selinux/config で SELINUX=disabled と設定しシステムを再起動後、getenforce コマンドがDisabled を返すことを確認しましたか?

@uprose.noguchi> ありがとうございます。システムを再起動して無事ファイル出力することができました。

やはりselinuxの設定でしたか。

あと、tomohiro_obara さんの回答にもある通り、 /var/www/cgi-bin はファイルを書込みする場所ではないのでプログラムからのみ読み書きするファイルの置き場所は別のディレクトリにしましょう。

apacheの実行ユーザー:グループがapache:apacheだとした場合

bash

1sudo mkdir /var/www/data 2sudo chmod 755 /var/www/data 3sudo chown apahce:apache /var/www/data 4

と apacheユーザーでのみ書き込み可能なディレクトリを作成し、このディレクトリに書き込みましょう。
/var/www/html , /var/www/cgi-bin は 644,755に戻しておきましょう。

投稿2017/01/19 10:03

Y.H.

総合スコア7914

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

uprose.noguchi

2017/01/19 10:10

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

2017/01/19 15:04

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

0

例えば、以下のような一連のコマンドを実行するとどうなると思いますか?
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 08:53

t_obara

総合スコア5488

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Y.H.

2017/01/19 09:21

/var/www/cgi-bin へのデータ書き込みについては同意です。 > wwwディレクトリ以下のファイルとディレクトリのパーミッションを全て777にしてみました。 chmod -R 777 /var/www を実行済、selinux disable での現象発生との事なので原因に興味津々です。
uprose.noguchi

2017/01/19 09:48

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

2017/01/19 10:06

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問