linux lpd命令

Linux lpd命令是行式打印机守护进程(Line Printer Daemon),是传统BSD打印系统的核心组件。

提示: 在现代Linux系统中,CUPS(Common UNIX Printing System)已逐渐取代lpd,但lpd在一些老系统或特定场景中仍有使用。

语法格式

lpd [选项] [端口]

常用选项

选项 说明
-l 启用日志记录,将调试信息记录到syslog
-D 在前台运行,不进入后台守护进程模式
-h 显示帮助信息
-V 显示版本信息
-s 不从inetd启动(standalone模式)

配置文件和目录

文件/目录 说明
/etc/printcap 打印机配置文件(BSD风格)
/etc/hosts.lpd 允许访问打印服务的主机列表
/var/spool/lpd/ 打印队列和作业目录
/usr/sbin/lpd lpd守护进程二进制文件
/etc/inetd.conf inetd配置文件(如果从inetd启动)

使用示例

示例1:启动lpd守护进程

# 在前台启动lpd,启用日志记录
sudo lpd -l -D

# 作为后台守护进程启动
sudo lpd

# 检查lpd是否正在运行
ps aux | grep lpd
netstat -tlnp | grep 515

示例2:配置printcap文件

# /etc/printcap示例配置
# 定义本地打印机lp
lp:\
    :sd=/var/spool/lpd/lp:\
    :mx#0:\
    :sh:\
    :lp=/dev/lp0:\
    :if=/var/spool/lpd/lp/filter:

# 定义网络打印机
netprinter:\
    :sd=/var/spool/lpd/netprinter:\
    :rm=printserver.example.com:\
    :rp=raw:\
    :mx#0:\
    :sh:

示例3:管理打印队列

# 查看打印队列状态
lpq -P lp

# 提交打印作业
lpr -P lp document.txt

# 删除打印作业
lprm -P lp 作业号

# 检查打印机状态
lpstat -p

示例4:配置访问控制

# 编辑/etc/hosts.lpd,允许特定主机
echo "192.168.1.100" >> /etc/hosts.lpd
echo "192.168.1.0/24" >> /etc/hosts.lpd
echo "*.example.com" >> /etc/hosts.lpd

# 重启lpd服务使配置生效
sudo systemctl restart lpd
# 或者
sudo /etc/init.d/lpd restart

示例5:设置打印过滤器

# 创建简单的打印过滤器脚本
cat > /var/spool/lpd/lp/filter << 'EOF'
#!/bin/bash
# 简单的文本过滤器
# 添加页眉和页脚
echo "===== 开始打印 ====="
cat
echo ""
echo "===== 打印结束 ====="
EOF

# 设置可执行权限
chmod +x /var/spool/lpd/lp/filter

示例6:从inetd启动lpd

# /etc/inetd.conf配置示例
printer stream tcp nowait root /usr/sbin/tcpd /usr/sbin/lpd

# 重启inetd服务
sudo systemctl restart inetd
# 或者
sudo killall -HUP inetd

示例7:调试lpd服务

# 在前台运行lpd并查看调试信息
sudo lpd -l -D

# 查看系统日志中的lpd消息
tail -f /var/log/messages | grep lpd
# 或
journalctl -f -u lpd

# 检查打印队列目录
ls -la /var/spool/lpd/
ls -la /var/spool/lpd/lp/

示例8:在实际环境中的使用

#!/bin/bash
# 打印服务器初始化脚本

# 1. 安装必要的软件包
# Ubuntu/Debian
sudo apt-get install lpr lprng

# 2. 创建打印队列目录
sudo mkdir -p /var/spool/lpd/lp
sudo chown daemon:daemon /var/spool/lpd/lp
sudo chmod 755 /var/spool/lpd/lp

# 3. 配置printcap文件
sudo tee /etc/printcap << 'EOF'
lp:\
    :sd=/var/spool/lpd/lp:\
    :mx#0:\
    :sh:\
    :lp=/dev/usb/lp0:\
    :if=/var/spool/lpd/lp/filter:
