2014-12-11 7 views
8

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

Почему мой 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 
+3

Возможно, у Apache нет прав на использование вашего оборудования, что приводит к открытому сбою. Вы можете использовать su/sudo, чтобы попробовать команду в своей оболочке, запущенную как пользователь apache. В любом случае, вы должны предоставить некоторые права для вашего пользователя, чтобы их можно было сканировать, сделать то же самое для пользователя Apache или создать запись sudo для apache для 'scanimage'. – Aif

+0

что делает 'print_r ($ op)' say? Доступ запрещен? – blots

+2

@Carpetsmoker Я сказал, чтобы попытаться олицетворять пользователя Apache, чтобы попробовать и исправить права. Otherwize, grant sudo, но * только * для команды scanimage, что немаловажно. Это один из самых известных вариантов использования sudo (предоставление подмножества команд). – Aif

ответ

3

PHP не может получить доступ к сканеру USB, так как WWW-данные (пользователь, который запускает скрипт PHP) не входит в группу, к которой принадлежит USB-сканер. Добавьте пользователя, www-данные в группу, к которой принадлежит 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-сканера принадлежит lp. Причина $ USER в доступе к USB-сканеру состоит в том, что $ USER является членом группы lp, а www-data - нет. Это продемонстрировано путем ввода команды:

grep ^lp /etc/group 

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

lp:x:7:root,arya 

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

sudo usermod -a -G lp www-data 

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

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

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

sudo apache2ctl -k restart 

Затем тест, чтобы увидеть, если WWW-данные могут получить доступ к сканеру 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-сканеру и сканировать документ ...

Успех!

Смежные вопросы