Kali Linux 添加并共享惠普打印机

拉古纳

第一次在Linux上使用惠普打印机(HP Laser Jet 1020),在此记录下过程,以防后人踩坑。

背景

因为是第一次在 Kali Linux 上使用 HP Laser Jet 1020 打印机,本来以为很容易,结果最终卡在hplip-3.20.2-plugin.run这个插件上,没有它,打印机就无法正常使用。

目前最新的驱动版本号为3.20.2,所以以下驱动的名称里的版本号默认为此。

安装

因为 Kali Linux 不在惠普支持的系统列表里,即使 Kali 是基于 Debian 的二次开发。所以当我们从惠普官网下载并安装最新的驱动时,会因系统缺失好多库而无法安装。
这里我们从 Kali 的官方仓库里下载驱动。

1
:~$ sudo apt-get install hplip printer-driver-hpcups cups

CUPS 是苹果为 Mac OS 开发的一款打印服务,自带 Web 管理界面。

此时打印驱动并没有安装完毕,还需要使用hd-setup程序来下载hplip-3.20.2-plugin.run这款插件。
因为程序默认下载时是从 Linux 的官方仓库进行下载,而 Kali 的官方仓库无此插件,所以这里我们需要使用终端运行此命令来获取此文件在惠普网站的下载地址。

1
:~$ hp-setup

最终安装失败,但在终端上会留下类似https://developers.hp.com/sites/default/files/hplip-3.20.2-plugin.run这样的地址,这时我们需要手动去下载此文件。

1
2
:~$ wget https://developers.hp.com/sites/default/files/hplip-3.20.2-plugin.run
:~$ wget https://developers.hp.com/sites/default/files/hplip-3.20.2-plugin.run.asc

或者从我的共享里下载,[189-cloud][toc_web_189], 访问码: dl1s

hplip-3.20.2-plugin.run.asc惠普hplip-3.20.2-plugin.run的签名文件,没有它,在安装此插件时会提示非法插件。

再次运行hp-setup,安装过程中时手动选择我们刚刚下载的插件。

至此,惠普打印机的驱动的才算安装完毕。

添加打印机

使用图形界面

  • 方法一:在控制面板中搜索打印机设置,在里面添加即可。此方法和下面的使用CUPS效果相同。
  • 方法二:安装hplip-gui来运行惠普打印机的图形管理界面。
    1
    :~$ sudo apt-get install hplip-gui
    注意:使用hplip-gui添加的打印机,只能在hplip-gui程序里使用。

使用 CUPS

  • 首先打开 cups.service
    1
    2
    3
    :~$ sudo systemctl start cups.service
    :~$ sudo netstat -anpl | grep cups
    tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 140391/cupsd
  • 可以看到cupsd已打开本地的631端口,所以我们直接在本机上使用浏览器打开即可。
    1
    :~$ firefox 127.0.0.1:631
    Web Manage Page
  • Administration:此菜单是管理员页面,可以添加/查找/管理/配置 打印机。注意:此页面默认的用户名root,密码为本机的root密码。
  • Jobs:此菜单显示打印列表,如 已完成/未完成 的打印任务。
  • Printers:此菜单显示当前CUPS已添加的打印机。

此时,本地的惠普打印机已经可以正常使用了。

使用CUPS和使用控制面板来添加打印机效果是一样的。

配置文件

CUPS 的配置位于/etc/cups/cupsd.conf
可以在 Web管理 的Administrator菜单下修改配置文件,也使用vim直接在终端里进行修改。

cupsd.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 默认监听地址与端口
Listen 127.0.0.1:631
...
# Web 管理页的访问限制策略,/ 为根目录
# 下面规则为只允许 127.0.0.1 访问 Web管理页
<Location />
Order deny,allow
Deny From All
Allow From 127.0.0.1
</Location>

# Web 管理页的 Administrator 菜单访问规则
# 只允许 127.0.0.1 访问此菜单
<Location /admin>
Order allow,deny
Allow From 127.0.0.1
Deny From All
</Location>

cups 共享打印机

CUPS的监听地址改为0.0.0.0即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
:~$ vim /etc/cups/cupsd.conf
...
Listen 0.0.0.0:631
...
# 允许 127.0.0.1 和 192.168.1.0/24 网段访问 Web管理页
<Location />
Order deny,allow
Deny From All
Allow From 127.0.0.1
Allow From 192.168.1.*
</Location>

# Administration 菜单只允许指定 IP 访问
<Location /admin>
Order allow,deny
Allow From 127.0.0.1
Allow From 192.168.1.2
Deny From All
</Location>
:~$ sudo systemctl restart cupsd.service

