47437


Webから操作するリモコンカメラを作ろうとしています。

左右回転するモータドライバをGPIOでON、OFFさせる`motor_rotate.sh`をお手軽にbashで作り  
所有者：グループをroot:rootとし、SUIDを付与しました。

[code]

    -rwsr-xr-x 1 root  root   898 Aug  9 10:25 motor_rotate.sh
    
[/code]

このスクリプトをuser権限で実行できることを確認しました。

次に、`motor_rotate.sh`を呼び出すCGI、`cam_ctl.py`をPythonで作りました。

[code]

    -rwxr-xr-x 1 root root 190 Aug 10 07:08 cam_ctl.py
    
[/code]

しかし、ブラウザからこのCGIを実行すると以下のエラーになり、

[code]

    The server encountered an internal error or misconfiguration and was unable to complete your request.
    
[/code]

apache2/error.logは次のようになります。

[code]

    /home/user1/bin/motor_rotate.sh: 20: /home/user1/bin/motor_rotate.sh: cannot create /sys/class/gpio/export: Permission denied
    /home/user1/bin/motor_rotate.sh: 22: /home/user1/bin/motor_rotate.sh: cannot create /sys/class/gpio/gpio23/direction: Permission denied
    /home/user1/bin/motor_rotate.sh: 23: /home/user1/bin/motor_rotate.sh: cannot create /sys/class/gpio/gpio23/value: Permission denied
    /home/user1/bin/motor_rotate.sh: 34: /home/user1/bin/motor_rotate.sh: cannot create /sys/class/gpio/gpio23/value: Permission denied
    /home/user1/bin/motor_rotate.sh: 38: /home/user1/bin/motor_rotate.sh: cannot create /sys/class/gpio/gpio23/value: Permission denied
    [Fri Aug 10 07:41:09.833310 2018] [cgid:error] [pid 18429:tid 2985292848] [client 192.168.12.150:50335]
     End of script output before headers: cam_ctl.py, referer: http://192.168.12.103:80/
    
[/code]

どのように対処したらよいでしょうか？  
そもそも、CGIの実行者は誰になっているのでしょうか？  
よろしくお願いいたします。

ちなみに、`motor_rotate.sh`はこんな感じです（略してますので、行番号は違います）

[code]

    #!/bin/sh
    SWITCH1="/sys/class/gpio/gpio23"
    
    if [ ! -e $SWITCH1 ]; then
        echo 23 > /sys/class/gpio/export
        sleepenh 0.1 > /dev/null
        echo out > $SWITCH1/direction
        echo 0 > $SWITCH1/value
    fi
    
    echo 1 > $SWITCH1/value
    sleepenh 0.5 > /dev/null
    echo 0 > $SWITCH1/value
    
[/code]

追伸、AMD64版Debinaでテストしてみたんですが  
-rwxr-xr-x 1 user1 user1 73 8月 10 17:01 test.py  
-rwsr-xr-x 1 root root 30 8月 10 17:00 test.sh

test.sh

[code]

    #! /bin/sh
    echo "Hello World"
    
[/code]

test.sh

[code]

    #! /usr/bin/python
    import subprocess
    res = subprocess.call("./test.sh")
    
[/code]

user1@debian:~$ ./test.py  
Hello World

このテストでは、問題いなく動くんです、何か間違ってるのかな


CC BY-SA 4.0
2018-08-10T03:55:07.773
47402
2018-08-11T01:58:54.027
2018-08-10T08:27:02.550
15090
15090
question
apache gpio cgi
CGIからのパーミッション


CGIを実行する際は基本的にApacheのユーザ権限になりますが、OSやディストリビューションの種類によって微妙に異なりますので、`httpd`プロセスがどのユーザ権限で動いているかを確認してみてください(例えばLinuxでは`apache`ユーザなことが多いです)。

ユーザが確認できたら、CGI実行時にエラーとなっているファイルが作成(書き込み)ができるよう、パーミッションを適切に設定してあげてください。

[code]

    /sys/class/gpio/export
    /sys/class/gpio/gpio23/direction
    /sys/class/gpio/gpio23/value
    
[/code]


CC BY-SA 4.0
2018-08-10T05:53:49.840
47406
2018-08-10T05:53:49.840
3060
47402
answer


shスクリプトはsetuid指定が効かないと記憶しています。そのため、期待通りに動作しないと予想します。

＃shの挙動か、OS(Linux)の挙動かまでは覚えていませんが、セキュリティ対策のためです。

別のスクリプトで作成しsetuidを指定するか、スクリプトを呼び出すnative
executableを作成し、それをsetuidするかすれば、期待通り動作させられるようになると思います。

＃追記の動作実験では、test.shはrootユーザでは動作していないのでは、と予想します。


CC BY-SA 4.0
2018-08-11T01:58:54.027
47437
2018-08-11T01:58:54.027
20098
47402
answer