[+] PHP - exec z użyciem polecenia do skanowania

Konfiguracja serwerów, usług, itp.
bishoop
Posty: 11
Rejestracja: 08 czerwca 2013, 16:48

[+] PHP - exec z użyciem polecenia do skanowania

Post autor: bishoop »

Witam.
Mam taki problem. W sieci domowej piszę małą stronę, z poziomu której np. rodzice będą mogli bez problemu, jednym kliknięciem, zeskanować dany dokument i go pobrać.

Mam serwer pracujący na Debianie Wheezy. Uznałem, że pójdę na łatwiznę, i użyję funkcji exec() w tym kodzie. Polecenia takie jak echo i whoami działają bez problemu, jednak gdy chcę włączyć swój skrypt (skanowanie używając scanimage, convert z tiff na jpg, rm tiffa), który nie potrzebuje uprawnień roota, to nic się nie dzieje. Dosłownie nic, żadnych błędów itp.

Spróbowałem nawet użyć samego polecenia scanimage - bez rezultatów pozytywnych. Wszystko ma się zapisywać do tego samego katalogu, w którym jest ten plik php, a sama strona jest na oddzielnym wirtualnym hoście, na innym porcie, z włączonym SSL.

Co mam zrobić, by dla tego właśnie wirtualnego hosta miał możliwość używania skanera?
Jeszcze chciałbym w tej mini-stronie zamieścić restart CUPS-a, jednak z tym też będzie problem, gdyż do tego potrzebne są już uprawnienia roota.

Z góry dziękuję za pomoc,
Tomek
Awatar użytkownika
Bastian
Member
Posty: 1424
Rejestracja: 30 marca 2008, 16:09
Lokalizacja: Poznañ

Post autor: Bastian »

Jeżeli nie działa z CLI ręcznie, to w skrypcie z użyciem exec() tym bardziej nie będzie działać. Wklej jakiego polecenia używasz do zeskanowania pliku.
bishoop
Posty: 11
Rejestracja: 08 czerwca 2013, 16:48

Post autor: bishoop »

Kod: Zaznacz cały

#!/bin/bash
if [ "$2" = "bw" ]; then
scanimage -d pixma --resolution 300 --format tiff --mode Gray > /home/scanwww/$1.tiff
convert /home/scanwww/$1.tiff /home/scanwww/$1.jpg
rm /home/scanwww/$1.tiff
else
scanimage -d pixma --resolution 300 --format tiff --mode Color > /home/scanwww/$1.tiff
convert /home/scanwww/$1.tiff /home/scanwww/$1.jpg
rm /home/scanwww/$1.tiff
fi
Oczywiście próbowałem zrobić samym scanimage - bez efektu.
Próbowałem również stworzyć plik scan.php, w którym jest zgrabne:

Kod: Zaznacz cały

<?php
shell_exec("scan testowa bw");
?>
Wywołanie go przez ssh "php scan.php" daje oczekiwany rezultat drukowania. Jednak z poziomu strony używając shell_exec("php scan.php"); już nie.
Awatar użytkownika
Rafal_F
Moderator
Posty: 2350
Rejestracja: 29 sierpnia 2008, 16:45

Post autor: Rafal_F »

Sprawdź logi systemowe. Musi być jakiś ślad. Najczęściej w takich przypadkach problemem jest dostępem do urządzenia (uprawnienia).
bishoop
Posty: 11
Rejestracja: 08 czerwca 2013, 16:48

Post autor: bishoop »

Kod: Zaznacz cały

scanimage: open of device pixma failed: Access to resource has been denied
convert.im6: Cannot read TIFF header. `/home/scanwww/testowa.tiff' @ error/tiff.c/TIFFErrors/508.
convert.im6: no images defined `/home/scanwww/testowa.jpg' @ error/convert.c/ConvertImageCommand/3044.
Czyli to co myślałem - nie chce dać mi praw do skanera - się nie dziwię szczerze. Więc jak to uprawnienie mogę nadać virtualhostowi?
Awatar użytkownika
Rafal_F
Moderator
Posty: 2350
Rejestracja: 29 sierpnia 2008, 16:45

Post autor: Rafal_F »

Użytkownik który próbuje się dostać do skanera powinien należeć do grupy:

Kod: Zaznacz cały

scanner
bishoop
Posty: 11
Rejestracja: 08 czerwca 2013, 16:48

Post autor: bishoop »

Nic. Nawet po dodaniu www-data do root nie działa.
Awatar użytkownika
Bastian
Member
Posty: 1424
Rejestracja: 30 marca 2008, 16:09
Lokalizacja: Poznañ

Post autor: Bastian »

Skonfiguruj sobie sudo, tak aby ten konkretny skrypt działał jako root bez hasła

Kod: Zaznacz cały

www    ALL=(ALL) NOPASSWD: /usr/bin/php -f /home/skrypt.php
bishoop
Posty: 11
Rejestracja: 08 czerwca 2013, 16:48

Post autor: bishoop »

Bardzo mi się podoba rozwiązanie Bastiana - jest w miarę bezpieczne i łatwe, oraz rozwiązuje problem drugi z restartowaniem CUPS-a. Wiem, że dawanie jakiemukolwiek plikowi możliwości wykonania go przez stronę jako root jest niebezpieczne, ale to tylko jest na innym wirtualnym hoście w lokalnej sieci, z szyfrowanym połączeniem, więc nie powinno być źle.

Dziękuję jeszcze raz za pomoc.
Pozdrawiam, do zamknięcia.
ODPOWIEDZ