我目前的情况:
- 我的电脑运行的是 Xubuntu 16.04
- Xubunutu 桌面上的 Java Jar 应用程序
- USB 热敏打印机(型号:DigiPOS 920)通过 USB 连接到我的电脑
- Java 应用程序通过 Java-POS 而不是通过 CUPS 与热敏打印机通信
我的问题:
我可以打印,但前提是我已通过终端以 su 身份启动了我的应用程序。如果我双击 jar 文件,我可以启动应用程序,但它找不到打印机,因此无法打印。各位,请给我一点提示:
如何在不需要 sudo 的情况下启动 java jar App?或者对于这种情况还有更好的方法吗?
答案1
将您的用户添加到
dialout
组,因为该组有读/写串行设备tty*
或的权限serial*
。sudo usermod -a -G dialout $USER
参考:如何在 12.04 上允许非 root 访问 /ttyUSB0?
如果它具有并行端口接口
lp*
(如 DigiPOS 920 的当前情况)请将您的用户添加到lp
组中。sudo usermod -a -G lp $USER
登出/登录
进一步说明:如果不行,请继续以下步骤
运行
watch lsusb
,插入和拔下打印机,编辑问题并添加打印机信息行,如输出中所示。跑步
watch "find /dev/ -iregex '.*lp.*' -printf '%p '; find /dev/ -iregex '.*tty.*' -printf '%p '"
插入和拔下打印机,编辑问题并添加插入打印机时创建的设备节点。
添加输出:
ls -l /dev/... udevadm info /dev/... udevadm info -a /dev/...
快速测试,更改权限
sudo chmod +rw /dev/tty...
尝试一下不使用你的程序
sudo
,它可以工作吗?现在,我们应该添加一个 udev 规则来使其永久生效。
答案2
您有 4 个选项,从最不安全到最安全:
java
以 root 身份运行:a. 标记
java
为 setuid root。或者b. 使用
sudo
表示应用程序可以以 root 身份运行而无需密码。请参阅NOPASSWD
中的选项/etc/sudoers
;或授予所有用户访问上述 USB 设备的权限:
a. 将设备标记为所有人可读写;或者
b. 将设备标记为 setuid root。
这取决于如何应用程序正在访问设备以确定哪个选项有效。我建议先尝试选项 2a,然后按照列表逐步尝试。
请注意,当将任何内容标记为 setuid root 时,您必须找到实际的二进制文件 /usr/lib/java-....-/bin/java
。setuid-root-ing“替代”符号链接将不起作用。