- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我想从我的 PHP 脚本中扫描。我使用的是 Ubuntu 14.04 LTS、一台 Brother MFC-7840W 扫描仪(位于公司)和一台 Brother MFC-9840CDW(位于家中)。当任一扫描仪作为网络扫描仪连接到计算机时,我可以从终端和 PHP 进行扫描。但是,当任一扫描仪作为 USB 扫描仪连接到计算机时,我无法从 PHP 扫描(我仍然可以从终端扫描)。
为什么我的 PHP 脚本无法访问 USB 扫描仪但 $USER 可以?
我在工作时开始提出这个问题,但现在我在家,所以我将展示我尝试从我的 PHP 脚本访问 Brother MFC-9840CDW USB 扫描仪的尝试。
这是我用来扫描的 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
是否存在?
这是在家里的终端(MFC-9840CDW 所在的位置)输入时 scanimage --list-devices
显示的内容:
[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-data 无法访问 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 扫描仪所属的组是lp。 $USER 能够访问 USB 扫描仪的原因是因为 $USER 是 lp 组的成员,而 www-data 不是。这通过输入命令来演示:
grep ^lp /etc/group
显示:
lp:x:7:root,arya
通过输入以下命令将用户 www-data 添加到组 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-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 扫描仪并扫描文档...
成功!
关于php - 如何在 PHP 中扫描,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27434438/
我是一名优秀的程序员,十分优秀!