「PIC AVR 工作室」サイトの日記的なブログです。
サイトに挙げなかった他愛ないことを日記的に書き残してます。
PIC AVR 工作室 ブログ
CALENDAR
2013年3月
日
月
火
水
木
金
土
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
前月
翌月
Entry Archive
2025年01月
2024年12月
2024年11月
2024年10月
2024年09月
2024年08月
2024年07月
2024年06月
2024年05月
2024年04月
2024年03月
2024年02月
2024年01月
2023年12月
2023年11月
2023年10月
2023年09月
2023年08月
2023年07月
2023年06月
2023年05月
2023年04月
2023年03月
2023年02月
2023年01月
2022年12月
2022年11月
2022年10月
2022年09月
2022年08月
2022年07月
2022年06月
2022年05月
2022年04月
2022年03月
2022年02月
2022年01月
2021年12月
2021年11月
2021年10月
2021年09月
2021年08月
2021年07月
2021年06月
2021年05月
2021年04月
2021年03月
2021年02月
2021年01月
2020年12月
2020年11月
2020年10月
2020年09月
2020年08月
2020年07月
2020年06月
2020年05月
2020年04月
2020年03月
2020年02月
2020年01月
2019年12月
2019年11月
2019年10月
2019年09月
2019年08月
2019年07月
2019年06月
2019年05月
2019年04月
2019年03月
2019年02月
2019年01月
2018年12月
2018年11月
2018年10月
2018年09月
2018年08月
2018年07月
2018年06月
2018年05月
2018年04月
2018年03月
2018年02月
2018年01月
2017年12月
2017年11月
2017年10月
2017年09月
2017年08月
2017年07月
2017年06月
2017年05月
2017年04月
2017年03月
2017年02月
2017年01月
2016年12月
2016年11月
2016年10月
2016年09月
2016年08月
2016年07月
2016年06月
2016年05月
2016年04月
2016年03月
2016年02月
2016年01月
2015年12月
2015年11月
2015年10月
2015年09月
2015年08月
2015年07月
2015年06月
2015年05月
2015年04月
2015年03月
2015年02月
2015年01月
2014年12月
2014年11月
2014年10月
2014年09月
2014年08月
2014年07月
2014年06月
2014年05月
2014年04月
2014年03月
2014年02月
2014年01月
2013年12月
2013年11月
2013年10月
2013年09月
2013年08月
2013年07月
2013年06月
2013年05月
2013年04月
2013年03月
2013年02月
2013年01月
2012年12月
2012年11月
2012年10月
2012年09月
2012年08月
2012年07月
2012年06月
2012年05月
2012年04月
2012年03月
2012年02月
2012年01月
2011年12月
2011年11月
2011年10月
2011年09月
2011年08月
2011年07月
2011年06月
2011年05月
2011年04月
2011年03月
2011年02月
2011年01月
2010年12月
2010年11月
2010年10月
2010年09月
2010年08月
2010年07月
2010年06月
2010年05月
2010年04月
2010年03月
2010年02月
2010年01月
2009年12月
2009年11月
2009年10月
2009年09月
2009年08月
2009年07月
2009年06月
2009年05月
2009年04月
2009年03月
2009年02月
2009年01月
2008年12月
2008年11月
2008年10月
2008年09月
2008年08月
2008年07月
2008年06月
2008年05月
2008年04月
2008年03月
2008年02月
2008年01月
2007年12月
2007年11月
Recent Entry
スーファミのジャンク品を買った
初詣いってきた
振り返り2024
こないだのロボット
ロボット行ってきた
追加で中古ソフト買ってきた
こないだのロボット
ロボット行ってきた
レトロコンボ2グリーンを9Vで試す
SFCのラインヘッドネジ
Recent Comment
nekosan/
JYRUSSやってきたメモ
フルタニアン/
JYRUSSやってきたメモ
nekosan/
JYRUSSやってきたメモ
フルタニアン/
JYRUSSやってきたメモ
nekosan/
こないだのロボット
フルタニアン/
こないだのロボット
nekosan/
こないだのロボット
フルタニアン/
こないだのロボット
nekosan0/
レジ袋ホルダーを考える
フルタニアン/
レジ袋ホルダーを考える
Category
ノンジャンル
(2865)
PIC
(47)
AVR
(341)
Arduino
(446)
Raspberry Pi
(194)
mbed
(41)
ARM
(30)
ESP32
(15)
Android
(10)
OPアンプ
(125)
VHDL
(57)
PSoC
(4)
アナログ回路
(110)
クルマ
(127)
rails
(51)
本
(42)
導電塗料
(3)
Fritzing
(41)
Edison
(2)
FFT
(34)
写真
(158)
MIDI
(24)
その他日記
(11)
Python
(57)
3Dプリンタ
(124)
Bookmark
最初はgoo
goo blogトップ
スタッフブログ
My Profile
ブログID
nekosan0
自己紹介
Search
このブログ内で
ウェブ全て
さらに回避策を探す
Raspberry Pi
/
2013年03月09日
昨日、ようやく回避策が見つかったと思って、ホッと
していたのもつかの間…。
いまひとつ、回避が難しい事態に遭遇。
今やっているのは、Raspbianの初期設定に外付けの
パッケージを極力使わず、設定周りも基本的に
弄らず、使用する言語はPython縛りで、CGI経由で
GPIOをオン/オフするって言う実験。
何が難しい事態かというと…
とりあえず昨日までのあらすじ。
apacheを標準でインストールしておいて、/cgi-bin/
に放り込んだPythonのCGIにPCのブラウザからアクセス
して、GPIOに繋いだ3つのLEDを個別にオン/オフする
って言うスクリプトはどう書いたらいいのかで四苦八苦。
Raspberry Pi上のPythonで、押されたボタンをCGIで
入力してhtmlに編集して表示するのも簡単。GPIOに
ぶら下がったLEDをオン/オフするのも簡単。この場合
のGPIOを弄りに行く処理は、標準で入っているGPIO
ライブラリを使用。(ファイル入出力でもいいんだけど)
問題は、GPIOはroot権限じゃないとアクセスできない
ってこと。
apache配下で起動されるCGIのスクリプトは、root
じゃないユーザで実行されるので、CGIは直接GPIO
叩くことが出来ない。
なので、rootを使わなくてもGPIOを叩きにいける
ライブラリか何かをインストールするか、モロモロ
設定を弄って無理やりアクセス出来るようにしちゃうか、
そんな対応が必要。
セキュリティー上、後者はいやだし、出来るだけ
何らかのパッケージには偏りたくないので前者も
避けたい。
とりあえず最初に考えたのは、set user idを
スクリプトのファイル属性につけちゃう方法。
(実行時のユーザが実行者じゃなく、ファイル
所有者…例えばrootで実行できるので)
どうかな?と思ってやってみると…どうやらPython
に限らず、Raspbianでもスクリプトは全般的に
set user idが無効になっているみたい。
まぁ、セキュリティーを考えれば、スクリプトの類を
自動的にroot権限で実行させるのは危険極まりない
のでI(特にCGIなんて)、まぁどのディストリビューション
でも今は実行できないようになってるんだろうな。
Raspberry Piだって一人前のlinux機なんだし。
んで、次に考えたのが、I/O部分だけをCで書くこと。
これならchmodでset user id付けられるし。
…これやっちゃえば簡単なんだけど、色々アレな
事情があるのでひとまず他の方法を探す。
アブナイとされている
ジャイルブレイク
system
のコマンド実行をあえて試す。CGIのスクリプト
から外部のスクリプトをsudoで実行させて、
そっちでGPIOの処理を済ますっていう作戦。
当然ながら、スクリプトインジェクション対策
とかそれなりにとった上でのこと。
やってみる…
とりあえず、CGI用のスクリプトをコマンドライン
から実行かけてみると、無事GPIOを叩くスクリプト
がrootで実行されて、LEDを点灯/消灯できること
がわかった。
(実は、パスワード不要なユーザでもsudoをキック
する際に、ttyからの起動じゃない場合はパスワード
入力に失敗してしまうなので、パスワードを標準入力
から食わせる必要があると判って、一苦労)
http://brown.ap.teacup.com/nekosan0/1871.html
昨日はここまで。
んで、今日はその続きから。
いざ、apacheのCGI用ディレクトリ/cgi-bin/に
CGIスクリプトを放り込んでみると…なぜか動かない。
sudoでスイッチさせてるところが上手く行ってない
みたいだなぁ…
コマンドラインではちゃんと動くのに、なんで
CGIで動かすと上手く行かないんだろう?
理由が分らずしばし考え込む。エラーメッセージを
眺める。
…判った。apacheから実行されるスクリプトの
ユーザは「pi」じゃなくて「www-data」だから、
piのパスワードでsudoが掛からないんだな。
うーーーーーーん。suEXECか?Apacheの設定を
色々弄り倒すか? …とか考えたんだけど、
色々調べてたら、Pythonに簡易型のCGIサーバ機能
が入ってて、2~3行のスクリプトを書けば簡単な
CGIサーバが起動できるって判ったので、そっちを
試す。
http://yife.hateblo.jp/entry/2012/01/25/054210
↑ここ参考。
おぉ。なんと簡単な! たった2行。
んで、さんざんApache用に作ってきたCGIスクリプト
をこっちに持ってきてみる。
…ちょっとばかりアレコレあったけど…
とりあえず希望してた機能は一通り盛り込めた。
(return value = の右に何も書いてないのは、
エラーが何も帰ってきてないって印)
機能的には3つのボタンのどれかを押すと、対応する
LEDが1個だけ光るっていうだけの代物。
あぁ、こんな簡単なことなのに、意外に苦戦したな。
CGI本体部分じゃなく、GPIOがroot権限周りだけ
っていう1点で。
セキュリティーホールを作りまくってもいいなら
もっと簡単なのかも知れないけど、いくらなんでも
ある程度は安全にしておかないと、やっぱアブナイ
からなぁ。Raspbianもそういう設計になっている
みたいだし。
でもまぁ、systemのコマンド実行自体が大きな地雷
なんだけどな。
この後、どうするかな…
コイツの穴をふさぐのか、大人しくwiringPiを使うのか、
https://projects.drogon.net/raspberry-pi/wiringpi/
それともwebIOPiか、
http://code.google.com/p/webiopi/
http://www.raspberrypi.org/phpBB3/viewtopic.php?t=15257
もしくは自分でc言語の外部単機能プログラム作って、
chmodでset user idつけるか。
いずれにしても、Pythonのスクリプト中に文字列で
パスワード書いたままにしておくのはイヤだな。
せめて、他の見えにくいディレクトリにテキスト
ファイルで置いておいて、そいつを読み出して使う
方がいいよな。そこだけは必須だな。
なんかの拍子にエラーが起こって、エラー行を
ブラウザに表示しちゃったりしたら怖いからな。
…っていうか、エラーが起きた途端に表示しちゃう
のが今の仕様だからな。
まぁ、何か1個方法が見つかれば、あとは少しずつ
いいものに乗り換えていけばいいか。ってことで
今日はここまで。
コメント (
4
)
goo ブログ
ブログの作成・編集
gooおすすめリンク
おすすめブログ
【あなたはどっち?】クリームシチューをご飯にかける or かけない
@goo_blog
【お知らせ】
ブログを読むだけ。毎月の訪問日数に応じてポイント進呈
【あなたはどっち?】クリームシチューをご飯にかける or かけない
訪問者数に応じてdポイント最大1,000pt当たる!
dポイントが当たる!無料『毎日くじ』