EOF

# 4. 启动lpd服务
sudo systemctl start lpd
sudo systemctl enable lpd

# 5. 测试打印
echo "测试打印" | lpr -P lp

printcap文件格式详解

字段 说明 示例
sd 假脱机目录(spool directory) :sd=/var/spool/lpd/lp:
mx 最大文件大小(0表示无限制) :mx#0:
sh 抑制页眉(suppress header) :sh:
lp 本地打印机设备 :lp=/dev/lp0:
rm 远程机器(remote machine) :rm=printer.example.com:
rp 远程打印机(remote printer) :rp=raw:
if 输入过滤器(input filter) :if=/var/spool/lpd/lp/filter:
of 输出过滤器(output filter) :of=/usr/libexec/lpr/lpf:
br 波特率(串口打印机) :br#9600:
fc 清除标志位(串口打印机) :fc#0:
注意:
  • lpd通常监听TCP端口515,确保防火墙允许该端口
  • printcap文件中的反斜杠(\)表示续行,最后一行不能有反斜杠
  • 假脱机目录的权限设置很重要,通常由daemon用户所有
  • 在现代系统中,推荐使用CUPS替代lpd
  • lpd的安全配置较为简单,需要谨慎配置访问控制
  • 打印过滤器脚本需要可执行权限
  • 从inetd启动时,需要考虑性能和安全问题

lpd与现代打印系统对比

特性 lpd(BSD打印系统) CUPS(现代打印系统)
协议支持 LPD/LPR协议 IPP、LPD、SMB、AppSocket等
配置方式 /etc/printcap文本文件 Web界面、配置文件、命令行
驱动程序 过滤器脚本 PPD文件、标准驱动
网络打印 基础支持 高级网络功能
安全特性 基本访问控制 SSL/TLS加密、认证
管理工具 lpr、lpq、lprm命令 lp、cancel、lpstat命令,Web界面
适用场景 老系统、简单环境 现代Linux、企业环境

安装和配置lpd

安装lpd和相关工具

# Ubuntu/Debian系统
sudo apt-get update
sudo apt-get install lpr lprng

# CentOS/RHEL系统
sudo yum install lpr lprng

# 从源码编译安装
wget http://www.lprng.com/LPRng/LPRng-3.8.35.tar.gz
tar -xzf LPRng-3.8.35.tar.gz
cd LPRng-3.8.35
./configure
make
sudo make install

基本配置步骤

  1. 安装lpd软件包
  2. 创建假脱机目录并设置权限
  3. 配置/etc/printcap文件
  4. 设置访问控制(/etc/hosts.lpd)
  5. 创建必要的过滤器脚本
  6. 启动lpd服务
  7. 测试打印功能

故障排除

问题:lpd启动失败

可能原因: 端口515被占用

解决: 检查端口占用情况

netstat -tlnp | grep 515
# 如果被占用,停止相应服务或修改配置
问题:打印作业卡住

解决: 清理打印队列

# 停止lpd服务
sudo systemctl stop lpd
# 清理假脱机目录
sudo rm -rf /var/spool/lpd/lp/*
# 重启服务
sudo systemctl start lpd
问题:权限错误

解决: 检查目录权限

# 设置正确的权限
sudo chown daemon:daemon /var/spool/lpd/lp
sudo chmod 755 /var/spool/lpd/lp
问题:网络打印失败

解决: 检查网络配置

# 测试网络连接
ping printer.example.com
# 检查防火墙设置
sudo iptables -L -n | grep 515

相关命令

  • lpr - 提交打印作业
  • lpq - 查看打印队列状态
  • lprm - 删除打印作业
  • lpadmin - 打印机管理(CUPS)
  • lpstat - 显示打印机状态
  • cupsd - CUPS打印守护进程