在工作中,我的团队目前使用自行维护的网络打印机。我们还为团队中的一些成员运行我们自己的独立 Linux 网络。一切都运行良好。管理层决定,让每个人都使用集中维护的打印机将更加高效和可持续。这为我们带来了许多有用的功能,例如能够提交打印作业,然后在我们想要的任何打印机上选择它。问题是打印将与我们不使用的中央身份验证系统绑定在一起。
事实证明,我们实际上不必使用身份验证,我们只需要确保提交打印作业的用户名具有正确的用户名 - 否则您将无法获取它。我们可以更改所有用户的用户名和主目录以匹配集中管理的用户名和主目录,但可以理解的是,我们不想这样做。如果我们可以将我们的用户名重新映射到集中管理的用户名以进行打印,那么一切都应该正常工作。
我们目前正在使用 cups 来满足打印需求,据我所知,它不支持任何形式的用户名重新映射。这是正确的吗?我知道 Samba 支持用户名重新映射,但我不确定它是否适用于此配置。我们需要:
- 本地用户名打印(如有必要,打印到我们的服务器)->用户名重新映射到中央用户名->打印作业发送到打印服务。
有人能建议我们如何才能实现这一目标吗?
答案1
我现在已经解决了这个问题。我像往常一样添加了真实打印机,然后创建了一个名为 /usr/lib/cups/backend/remap 的新 cups 后端脚本:
#!/bin/bash
if [ "$#" == "0" ]; then
echo "network remap \"Unknown\" \"Username remap backend\""
exit 0
fi
DEVICE_URI=$(echo ${DEVICE_URI} | sed -e "s/^remap/ipp/")
FINAL_CONTENT_TYPE="application/vnd.cups-postscript"
PPD="<path to real printer ppd>"
PRINTER="<real printer name>"
JOBNUM=$1
USER=$(ypmatch $2 usermap)
if [ "$?" == "1" ]; then
exit 1
fi
JOBTITLE=$3
COPIES=$4
shift
shift
shift
shift
cat | /usr/lib/cups/backend/ipp ${JOBNUM} ${USER} "${JOBTITLE}" ${COPIES} "$@"
exit $?
然后我使用这个后端添加了一个新的假打印机。脚本假设你的假打印机和真正的打印机位于相同的位置,但协议不同,例如:
- 重新映射://服务器:631/打印机/打印机名称
- ipp://服务器:631/打印机/打印机名称
它在 DEVICE_URI 环境变量中用“http”替换“remap”,更新一些其他环境变量,查找映射的用户(在本例中基于自定义 NIS 映射),并使用 ipp 后端在真实打印机上运行该作业,但使用更新的用户名。
Cups 后端需要以下参数:
- $1:CUPS 作业 ID
- $2: 用户名
- $3:职位
- $4: 请求的副本数量
- $5:打印作业选项
- $6:打印作业文件(带路径)
如果 $6 为空,则它期望从 stdin 输入。