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

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

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

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Q&A

解決済

1回答

9769閲覧

Permission deniedにより、phpでexecを用いたコマンドが実行ができない

ryou-jr2fyj

総合スコア8

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

0グッド

0クリップ

投稿2017/01/12 13:42

###前提・実現したいこと
Raspberry Piを用いてWeb上でコントロールしてradikoを聞くことを実現したいです。そのため、ホームページを作ってApache上からPHPで動くようにしましたが、radikoの音声がRaspberry piから再生されませんでした。

###発生している問題・エラーメッセージ
/var/log/apache2/error.logを調べたら以下のエラーメッセージが書き込まれていました。

mplayer: no process found /home/pi/radiko//auth1_fms_1595: Permission denied

###該当のソースコード
シェルスクリプト(play_radiko.sh)
GitHubにあった同名のコードを参考に作りました。

bash

1#!/bin/bash 2 3if [ $# -eq 1 ]; then 4 channel=$1 5else 6 echo "usage : $0 channel_name" 7 echo " channel_name list" 8 echo " TBS Radio: TBS" 9 echo " Nippon Cultural Broadcasting: QRR" 10 echo " Nippon Broadcasting: LFR" 11 echo " Radio Nippon: JORF" 12 echo " Inter FM: INT" 13 echo " Tokyo FM: FMT" 14 echo " J-WAVE: FMJ" 15 echo " bayfm 78.0MHz: BAYFM78" 16 echo " NACK5: NACK5" 17 echo " FM yokohama 84.7: YFM" 18 exit 1 19fi 20 21# 22# parameter setting 23# 24pid=$$ 25date=`date '+%Y-%m-%d-%H:%M'` 26playerurl=http://radiko.jp/apps/js/flash/myplayer-release.swf 27outdir="/home/pi/radiko/" 28playerfile="${outdir}/player.swf" 29keyfile="${outdir}/authkey.png" 30auth1_fms_file="${outdir}/auth1_fms_${pid}" 31auth2_fms_file="${outdir}/auth2_fms_${pid}" 32channel_file="${outdir}/${channel}.xml" 33mkdir -p ${outdir} 34 35# 36# get player 37# 38if [ ! -f $playerfile ]; then 39 wget -q -O $playerfile $playerurl 40 41 if [ $? -ne 0 ]; then 42 echo "failed to get player" 43 exit 1 44 fi 45fi 46 47# 48# get keydata (need swftool) 49# 50if [ ! -f $keyfile ]; then 51 swfextract -b 12 $playerfile -o $keyfile 52 53 if [ ! -f $keyfile ]; then 54 echo "failed to get keydata" 55 exit 1 56 fi 57fi 58 59if [ -f ${auth1_fms_file} ]; then 60 rm -f ${auth1_fms_file} 61fi 62 63# 64# access auth1_fms 65# 66wget -q \ 67 --header="pragma: no-cache" \ 68 --header="X-Radiko-App: pc_ts" \ 69 --header="X-Radiko-App-Version: 4.0.0" \ 70 --header="X-Radiko-User: test-stream" \ 71 --header="X-Radiko-Device: pc" \ 72 --post-data='\r\n' \ 73 --no-check-certificate \ 74 --save-headers \ 75 -O ${auth1_fms_file} \ 76 https://radiko.jp/v2/api/auth1_fms 77 78if [ $? -ne 0 ]; then 79 echo "failed auth1 process" 80 exit 1 81fi 82 83# 84# get partial key 85# 86authtoken=`perl -ne 'print $1 if(/x-radiko-authtoken: ([\w-]+)/i)' ${auth1_fms_file}` 87offset=`perl -ne 'print $1 if(/x-radiko-keyoffset: (\d+)/i)' ${auth1_fms_file}` 88length=`perl -ne 'print $1 if(/x-radiko-keylength: (\d+)/i)' ${auth1_fms_file}` 89 90partialkey=`dd if=$keyfile bs=1 skip=${offset} count=${length} 2> /dev/null | base64` 91 92echo "authtoken: ${authtoken} \noffset: ${offset} length: ${length} \npartialkey: $partialkey" 93 94rm -f ${auth1_fms_file} 95 96if [ -f ${auth2_fms_file} ]; then 97 rm -f ${auth2_fms_file} 98fi 99 100# 101# access auth2_fms 102# 103wget -q \ 104 --header="pragma: no-cache" \ 105 --header="X-Radiko-App: pc_ts" \ 106 --header="X-Radiko-App-Version: 4.0.0" \ 107 --header="X-Radiko-User: test-stream" \ 108 --header="X-Radiko-Device: pc" \ 109 --header="X-Radiko-AuthToken: ${authtoken}" \ 110 --header="X-Radiko-PartialKey: ${partialkey}" \ 111 --post-data='\r\n' \ 112 --no-check-certificate \ 113 -O ${auth2_fms_file} \ 114 https://radiko.jp/v2/api/auth2_fms 115 116if [ $? -ne 0 -o ! -f ${auth2_fms_file} ]; then 117 echo "failed auth2 process" 118 exit 1 119fi 120 121echo "authentication success" 122 123areaid=`perl -ne 'print $1 if(/^([^,]+),/i)' ${auth2_fms_file}` 124echo "areaid: $areaid" 125 126rm -f ${auth2_fms_file} 127 128# 129# get stream-url 130# 131 132if [ -f ${channel_file} ]; then 133 rm -f ${channel_file} 134fi 135 136wget -q "http://radiko.jp/v2/station/stream/${channel}.xml" -O ${channel_file} 137 138stream_url=`echo "cat /url/item[1]/text()" | xmllint --shell ${channel_file} | tail -2 | head -1` 139url_parts=(`echo ${stream_url} | perl -pe 's!^(.*)://(.*?)/(.*)/(.*?)$/!$1://$2 $3 $4!'`) 140 141rm -f ${channel_file} 142 143# 144# rtmpdump and mplayer 145# 146rtmpdump -v \ 147 -r ${url_parts[0]} \ 148 --app ${url_parts[1]} \ 149 --playpath ${url_parts[2]} \ 150 -W $playerurl \ 151 -C S:"" -C S:"" -C S:"" -C S:$authtoken \ 152 --live\ 153 | mplayer -

