回答編集履歴

1

SUIDを利用する方法を追記

2019/03/25 06:05

投稿

dodox86
dodox86

スコア9183

test CHANGED
@@ -105,3 +105,111 @@
105
105
 
106
106
 
107
107
  この内容で当方のラズパイ1 modelBにてご提示のスクリプトとほぼ同等のものを使用し、GPIOでのLED 点灯/消灯ができました。質問者さんがご使用のラズパイ本体やraspbianは恐らくもっと新しいと思うので、異なるところもあるかもしれません。
108
+
109
+
110
+
111
+ ---
112
+
113
+ **追記しました:2019-03-25 15:04 **
114
+
115
+
116
+
117
+ 質問者さんのケースでは(恐らく)sudoerの問題だと思い、`visudo`コマンドでwww-dataユーザーをsudoさせるようにする回答をしましたが、別案のひとつとして`sudo`コマンドを使用せず、`/etc/sudoers`の修正もせずにroot権限で実行する方法をご紹介します。
118
+
119
+
120
+
121
+ linuxにはSUID(Set User ID)と言う特殊なアクセス権があって、実行ファイルにこのアクセス権をセットすることでその実行ファイルのオーナー(所有者)の権限で実行することができます。
122
+
123
+
124
+
125
+ [UNIX処方箋:- SUIDとは](https://www.itmedia.co.jp/enterprise/articles/0804/08/news014.html)
126
+
127
+
128
+
129
+ これを利用して、`/usr/bin/python3 /var/www/html/ledStart,py`を実行するC言語で作成したプログラムをPHPスクリプトから実行するようにすれば、`sudo`を使用しなくてもrootで`/usr/bin/python3`を実行し、GPIOを操作してLEDのON/OFFをすることができるようになります。
130
+
131
+
132
+
133
+ 具体的には以下のような`system` でプログラム内からpython3スクリプトを実行するC言語のプログラムを用意します。
134
+
135
+ ```C
136
+
137
+ #include <stdlib.h>
138
+
139
+
140
+
141
+ int main(int argc, char *argv[])
142
+
143
+ {
144
+
145
+ system("/usr/bin/python3 /var/www/html/ledStart.py");
146
+
147
+
148
+
149
+ return 0;
150
+
151
+ }
152
+
153
+ ```
154
+
155
+ これをコンパイル(ビルド)して実行ファイルを作り、その実行ファイルのオーナーをrootにして`chmod u+s 実行ファイル名`としてSUIDをセットします。
156
+
157
+ ```bash
158
+
159
+
160
+
161
+ pi@raspberrypi ~ $ gcc -Wall led_start.c -o led_start
162
+
163
+ pi@raspberrypi ~ $ ls -l led_start
164
+
165
+ -rwxr-xr-x 1 pi pi 5478 Mar 25 14:34 led_start
166
+
167
+
168
+
169
+ pi@raspberrypi ~ $ sudo chown root:root led_start
170
+
171
+ pi@raspberrypi ~ $ ls -l led_start
172
+
173
+ -rwxr-xr-x 1 root root 5478 Mar 25 14:34 led_start
174
+
175
+
176
+
177
+ pi@raspberrypi ~ $ sudo chmod u+s led_start; ls -l led_start
178
+
179
+ -rwsr-xr-x 1 root root 5478 Mar 25 14:34 led_start
180
+
181
+ pi@raspberrypi ~ $
182
+
183
+ ```
184
+
185
+
186
+
187
+ この実行ファイルが`/home/pi/led_start`だとして、PHPスクリプトの中から以下のように実行するとLEDが点灯します。www-dataユーザーでPHPスクリプトが実行されますが、`sudo`を使用しなくてもGPIOを制御できます。
188
+
189
+ ```PHP
190
+
191
+ # ...抜粋
192
+
193
+ if(isset($_POST["start"])) {
194
+
195
+ echo "LED Light ON";
196
+
197
+ #$path ='sudo python /var/www/html/ledStart.py';
198
+
199
+ #$path ='sudo /usr/bin/python3 /var/www/html/ledStart.py';
200
+
201
+
202
+
203
+ # SUID な/home/pi/led_startを実行する
204
+
205
+ $path ='/home/pi/led_start';
206
+
207
+ exec($path);
208
+
209
+ }
210
+
211
+ ```
212
+
213
+
214
+
215
+ 実験レベルではこんな使い方も有りかと思い、技術的な観点からご紹介させていただきました。