通过 sudo 的标准输入

Standard input through sudo

我正在编写一个 Java 调用其他程序的程序,其中一些程序需要 运行 作为 root。

我考虑过 运行将整个 JAR 作为 root 权限,但这听起来像是一个安全风险,我宁愿 运行 只是一些程序作为 root 权限。

目前,我在命令 sudo -S pacman <...> 上创建了一个 ProcessBuilder 并使用其 getStandardOutput 方法实例化了一个 Writer。 (-S 表示“从标准输入读取”)。

然后我使用 reader 注入密码并刷新它,到目前为止一切顺利。

但是,当 pacman 需要输入时(例如,在询问交互式 yes/no 问题时),并且我尝试再次写入 Writer,它失败并出现 IOException,因为流已关闭。

我怎样才能获得一个可以真正将字符发送到 pacman 和其他程序 运行 作为 root 的 Writer?

此程序仅适用于 运行 UNIX(Arch Linux、Debian、MacOS 和可能 Window 的 WSL),因此如果可能,特定于 UNIX 的解决方案很好我宁愿不使用 JNI,因为它需要多次编译,但如果这是唯一的解决方案,那也没关系。我也可以用其他东西替换 sudo,只要它仍然是 运行 作为 root。

如果这不是 long-lived 服务,您可以 运行 sudo -vsudo 缓存凭据,然后在您的 Java程序无需输入密码。如果您使用类似以下内容调用 Java 程序,则效果最佳:

#!/bin/bash

sudo -v
java -jar ...