2016-03-20 14 views
0

私はscalaでsudoとしてプロセスを実行しようとしています。私はこのコードを書いた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... 
+2

おそらく '!'は物をシェルに渡さないので、 "|" (と ">"と "> 2")は 'echo'の引数です。 –

+0

と私はこれをどのように変更しますか? –

+0

'#|' '#>'演算子を使います。 http://www.scala-lang.org/api/rc2/scala/sys/process/package.htmlを参照してください。 –

答えて

1

印刷し、「右」の答えは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.! 

はいえ、エスケープには注意してください - このバージョンでは、パスワードには、例えば、その周りに単一引用符が必要になります - 実際には、このコードを堅牢にしたい場合は、実際にはsys.processで行う必要があります。

関連する問題