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