使用Automator执行需要用户输入的Shell脚本


0

使用自动程序可以执行需要用户输入的shell脚本(密码)?Shell脚本应在当前选定的文件夹中执行。我编写了一个“运行Shell脚本”操作,如下图所示:

在此处输入图片说明

关于外壳动作:

cd $1
~/scripts/pgpsign

首先,我转到当前选定的文件夹,然后执行我的脚本,据我所知这是失败的,因为它需要在继续之前处理输入。

在脚本的完整代码下面(在Scala中)

#!/bin/sh
exec scala "$0" "$@"
!#

import sys.process._

object PGPSign {
  def main(args: Array[String]) {
    print("Please type passphrase : ")
    val passPhrase = readLine()
    signFilesInDirectory(new java.io.File("."), passPhrase.toString)
  }

  def signFilesInDirectory(dir: java.io.File, passPhrase: String) {
    if(!dir.exists())
      throw new java.io.FileNotFoundException
    if(!dir.isDirectory())
      throw new RuntimeException("Expecting directory")
    println("Signing files in directory: " + dir.getAbsolutePath())
    for{file <- dir.listFiles 
        if !file.isDirectory //ignoring directories
        val fileName = file.getName()
        if !fileName.startsWith(".") //ignoring hidden files
        if !fileName.endsWith(".asc") //ignoring signature files
    } { 
      println("- Signing file " + file)
       ("gpg -ab --yes --batch --passphrase " + passPhrase + " " + fileName).!!
    }
  }
}

您是否可以发布完整的自动化工作流程(或至少完整的Run Shell Script操作)的屏幕截图?另外,确保将“运行Shell脚本”操作上的“ 通过”输入设置为as arguments
robmathers 2012年

是的,我只是添加了完整工作流程的图(仅一个操作)
塞尔吉奥(Sergio

您可以在pgpsign脚本上发布更多信息,特别是期望输入什么信息吗?看起来好像在期待输入,但是您什么也没给。
robmathers 2012年

它只希望用户输入密码。在使用它为当前文件夹中的所有文件生成pgp签名之前,它会请求此密码短语
Sergio

试图理解... :)我确实可以重构脚本以从输入流中读取,但是然后如何使AppleScript可以在该流中编写呢?。顺便说一句,您能告诉我Automator动作的其余部分是否正常?我想知道“ cd $ 1”行是否真的必要或多余。Shell脚本的默认执行路径是当前选定的文件夹吗?
塞尔吉奥(Sergio)2012年

Answers:


2

我一点都不真正了解Scala语言,但是看起来该脚本仅是为接受用户输入的密码而设计的,而不是参数或stdin,这是Automator传递数据所需的。

Automator在其中运行脚本的外壳是非交互式的,因此您的脚本无法直接提示用户输入密码。如果您可以通过修改返工脚本以通过stdin输入密码,则可以使用AppleScript包装器来获取密码对话框。

如果您对pgpsign脚本进行重做以从中获取密码stdin,则可以使用Applescript操作(嵌入了一些shell脚本)来显示密码对话框并获得所需的结果。

使用以下代码,将当前工作流程中的运行Shell脚本”操作替换为“运行AppleScript”操作:

on run {input, parameters}
    set thePath to quoted form of POSIX path of first item of input as string
    tell application "System Events"
        display dialog "Password:" default answer "" with hidden answer
    end tell
    set pass to text returned of result
    do shell script "cd " & thePath & "; echo " & quoted form of pass & " | perl -ne 'chomp and print' | ~/scripts/pgpsign"
end run

这不是最简单的方法,因此我将逐行逐一进行。

on run {input, parameters}
    set thePath to quoted form of POSIX path of first item of input as string

这将从服务(您选择的文件夹)中获取输入,并将其转换为Shell脚本可以使用的字符串。

tell application "System Events"
    display dialog "Password:" default answer "" with hidden answer
end tell
set pass to text returned of result

这会弹出一个密码对话框,并将结果存储到pass变量中。通常,在AppleScript中,您不需要System Eventstell部分,但是由于Automator的一些怪异,因此在此处是必需的。

do shell script "cd " & thePath & "; echo " & quoted form of pass & " | perl -ne 'chomp and print' | ~/scripts/pgpsign"

这将它们联系在一起,并将所需的参数发送到脚本。首先,我们转到所选目录(要在注释中回答您的问题,在编写脚本时,必须首先cd转到所需的目录)。然后echo用于将密码发送到stdin,并将其通过perl部分进行管道传输以剥离尾随的换行符(这是AppleScript的烦人特性,否则会导致有效密码失败),然后通过管道传输至脚本。

抱歉给您带来很多麻烦,但是如果您想使用Automator进行此操作,这可能是最简单的方法,除非您想对密码进行硬编码(出于安全原因,这显然不建议使用)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.