此时,在安装有CUPS的 Linux/Mac PC 或 iPhone/Android 7+ 下,直接搜索打印机即可。如果没有搜索到,可以手动选择ipps网络协议,输入打印机所在PC的IP地址即可,如https://192.168.1.2:631/即可。

Android 自 7.0 开始内置打印服务,如果版本低于 7.0,请自行安装打印服务。

Samba 共享打印机

HP Laser Jet 1020 打印机不支持网络,所以这里使用Samba来共享此打印机。
为什么要使用Samba来进行共享?因为它与windows兼容性好,如果只是 Mac/Linux/iPhone/Android 间共享打印机,直接使用CUPS即可。

验证Samba是否支持CUPS

1
2
3
4
:~$ smbd -b | grep "HAVE_CUPS"
HAVE_CUPS_CUPS_H
HAVE_CUPS_LANGUAGE_H
HAVE_CUPS

如果没有显示HAVE_CUPS

  • 编译Samba时使用了--disable-cups参数
  • Samba的依赖库没有安装完整,查看Samba 依赖库

CUPS 配置

首先在CUPS里安装本地的打印机

  1. 使用浏览器打开CUPS的管理员页面,如:https://127.0.0.1:631/admin
  2. 选择添加打印机
  3. 选择打印机的路径,因为是本地USB口的打印机,所以这里选择hp:/usb/HP_LaserJet_1020?serial=xxxxxxx
  4. 输入打印机的名称。注意:此名称会在smb.conf里使用。
  5. 选择打印机的厂家与型号,即对应的驱动。
  6. 保存

smb.conf 配置

分为匿名共享与密码验证共享。

1. 打开 spoolssd 服务

spoolssd服务集成在smbd中,为的是加速Samba的打印速度。如果不开此服务,当使用Samba打印长文档时,打印机会出现很长时间无响应状态,此时Samba在接收和创建需要打印的文档缓存。
而开了spoolssd服务,Samba会开启多线程模式,主线程只做控制其它子线程,在其它子线程中创建打印文档的缓存。这样可以在打印途中暂停或取消打印。

开启 spoolssd 服务:

  • 编辑smb.conf[global]
    1
    2
    3
    4
    [global]
    ...
    rpc_server:spoolss = external
    rpc_daemon:spoolssd = fork
  • 重启Samba
    1
    :~$ sudo smbcontrol all reload-config
  • 查看smbd子进程
    1
    2
    3
    4
    5
    6
    7
    :~$ ps axf
    ...
    30903 smbd
    30912 \_ smbd
    30913 \_ smbd
    30914 \_ smbd
    30915 \_ smbd

2. 开启 CUPS 的打印支持

  • smb.conf[global]下,加入printing参数
    1
    2
    3
    [global]
    ...
    printing = cups
  • 修改smb.conf的默认[printers]
    1
    2
    3
    [printers]
    path = /var/spool/samba/
    printable = yes
  • 创建path中的缓存目录
    1
    2
    :~$ mkdir -p /var/spool/samba/
    :~$ chmod 777 /var/spool/samba/
  • 重启Samba服务
    1
    :~$ sudo smbcontrol all reload-config

3. 共享打印机

匿名且自动共享打印机

  • 修改smb.conf[printers]选项
    1
    2
    3
    4
    5
    6
    7
    8
    [printers]
    comment = All Printers
    browseable = yes
    path = /var/spool/samba
    printable = yes
    guest ok = yes
    read only = yes
    create mask = 0700
  • 重启smbd
    1
    :~$ sudo smbcontrol all reload-config

此时,同网段的所有客户端都可以使用打印机了。每当Samba所在的主机添加其它打印机时会自动进行匿名共享。

加密共享打印机

  • 禁止自动共享打印机
  • 修改smb.conf[global]参数
    1
    2
    3
    [global]
    ...
    load printers = no
  • 重启Samba
    1
    :~$ sudo smbcontrol all reload-config
  • 手动共享打印机
  • smb.conf中添加打印机
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [hp1020]
    path = /var/spool/samba/
    printable = yes
    printer name = HP-LaserJet-1020
    user client driver = no
    guest ok = no
    writable = no
    write list = root
    valid users = @samba

    printer name即我们之前在CUPS中添加的打印机时输入的名称,忘记了可以去CUPS的Web管理页查看。
  • 重启Samba
    1
    :~$ sudo smbcontrol all reload-config

至此,我们可以在同网段的其它客户端使用密码来登录并使用打印机了。