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

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

ただいまの
回答率

90.34%

  • PHP

    21394questions

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

  • Raspberry Pi

    905questions

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

  • bash

    698questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 2,347

ryou-jr2fyj

score 2

前提・実現したいこと

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にあった同名のコードを参考に作りました。

#!/bin/bash

if [ $# -eq 1 ]; then
  channel=$1
else
  echo "usage : $0 channel_name"
  echo "         channel_name list"
  echo "           TBS Radio: TBS"
  echo "           Nippon Cultural Broadcasting: QRR"
  echo "           Nippon Broadcasting: LFR"
  echo "           Radio Nippon: JORF"
  echo "           Inter FM: INT"
  echo "           Tokyo FM: FMT"
  echo "           J-WAVE: FMJ"
  echo "           bayfm 78.0MHz: BAYFM78"
  echo "           NACK5: NACK5"
  echo "           FM yokohama 84.7: YFM"
  exit 1
fi

#
# parameter setting
#
pid=$$
date=`date '+%Y-%m-%d-%H:%M'`
playerurl=http://radiko.jp/apps/js/flash/myplayer-release.swf
outdir="/home/pi/radiko/"
playerfile="${outdir}/player.swf"
keyfile="${outdir}/authkey.png"
auth1_fms_file="${outdir}/auth1_fms_${pid}"
auth2_fms_file="${outdir}/auth2_fms_${pid}"
channel_file="${outdir}/${channel}.xml"
mkdir -p ${outdir}

#
# get player
#
if [ ! -f $playerfile ]; then
  wget -q -O $playerfile $playerurl

  if [ $? -ne 0 ]; then
    echo "failed to get player"
    exit 1
  fi
fi

#
# get keydata (need swftool)
#
if [ ! -f $keyfile ]; then
  swfextract -b 12 $playerfile -o $keyfile

  if [ ! -f $keyfile ]; then
    echo "failed to get keydata"
    exit 1
  fi
fi

if [ -f ${auth1_fms_file} ]; then
  rm -f ${auth1_fms_file}
fi

#
# access auth1_fms
#
wget -q \
     --header="pragma: no-cache" \
     --header="X-Radiko-App: pc_ts" \
     --header="X-Radiko-App-Version: 4.0.0" \
     --header="X-Radiko-User: test-stream" \
     --header="X-Radiko-Device: pc" \
     --post-data='\r\n' \
     --no-check-certificate \
     --save-headers \
     -O ${auth1_fms_file} \
     https://radiko.jp/v2/api/auth1_fms

if [ $? -ne 0 ]; then
  echo "failed auth1 process"
  exit 1
fi

#
# get partial key
#
authtoken=`perl -ne 'print $1 if(/x-radiko-authtoken: ([\w-]+)/i)' ${auth1_fms_file}`
offset=`perl -ne 'print $1 if(/x-radiko-keyoffset: (\d+)/i)' ${auth1_fms_file}`
length=`perl -ne 'print $1 if(/x-radiko-keylength: (\d+)/i)' ${auth1_fms_file}`

partialkey=`dd if=$keyfile bs=1 skip=${offset} count=${length} 2> /dev/null | base64`

echo "authtoken: ${authtoken} \noffset: ${offset} length: ${length} \npartialkey: $partialkey"

rm -f ${auth1_fms_file}

if [ -f ${auth2_fms_file} ]; then
  rm -f ${auth2_fms_file}
fi

#
# access auth2_fms
#
wget -q \
     --header="pragma: no-cache" \
     --header="X-Radiko-App: pc_ts" \
     --header="X-Radiko-App-Version: 4.0.0" \
     --header="X-Radiko-User: test-stream" \
     --header="X-Radiko-Device: pc" \
     --header="X-Radiko-AuthToken: ${authtoken}" \
     --header="X-Radiko-PartialKey: ${partialkey}" \
     --post-data='\r\n' \
     --no-check-certificate \
     -O ${auth2_fms_file} \
     https://radiko.jp/v2/api/auth2_fms

if [ $? -ne 0 -o ! -f ${auth2_fms_file} ]; then
  echo "failed auth2 process"
  exit 1
fi

echo "authentication success"

areaid=`perl -ne 'print $1 if(/^([^,]+),/i)' ${auth2_fms_file}`
echo "areaid: $areaid"

rm -f ${auth2_fms_file}

#
# get stream-url
#

if [ -f ${channel_file} ]; then
  rm -f ${channel_file}
fi

wget -q "http://radiko.jp/v2/station/stream/${channel}.xml" -O ${channel_file}

stream_url=`echo "cat /url/item[1]/text()" | xmllint --shell ${channel_file} | tail -2 | head -1`
url_parts=(`echo ${stream_url} | perl -pe 's!^(.*)://(.*?)/(.*)/(.*?)$/!$1://$2 $3 $4!'`)

rm -f ${channel_file}

#
# rtmpdump and mplayer
#
rtmpdump -v \
         -r ${url_parts[0]} \
         --app ${url_parts[1]} \
         --playpath ${url_parts[2]} \
         -W $playerurl \
         -C S:"" -C S:"" -C S:"" -C S:$authtoken \
         --live\
         | mplayer -

php

<?php

if(isset($_GET['id'])){

        $id = $_GET['id'];
        if($id=="stop"){
                exec("killall mplayer");
        }else if($id=="FMT"){
                exec("killall mplayer");
                exec("play_radiko.sh FMT", $e);
        }else if($id=="FMJ"){
                exec("killall mplayer");
                exec("play_radiko.sh FMJ", $e);
        }else if($id=="BAYFM78"){
                exec("killall mplayer");
                exec("play_radiko.sh BAYFM78", $e);
        }else if($id=="NACK5"){
                exec("killall mplayer");
                exec("play_radiko.sh NACK5", $e);
        }else if($id=="INT"){
                exec("killall mplayer");
                exec("play_radiko.sh INT", $e);
        }else if($id=="YFM"){
                exec("killall mplayer");
                exec("play_radiko.sh YFM", $e);
        }else if($id=="RN1"){
                exec("killall mplayer");
                exec("play_radiko.sh RN1", $e);
        }else if($id=="RN2"){
                exec("killall mplayer");
                exec("play_radiko.sh RN2", $e);
        }else if($id=="TBS"){
                exec("killall mplayer");
                exec("play_radiko.sh TBS", $e);
        }else if($id=="JORF"){
                exec("killall mplayer");
                exec("play_radiko.sh JORF", $e);
        }else if($id=="QRR"){
                exec("killall mplayer");
                exec("play_radiko.sh QRR", $e);
        }else if($id=="LFR"){
                exec("killall mplayer");
                exec("play_radiko.sh LFR", $e);
        }else if($id=="HOUSOU-DAIGAKU"){
                exec("killall mplayer");
                exec("play_radiko.sh HOUSOU-DAIGAKU", $e);
        }else {
                exec("killall mplayer");
        }
}
?>

試したこと

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

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

Raspberry PiはPi3のModel Bを使用しています。また、PHPのバージョンは5.6.29-0+deb8u1です。Apacheのバージョンは2.4.10 (Raspbian)です。

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/01/14 22:06

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

    キャンセル

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

  • PHP

    21394questions

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

  • Raspberry Pi

    905questions

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

  • bash

    698questions

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