【问题标题】:Generating PGP signatures from a Scala program从 Scala 程序生成 PGP 签名
【发布时间】:2012-10-31 03:20:10
【问题描述】:

我正在编写一个小的 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 -ab FILE_NAME 将要求输入密码。当我执行我的 scala 脚本时,我在调用外部命令时遇到了这个异常:

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)

我认为这与外部命令(在本例中为 gpg)请求一些输入这一事实有关。 如果这是造成问题的原因(?),当从 Scala 执行时,使任何外部命令(请求任意数量的输入)工作的最简单的通用方法是什么?

【问题讨论】:

    标签: java scala input gnupg


    【解决方案1】:

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

    【讨论】:

    • 嗨@Kim。如果我添加 --no-tty 选项,我会收到此异常:“gpg:抱歉,根本没有请求终端 - 无法获取输入”我在执行 Scala 脚本或执行命令时都会看到该异常直接在控制台中。
    • 那么它需要什么输入?你能在命令行上提供吗?
    • 它要求输入密码,但不知道如何将其包含在命令行中(直到现在我才跳过了 man 文档)
    • 最后它停止抛出异常,这行: ("gpg -ab --yes --batch --passphrase " + passPhrase + " " + fileName).!!感谢@Kim 的帮助,至少它解决了我眼前的问题。我仍然想知道是否可以从 Scala 调用任何命令并能够在需要时为其提供输入
    • @Sergio:这取决于“输入”的类型。当然可以写入程序的标准输入,但是 gpg 没有从标准输入读取。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2012-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多