Как сканировать в переполнение стека

Я хочу сканировать из моего сценария PHP. Я использую Ubuntu 14.04 LTS, сканер Brother MFC-7840W (находится на работе) и Brother MFC-9840CDW (находится дома). Я могу сканировать из терминала и PHP, когда любой сканер подключен к компьютеру в качестве сетевого сканера. Однако я не могу сканировать из PHP, когда любой сканер подключен к компьютеру как USB-сканер (я все еще могу сканировать с терминала).

Почему мой PHP-скрипт не может получить доступ к USB-сканерам, но $ USER может?

Я начал этот вопрос на работе, но теперь я дома, поэтому я покажу свою попытку доступа к USB-сканеру Brother MFC-9840CDW из моего сценария PHP.

Вот фрагмент кода PHP, который я использую для сканирования:

if($_POST['ScanDevice'] == "brother3:net1;dev0") // if MFC-7840W network scanner
{$scanner = escapeshellarg($_POST['ScanDevice']);}
elseif($_POST['ScanDevice'] == "brother3:bus3;dev1") // if MFC-7840W USB scanner
{$scanner = escapeshellarg($_POST['ScanDevice']);}
elseif($_POST['ScanDevice'] == "brother3:net1;dev1") // if MFC-9840CDW network scanner
{$scanner = escapeshellarg($_POST['ScanDevice']);}
elseif($_POST['ScanDevice'] == "brother3:bus6;dev1") // if MFC-9840CDW USB scanner
{$scanner = escapeshellarg($_POST['ScanDevice']);}

$command = "scanimage -d {$scanner} --resolution {$_POST[ScanResolution]} --mode {$_POST[ScanColor]}  > {$filename}";

echo exec($command,$op,$result);
if($result > 0)
{die("ERROR");}

PHP-скрипт работает для сетевых сканеров, но не работает для USB-сканеров.
Если я выберу один из USB-сканеров (в настоящее время MFC-9840CDW) и запустлю сценарий, тогда файл /var/log/apache2/error.log показывает:

scanimage: open of device brother3:bus6;dev1 failed: Invalid argument

Возникает вопрос: работает ли устройство brother3:bus6;dev1 существовать?

Вот что scanimage --list-devices показывает при входе в терминал дома (где MFC-9840CDW):

[pixma] udp_command: No data received (select): timed out
[pixma] udp_command: No data received (select): timed out
[pixma] udp_command: No data received (select): timed out
[pixma] Cannot read scanner make & model: �+�&
device `brother3:net1;dev1' is a Brother MFC-7840W SCANNER
device `brother3:net1;dev0' is a Brother MFC-9840CDW Scanner-MFC-9840CDW
device `brother3:bus6;dev1' is a Brother MFC-9840CDW USB scanner

Чтобы продемонстрировать, что USB-сканер работает с $ USER, я ввожу в терминал следующую команду:

scanimage --test -d 'brother3:bus6;dev1'

который показывает:

scanimage: rounded value of br-x from 215.9 to 215.88
scanimage: rounded value of br-y from 355.6 to 355.567
scanimage: scanning image of size 1664x2776 pixels at 24 bits/pixel
scanimage: acquiring RGB frame, 8 bits/sample
scanimage: reading one scanline, 4992 bytes...  PASS
scanimage: reading one byte...      PASS
scanimage: stepped read, 2 bytes...     PASS
scanimage: stepped read, 4 bytes...     PASS

Чтобы продемонстрировать, что пользовательские www-данные не могут получить доступ к USB-сканерам, я ввожу в терминал следующую команду:

sudo -u www-data scanimage --test -d 'brother3:bus6;dev1'

который показывает:

scanimage: open of device brother3:bus6;dev1 failed: Invalid argument

8

Решение

PHP не может получить доступ к USB-сканеру, потому что www-data (пользователь, выполняющий скрипт PHP) не является членом группы, к которой принадлежит USB-сканер. Добавьте пользователя www-data в группу, к которой принадлежит USB-сканер.

Чтобы найти группу, к которой принадлежит USB-сканер, необходимо знать имя USB-сканера. Чтобы найти имя USB-сканера, введите команду:

lsusb -v

который показывает (среди других строк):

Bus 002 Device 007: ID 04f9:01cc Brother Industries, Ltd

Затем найдите группу, к которой принадлежит USB-сканер, введя команду:

ls -al /dev/bus/usb/002/007

который показывает:

crw-rw-r--+ 1 root lp 189, 134 Dec 12 22:30 /dev/bus/usb/002/007

Группа, к которой относится USB-сканер Л.П.. $ USER может получить доступ к USB-сканеру потому, что $ USER является членом Л.П. группа, www-данных нет. Это демонстрируется вводом команды:

grep ^lp /etc/group

который показывает:

lp:x:7:root,arya

Добавить пользователя, WWW-данные, группе, Л.П., введя команду:

sudo usermod -a -G lp www-data

Затем проверьте результат еще раз, введя grep ^lp /etc/group, который сейчас показывает:

lp:x:7:root,arya,www-data

Затем перезапустите apache, чтобы убедиться, что вышеуказанные действия зарегистрированы:

sudo apache2ctl -k restart

Затем проверьте, может ли www-data получить доступ к USB-сканеру через терминал:

sudo -u www-data scanimage --test -d 'brother3:bus6;dev1'

который показывает:

scanimage: rounded value of br-x from 215.9 to 215.88
scanimage: rounded value of br-y from 355.6 to 355.567
scanimage: scanning image of size 1664x2776 pixels at 24 bits/pixel
scanimage: acquiring RGB frame, 8 bits/sample
scanimage: reading one scanline, 4992 bytes...  PASS
scanimage: reading one byte...      PASS
scanimage: stepped read, 2 bytes...     PASS
scanimage: stepped read, 4 bytes...     PASS

Затем снова запустите оригинальный скрипт PHP, чтобы посмотреть, сможет ли он получить доступ к USB-сканерам и отсканировать документ …

Успех!

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]