安全的运行方式使用`sudo`进行sbt任务启动子进程

时间:2015-03-07 22:00:38

标签: scala scripting sbt

我正在使用SBT进行一些DevOps脚本编写,我需要一个任务来通过sudo启动子进程,用户可以通过sudo提示安全地输入密码。在sbt中是否有办法允许子进程暂时完全捕获控制台的stdin,并通过密码键击到sudo

2 个答案:

答案 0 :(得分:3)

简短回答

您可以在build.sbtBuild.scala

中使用以下代码
import sbt.Process

val sudo = taskKey[Unit]("Executes commands with sudo!")

sudo := {
  Process("sudo ls /", new File(".")).!<
}

您必须使用要运行的实际命令更改"sudo ls /",并使用要运行该命令的目录更改"."

这可能是最安全的选项,因为您将标准输入连接到分叉进程,但缺点是当前进程将被阻止,直到新生成的进程终止。

如何运作

Sbt ProcessProcessBuilder有很多有用的工具来处理流程。

来自!<方法的Scaladocs:

  

启动此构建器表示的进程,阻塞直到退出,并返回退出代码。标准输出和错误将发送到控制台。新启动的流程从当前流程的标准输入读取。

如果您不想阻止当前进程,那么任务将更加困难。在这种情况下,您必须使用ProcessIO并为其输入流提供输入,但是没有安全的方法可以从标准输入中获取密码。

替代

另请注意,StringFileURL类将隐式转换为ProcessBuilder,您可以从Process运行sudo := "sudo ls /".!< 。因此,您可以使用以下代码:

{{1}}

在这种情况下,正在运行的Java进程的当前工作目录将用作工作目录。

答案 1 :(得分:0)

我没有在SBT中看到过这种情况,但我建议在sudoers列表中添加用户(或用户组)和命令,这样它就不会提示输入密码。

我正是通过SBT运行一些Docker任务取得了巨大成功。

E.g。在build.sbt

docker := {
  (test in Test).value
  (stage in Docker).value
  "./docker-stuff.sh" !
}

...然后docker-stuff.shsudo个命令。