在Scala中以sudo身份运行进程

时间:2016-03-20 18:16:58

标签: scala

我正在尝试在scala中以sudo身份运行一个进程。我写了这段代码

  val l : Seq[String] = Seq("echo", "SecretXYZ!", "|", "sudo", "-S", "-u", "web", "spark-submit", "--class",
    "com.abhi.Foo", "--master", "yarn-cluster", "Foo-assembly-1.0.jar", DateTimeFormat.forPattern(pattern).print(date), ">",
    "fn_output.txt", "2>", "fn_error.txt")
  l.!
  println("completed...")

但是当我运行它时,它不会运行该过程。它只是打印

SecretXYZ! | sudo -S -u web spark-submit --class com.abhi.Foo --master yarn-cluster Foo-assembly-1.0.jar 2015-03-19 > fn_output.txt 2> fn_error.txt
completed...

1 个答案:

答案 0 :(得分:1)

正如Łukasz所指出的,“正确”的答案是用sys.process自己构建管道。

懒惰的回答是在调用bash -c ...

时明确地包装所有内容
val miniScript: Seq[String] = Seq(
  "echo", "SecretXYZ!",
  "|", "sudo", "-S", "-u", "web",
  "spark-submit", "--class", "com.abhi.Foo", "--master", "yarn-cluster",
  "Foo-assembly-1.0.jar", DateTimeFormat.forPattern(pattern).print(date),
  ">", "fn_output.txt", "2>", "fn_error.txt")

val cmd: Seq[String] = Seq("bash", "-c", miniScript.mkString(" "))

cmd.!

小心转义,但是这个版本中的密码需要单引号 - 例如 - 如果你想让这段代码变得健壮,你应该真的用{{1}来做所以你确切地知道发生了什么。