我正在使用SBT进行一些DevOps脚本编写,我需要一个任务来通过sudo
启动子进程,用户可以通过sudo
提示安全地输入密码。在sbt中是否有办法允许子进程暂时完全捕获控制台的stdin
,并通过密码键击到sudo
?
答案 0 :(得分:3)
您可以在build.sbt
或Build.scala
:
import sbt.Process
val sudo = taskKey[Unit]("Executes commands with sudo!")
sudo := {
Process("sudo ls /", new File(".")).!<
}
您必须使用要运行的实际命令更改"sudo ls /"
,并使用要运行该命令的目录更改"."
。
这可能是最安全的选项,因为您将标准输入连接到分叉进程,但缺点是当前进程将被阻止,直到新生成的进程终止。
Sbt Process和ProcessBuilder
有很多有用的工具来处理流程。
来自!<
方法的Scaladocs:
启动此构建器表示的进程,阻塞直到退出,并返回退出代码。标准输出和错误将发送到控制台。新启动的流程从当前流程的标准输入读取。
如果您不想阻止当前进程,那么任务将更加困难。在这种情况下,您必须使用ProcessIO
并为其输入流提供输入,但是没有安全的方法可以从标准输入中获取密码。
另请注意,String
,File
和URL
类将隐式转换为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.sh
有sudo
个命令。