min117の日記

初期desireもち。趣味Mac,メインFedora,仕事xp。

fedora Apache(httpd)で cgi-bin が動かない場合の対処(permissionエラー)

 

Apache から直接 pythonスクリプトを実行したいが、どうしてもエラーになる。

You don't have permission to access /test.py on this server.

f:id:min117:20170702120200p:plain

環境は以下。

fedora 20

Apache/2.4.10(Fedora

ーーー

解決手順

① まずログをみる

$ sudo -s

# ls -sharlt /var/log/httpd/ | grep error | tail -n 5

f:id:min117:20170702115627p:plain

# vim virtual.host-error_log

f:id:min117:20170702115837p:plain

エラーがわかった。

because search permissions are missing on a component of the path

cgi-bin がどこにあるかを conf ファイルで確認する

$ sudo -s

# cd /etc/http/conf/

# vim httpd.conf

f:id:min117:20170702120600p:plain

cgi-bin という文字列で検索をかける。

f:id:min117:20170702120714p:plain

↑ このconfの行数でいうと

・756行目にScriptAlias

 ブラウザから http://test.com/cgi-bin/ と表記したときに、/var/www/cgi-bin にアクセスできるようにする(ショートカットを作る)機能。

・770行目のDirectory

 cgi実行権限を決める場所。Options +ExecCGI Require all granted が無いと pythonスクリプトが動かない。

なお、Apache は Ver2.4から「Require all granted」という表記になったらしい。Ver2.2だと表記方法が違う。

komeiy.hatenablog.com

cgi-bin フォルダの権限が「drwxr-xr-x」になっているか確認

f:id:min117:20170702123047p:plain

④ 実行するスクリプトファイル権限が「-rwxr-xr-x」になっているか確認

f:id:min117:20170702123226p:plain

cgi-bin フォルダ所有者httpd を実行しているユーザーになっているか確認

# ps aux | grep httpd

f:id:min117:20170702124348p:plain

実行ユーザーは「www-data」であることがわかった。③と④から、cgi-binフォルダも、test.pyスクリプトも、どちらも所有者が www-data なので、問題なし。

python スクリプトにヘッダ行があるか確認する

python スクリプト「 Content-type: text/html¥n 」の記述があるか確認する。これがないと(①の手順でログを見たときに)malformed header from script」というエラーが出てしまう。

http://www.futomi.com/lecture/apache/cgier

# vim test.py

f:id:min117:20170702122602p:plain

Apache を再起動する

ここまで設定したら、Apache を再起動する。

$ sudo -s

# systemctl restart httpd.service

f:id:min117:20170702122354p:plain

ーーー

ここまでの設定で cgi-bin は動くと思うが、VirtualHost を立てている(複数のWEBアドレスを使って運用している)ときはさらに /etc/httpd/conf.d/vhost.conf も見る。

$ sudo -s

# vim /etc/httpd/conf.d/vhost.conf

f:id:min117:20170702121623p:plain

f:id:min117:20170702121840p:plain

↑ このconfの Directory の設定を、上記の 756行目と770行目と同じにしないといけない。

設定を変えたので、もう一度 Apache を再起動する。

$ sudo -s

# systemctl restart httpd.service

f:id:min117:20170702122354p:plain

ブラウザ からアクセスして、動くか試してみる。

f:id:min117:20170702122739p:plain

 無事動いた。

ーーー

2017/7/16 追記

python3 から ヘッダーをprintしないとうまくいかないことがあることもわかった。

fedora の場合、エラーは /etc/httpd/logs/ の中にある。ログファイル名は環境によって違うので読み替える。

$ sudo -s

# vim /etc/httpd/logs/virtual.host-hoge-error_log

f:id:min117:20170716224039p:plain

実際に出たエラーごとに見てみる。

ーーー

エラー① python3 スクリプト内に日本語文字列が含まれている

# vim /etc/httpd/logs/virtual.host-hoge-error_log

f:id:min117:20170716224422p:plain

python3 の print文に、日本語文字列を含んでいたためにエラーになった。「u753b…」のような部分で、日本語がうまく処理できていないとわかる。pythonスクリプトを見てみる。

# vim twAllDL.py

f:id:min117:20170716224706p:plain

確かに日本語を出力しているが、処理するための記述(ヘッダでのutf8宣言)には問題なさそう。 ちゃんと # -*- coding:utf-8 -*- と書いているし。

f:id:min117:20170716224751p:plain

原因調査は面倒なので、日本語のところを英語にして対応しちゃう。

f:id:min117:20170716224849p:plain

これで エラー①は消えた。

ーーー

エラー② ヘッダ出力する print文を書いてない

# vim /etc/httpd/logs/virtual.host-hoge-error_log

f:id:min117:20170716225036p:plain

Bad header というエラーになるようだ。python3ソースを見てみる。

# vim twAllDL.py

f:id:min117:20170716225458p:plain

うむ。確かにヘッダのprint文が無い。print("Content-type: text/html¥n") を書き足してみる。 ← python3 なのでprint文にはカッコがつくので注意。

f:id:min117:20170716225649p:plain

ーーー

2017/7/17 追記

・ヘッダに注意

 #!/usr/bin/python3 ← python2か3か

・日本語をutf-8でラップする

 import io

 sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')

print文の前行に必ず Content-type ヘッダ出力が必要

 http://ura22.sakura.ne.jp/pycgi/practice.html

f:id:min117:20170717065440p:plain

 ↑ 改行コードは ¥n だけでいけた。

f:id:min117:20170717073656p:plain

コマンドまとめ

(www-data は httpd の実行ユーザ)

$ sudo -s

# cd /var/www/

# sudo chmod www-data:www-data cgi-bin

# sudo chmod 755 cgi-bin

# cd cgi-bin

# sudo chmod www-data:www-data twAllDL.py

# sudo chmod 755 twAllDL.py

# vim twAllDL.py

print("Content-type: text/html¥n")

# systemctl restart httpd.service

# vim /etc/httpd/logs/virtual.host-hoge-error_log

ーーー

注意点まとめ

PythonスクリプトPython2か、3か(3なら、print文にカッコがついているはず)

Pythonスクリプト字下げは半角スペースかタブかどちらかで統一されているか

Pythonスクリプトにヘッダーを書いているか

 print("Content-type: text/html¥n")

 または

 print('Content-type: text/html; charset=UTF-8\r\n')

ーーー

参考(Python3 スクリプト

Python3で作る簡素なCGI

yxshipg.appspot.com

ーーー

参考(cgi-bin配下のhtml)

/cgi-bin/ディレクトリ配下の画像やHTMLが表示できない

f:id:min117:20170717075919p:plain

 

 

 

Python 3 で twitter の画像を一括取得する(お気に入り ❤️ を付けたツイートの画像の一括ダウンロード)

 

このサイトのコードそのままで動いた。最高すぎる。

prpr.hatenablog.jp

ーーー

スクリプトのファイル名は twAllDL.py(tweetAllDownLoad.py)にする。

$ vim twAllDL.py

f:id:min117:20170701204544p:plain

f:id:min117:20170701204936p:plain

f:id:min117:20170701205024p:plain

実行してみる。

$ python3 twAllDL.py

f:id:min117:20170701205319p:plain

ダーっと画像がダウンロードされる。最高だ。

f:id:min117:20170701205558p:plain

保存された画像を、自作の画像ビューアで見てみる。

f:id:min117:20170701211029p:plain

キレーに一括ダウンロードされてる。ホント素晴らしい。今回は fedora でやってみたが、RaspberryPi でも(Python 3 が入っていれば)うまくいく。

bash if文の中で正規表現を使う

 

RaspberryPi や fedorabash にて

あるフォルダの中の全てのファイルを調べて、ファイル名の頭が数字3桁のものだけ表示する」をやりたい。

ーーー

まず「あるフォルダの中の全てのファイルを調べる」のは、超簡単。毎日やっている。

$ for i in *; do echo "$i"; done

ーーー

これに、if文をつけて「ファイル名の頭が数字3桁だったら表示する」の条件をつける。

$ for i in *; do if [[ "$i" =~ ^[1-9]{3} ]]; then echo "$i"; fi; done

(全角のカッコ [ ]は実際は半角なんだけど、このブログの制限で全角表示にしてる)

f:id:min117:20170701202840p:plain

bash の if文の中の正規表現=~ で使える。

MacbookAir Python 3 をインストールする(OSX Sierra)

 

Mac へのPython 3のインストールは以前の記事で行ったが、もっと簡単な方法がないか試す。以前の記事では pyenv をインストールした。

http://min117.hatenablog.com/entry/2017/01/17/233852

今回は純粋に pip だけで python3 をインストールする(BeautifulSoup を使いたい)。参照はこのへん。

ottan.xyz

Sierra への対応を明示した記事がなかなか無くて困るが、この記事は明示しているので。

ーーー

$ sudo easy_install pip

f:id:min117:20170701170603p:plain

f:id:min117:20170701170516p:plain

RaspberryPi 音が出ないときは sudo vim /boot/config.txt に dtparam=autio=on を記述して解決

 

RaspberryPi(初代)の cron に radiko の起動スクリプトを設定して、毎日決まった時間にテレビのスピーカーからラジオが流れるようにしたつもりなのに、なぜか音が鳴らない

ーーー

RaspberryPi 3 のほうはうまくいっているので、比較して調べたら、音声デバイスを認識してなかった。初代のほうの /boot/config.txt を編集する。

$ sudo vim /boot/config.txt

f:id:min117:20170701093651p:plain

dtparam=audio=on

を記載して再起動したら、無事ラジオを聴けた。/boot/config.txt のデフォルトではこの記述があるんだけど。以前 MPEG の記述を入れる編集をした時に、まちがって消したのかもしれない。

RaspberryPi cronが効かない → 時刻設定を見直して解決( sudo timedatectl set-timezone Asia/Tokyo && ntpdate ntp.jst.mfeed.ad.jp)

 

前記事に続いて、cronがうまく動かないときの対処

min117.hatenablog.com

ーーー

Raspberry Pi 初代 で、どうにもcronがうまくいかない。crontabの設定も問題ないのに。正しく動いている Pi 3 と比べてみたら時刻の設定がおかしかった

(誤)Pi 初代 UTCになってしまっている

f:id:min117:20170630012532p:plain

(正)Pi 3 JSTになっている

f:id:min117:20170630012539p:plain

時刻が狂っているほう(Pi 初代)で以下コマンドを実行して解決。

$ sudo -s

# timedatectl set-timezone Asia/Tokyo

# ntpdate ntp.jst.mfeed.ad.jp

ーーー

こんなエラーになるときは

ntpdate: command not found

# apt-get -y install ntpdate

f:id:min117:20170630013544p:plain

 

 

RaspberryPi 3 で radiko Premium をテレビで聞く(録音ではなく、再生する)

radiko Premium 録音は 前記事でできた。

min117.hatenablog.com

今回は、録音ではなく、再生したい。radikoプレミアムを、再生して、テレビで聴きたい

以下の方法でうまくいった(2017/6/26 時点)

 

 

 

事前に必要なものをインストールしておく。とくに swftools は必須。

$ sudo apt-get install rtmpdump swftools libxml2-utils ffmpeg libavcodec-extra-53

ffmpeglibavcodec-extra-53 のエラーで失敗してしまう時は、それだけ除いてインストールする。

$ sudo apt-get install rtmpdump swftools libxml2-utils libavcodec-extra-53

ーーー

まずは、元ソースを落とす。

http://kyoshiaki.sakura.ne.jp/osx/Sample/rec_radiko2_2.zip

落としたソースを解凍して、中にある rec_radiko.sh を以下の通り修正する(ソース全文は記事末尾に)。

ーーー

修正点①

修正前(左) → 修正後(右)

f:id:min117:20170625235654p:plain

244行目: --stop ${DURATION} の後ろパイプ  |  をつける

245行目: --flv "/tmp/${channel}_${date}" コメントアウトする

245行目: ↑ のあったところに mplayer -  をつける

ーーー

修正点②

f:id:min117:20170626000354p:plain

248行目以降はコメントアウトする(録音させるコードだから不要)

ーーー

ファイル名を変更して、再生してみる。

$ mv rec_radiko2.sh play_radiko2.sh

$ ./play_radiko2.sh K-MIX 10 test@gmail.com password

書式:./play_radiko2.sh チャンネル名 再生時間(分) ラジコプレミアムの登録ID(メアド) そのパスワード

ーーー

再生に失敗するときの確認点

swftools をインストールしたか

  sudo apt-get install swftools

チャンネル名 再生時間(分)を逆の順で記述してしまっていないか。

ーーー

うまく再生できた。これで全国のラジオをテレビで聞ける。

f:id:min117:20170626000850p:plain

RaspberryPi 起動時に再生するように、/etc/rc.local に記述する。コツは、再生スクリプトを /home/pi/Desktop に置くこと。ネットワークドライブ上に置いてしまうと、起動時に(マウントより先に再生に行こうとしてしまうので)失敗する

$ sudo vim /etc/rc.local

f:id:min117:20170626004309p:plain

 

 

ソース全文

f:id:min117:20170625235209p:plain

f:id:min117:20170625235222p:plain

f:id:min117:20170625235234p:plain

f:id:min117:20170625235249p:plain