我正在使用 SBT 编写一些 DevOps 脚本,我需要一个任务来通过 sudo
启动子进程,用户可以通过 sudo
安全地输入密码> 提示。 sbt 有没有办法允许子进程暂时但完全捕获控制台的 stdin,将密码击键传递给 sudo?
最佳答案
简短回答
您可以在 build.sbt
中使用以下代码或Build.scala
:
import sbt.Process
val sudo = taskKey[Unit]("Executes commands with sudo!")
sudo := {
Process("sudo ls /", new File(".")).!<
}
你必须改变"sudo ls /"
使用您要运行的实际命令和 "."
与您要在其中运行该命令的目录。
这可能是最安全的选项,因为您将标准输入连接到 fork 进程,但缺点是当前进程将被阻止,直到新生成的进程终止。
这是如何工作的
Sbt Process和 ProcessBuilder
有许多有用的实用程序可用于处理流程。
来自 !<
的 Scaladocs方法:
Starts the process represented by this builder, blocks until it exits, and returns the exit code. Standard output and error are sent to the console. The newly started process reads from standard input of the current process.
如果你不想阻塞当前进程,那么任务会有点困难。在这种情况下,您必须使用 ProcessIO
并向其输入流提供输入,但是没有安全的方法从标准输入获取密码。
替代方案
另请注意 String
, File
,和URL
类将隐式转换为 ProcessBuilder
您可以从中运行 Process
。所以你可以使用下面的代码来代替:
sudo := "sudo ls /".!<
在这种情况下,正在运行的 Java 进程的当前工作目录将用作工作目录。
关于scala - 运行 sbt 任务启动子进程的安全方式为 `sudo`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28920516/