Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过sudo的标准输入_Java_Unix_Root_Sudo - Fatal编程技术网

Java 通过sudo的标准输入

Java 通过sudo的标准输入,java,unix,root,sudo,Java,Unix,Root,Sudo,我正在编写一个调用其他程序的Java程序,其中一些程序需要以root用户身份运行 我曾想过以root身份运行整个JAR,但这听起来像是一种安全风险,我宁愿以root身份运行一些程序 目前,我创建了一个ProcessBuilder,并使用其getStandardOutput方法在命令sudo-spacman上实例化一个Writer。(-S表示“从标准输入读取”) 然后,我使用该读卡器注入密码并刷新它,目前为止一切正常 但是,当pacman需要输入时(例如,当问一个交互式的“是/否”问题时),我尝试

我正在编写一个调用其他程序的Java程序,其中一些程序需要以root用户身份运行

我曾想过以root身份运行整个JAR,但这听起来像是一种安全风险,我宁愿以root身份运行一些程序

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

然后,我使用该读卡器注入密码并刷新它,目前为止一切正常

但是,当pacman需要输入时(例如,当问一个交互式的“是/否”问题时),我尝试再次向编写器写入时,由于流已关闭,它将失败,并出现IOException

我怎样才能找到一个能够将字符发送到
pacman
和其他以root身份运行的程序的编写器


这个程序只希望在UNIX(Arch Linux、Debian、MacOS,可能还有Windows的WSL)上运行,所以UNIX特定的解决方案是可以的,如果可能的话,我宁愿不使用JNI,因为它需要多次编译,但如果这是唯一的解决方案,那也可以。我也可以用其他东西替换sudo,只要它仍然以root运行。

如果这不是一个长期服务,您可以运行
sudo-v
来缓存凭据,然后在Java程序中调用
sudo
,而无需输入密码。如果您使用以下方法调用Java程序,这将是最有效的:

#/bin/bash
sudo-v
java-jar。。。

它似乎说它只在5分钟内有效,我认为这还不够。。。大约30分钟就足够了,但我在命令行中看不到增加长度的选项。在Java程序之外(或者在Java程序中,如果您想做这项工作),可以设置默认超时:使用
visudo
并添加
默认时间戳\u timeout=30
,其中参数为分钟。否则,您可能会在包装器脚本中异步地在循环中运行
sudo-v
,以不断刷新凭据。是的,这对于控制台应用程序来说会更好。对于图形应用程序,我正在试验
ssh-A