php

php

1<?php 2 3if(isset($_GET['id'])){ 4 5 $id = $_GET['id']; 6 if($id=="stop"){ 7 exec("killall mplayer"); 8 }else if($id=="FMT"){ 9 exec("killall mplayer"); 10 exec("play_radiko.sh FMT", $e); 11 }else if($id=="FMJ"){ 12 exec("killall mplayer"); 13 exec("play_radiko.sh FMJ", $e); 14 }else if($id=="BAYFM78"){ 15 exec("killall mplayer"); 16 exec("play_radiko.sh BAYFM78", $e); 17 }else if($id=="NACK5"){ 18 exec("killall mplayer"); 19 exec("play_radiko.sh NACK5", $e); 20 }else if($id=="INT"){ 21 exec("killall mplayer"); 22 exec("play_radiko.sh INT", $e); 23 }else if($id=="YFM"){ 24 exec("killall mplayer"); 25 exec("play_radiko.sh YFM", $e); 26 }else if($id=="RN1"){ 27 exec("killall mplayer"); 28 exec("play_radiko.sh RN1", $e); 29 }else if($id=="RN2"){ 30 exec("killall mplayer"); 31 exec("play_radiko.sh RN2", $e); 32 }else if($id=="TBS"){ 33 exec("killall mplayer"); 34 exec("play_radiko.sh TBS", $e); 35 }else if($id=="JORF"){ 36 exec("killall mplayer"); 37 exec("play_radiko.sh JORF", $e); 38 }else if($id=="QRR"){ 39 exec("killall mplayer"); 40 exec("play_radiko.sh QRR", $e); 41 }else if($id=="LFR"){ 42 exec("killall mplayer"); 43 exec("play_radiko.sh LFR", $e); 44 }else if($id=="HOUSOU-DAIGAKU"){ 45 exec("killall mplayer"); 46 exec("play_radiko.sh HOUSOU-DAIGAKU", $e); 47 }else { 48 exec("killall mplayer"); 49 } 50} 51?>

###試したこと
コンソール上では、エラーがでることなくplay_radiko.shは実行できました。
また、エラーで表示されたファイルが一時ファイルであるためかlsコマンドを使用しても表示されないためどのように許可すればいいか分かりません。どなたかご教授お願いします。

###補足情報(言語/FW/ツール等のバージョンなど)
Raspberry PiはPi3のModel Bを使用しています。また、PHPのバージョンは5.6.29-0+deb8u1です。Apacheのバージョンは2.4.10 (Raspbian)です。

teratailにて質問するのも初心者なので、表現や質問の仕方に不足している点もあると思います。質問の仕方や表現も含めアドバイスをいただけると幸いです。よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Raspberry Piは分かりませんが、Permission Denied であれば権限がないのではないでしょうか。
/home/pi 配下は piユーザの権限になっていてapacheユーザ等で動作しているApacheからは/home/pi/radiko/ へアクセスできないということはないでしょうか。
また、実行ファイル実行権限はつけていますでしょうか。

投稿2017/01/12 14:35

nakasho_dev

総合スコア2655

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

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

ryou-jr2fyj

2017/01/14 13:06

回答ありがとうございます。実行ファイルには実行権限はつけてありました。アドバイスの通り/home/pi配下はpiユーザの権限であることからApacheユーザであるwww-dataからはアクセスできなかったようです。visudoコマンドを用いてphpで実行するコマンドだけにroot権限を与えたら動作しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問