Java 从Scala程序生成PGP签名

Java 从Scala程序生成PGP签名,java,scala,input,gnupg,Java,Scala,Input,Gnupg,我正在编写一个小的Scala脚本,为当前目录中的所有文件生成PGP签名。这是我写的: object PGPSign { def main(args: Array[String]) { signFilesInDirectory(new java.io.File(".")) } def signFilesInDirectory(dir: java.io.File) { if(!dir.exists()) throw new java.io.FileNot

我正在编写一个小的Scala脚本,为当前目录中的所有文件生成PGP签名。这是我写的:

object PGPSign {
    def main(args: Array[String]) {
    signFilesInDirectory(new java.io.File("."))
  }

  def signFilesInDirectory(dir: java.io.File) {
    if(!dir.exists())
      throw new java.io.FileNotFoundException
    if(!dir.isDirectory())
      throw new RuntimeException("Expecting directory")
    println("Signing files in: " + dir.getAbsolutePath())
    for{ file <- dir.listFiles 
      if !file.isDirectory //ignoring directories
      val fileName = file.getName()
      if !fileName.startsWith(".") //ignoring hidden files
    } { 
      ("gpg -ab " + fileName).!!
    }
  }
}
我认为这与外部命令(本例中为gpg)请求一些输入有关。
如果这就是造成问题的原因(?),那么当从Scala执行任何外部命令(请求任何数量的输入)时,最简单的通用方法是什么?

gpg希望能够读取/写入tty,除非从交互式shell启动gpg,否则tty不可用。您应该使用
--no tty
选项禁用此行为。另外,您可能需要批处理模式,通过
--batch

hi@Kim启用。如果我添加--no tty选项,我会收到这个异常:“gpg:对不起,根本没有请求的终端-无法获取输入”我在执行Scala脚本或直接在控制台中执行命令时都会看到这个异常。那么它需要什么输入呢?您能在命令行上提供吗?它要求密码短语,但不知道如何将其包含在命令行中(直到现在我才幸运地跳过了man文档),最后它停止抛出这一行的异常:(“gpg-ab--yes--batch--passphrase”+passphrase+“”+fileName)。!!谢谢你的帮助@Kim,至少它解决了我眼前的问题。我仍然想知道是否可以从Scala调用任何命令,并在需要时为其提供输入it@Sergio:这取决于“输入”的类型。当然可以写入程序的标准输入,但gpg并没有从标准输入读取数据。
gpg: cannot open tty `/dev/tty': Device not configured
Exception in thread "main" java.lang.RuntimeException: Nonzero exit value: 2
at scala.sys.package$.error(package.scala:27)
at scala.sys.process.ProcessBuilderImpl$AbstractBuilder.slurp(ProcessBuilderImpl.scala:131)
at scala.sys.process.ProcessBuilderImpl$AbstractBuilder.$bang$bang(ProcessBuilderImpl.scala:101)
at PGPSign$$anonfun$signFilesInDirectory$3.apply(PGPSign.scala:25)
at PGPSign$$anonfun$signFilesInDirectory$3.apply(PGPSign.scala:20)
at scala.collection.TraversableLike$WithFilter$$anonfun$foreach$1.apply(TraversableLike.scala:743)
at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:34)
at scala.collection.mutable.ArrayOps.foreach(ArrayOps.scala:38)
at scala.collection.TraversableLike$WithFilter.foreach(TraversableLike.scala:742)
at PGPSign$.signFilesInDirectory(PGPSign.scala:20)
at PGPSign$.main(PGPSign.scala:11)
at PGPSign.main(PGPSign.scala)