通过 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 -v
让 sudo
缓存凭据,然后在您的 Java程序无需输入密码。如果您使用类似以下内容调用 Java 程序,则效果最佳:
#!/bin/bash
sudo -v
java -jar ...
我正在编写一个 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 -v
让 sudo
缓存凭据,然后在您的 Java程序无需输入密码。如果您使用类似以下内容调用 Java 程序,则效果最佳:
#!/bin/bash
sudo -v
java -jar ...