scala - 运行 sbt 任务启动子进程的安全方式为 `sudo`

标签 scala scripting sbt

我正在使用 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/

相关文章:

linux - bash 中使用的 -ex 选项是什么 | #!/bin/bash -ex 意思

Android SDK 平台目标(对于 sbt gen-android <platform-target> <package-name> <name>)

json - Argonaut,自定义 JSON 格式映射

linux - 需要一个 unix 脚本来验证给定路径中没有空格

scala - 属性文件中的Elasticsearch Scala elastic4s设置

SVN:如何在不输入密码的情况下提交?

java - sbt 中的工作目录

sbt - build.sbt 中的条件库

scala - 在字符串插值中转义美元符号

database - 如何验证 Slick 是否正在使用 application.conf 中的参数?