Я хочу сканировать из моего сценария 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
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-сканерам и отсканировать документ …
Успех!
Других решений пока нет …