Я хочу сканировать с моего 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
Возможно, у Apache нет прав на использование вашего оборудования, что приводит к открытому сбою. Вы можете использовать su/sudo, чтобы попробовать команду в своей оболочке, запущенную как пользователь apache. В любом случае, вы должны предоставить некоторые права для вашего пользователя, чтобы их можно было сканировать, сделать то же самое для пользователя Apache или создать запись sudo для apache для 'scanimage'. – Aif
что делает 'print_r ($ op)' say? Доступ запрещен? – blots
@Carpetsmoker Я сказал, чтобы попытаться олицетворять пользователя Apache, чтобы попробовать и исправить права. Otherwize, grant sudo, но * только * для команды scanimage, что немаловажно. Это один из самых известных вариантов использования sudo (предоставление подмножества команд). – Aif