ejecutando un script de shell que requiere la entrada del usuario usando el Automator

0

¿Es posible utilizar el automatizador para ejecutar un script de shell que requiere una entrada del usuario (una contraseña)? El script de shell debe ejecutarse en la carpeta seleccionada actualmente. Escribí una acción "Ejecutar shell script" como en la siguiente figura:

Sobrelasaccionesdeshell:

cd$1~/scripts/pgpsign

Primerocambioalacarpetaseleccionadaactualyluegoejecutomiscript,que,segúntengoentendido,estáfallandoyaquerequiereprocesarunaentradaantesdecontinuar.

Debajodelcódigocompletodelscript(enScala)

#!/bin/shexecscala"$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).!!
    }
  }
}
    
pregunta Sergio 30.10.2012 - 23:37

1 respuesta

2

No estoy realmente familiarizado con el lenguaje Scala en absoluto, pero parece que la secuencia de comandos solo está diseñada para que el usuario ingrese la contraseña, no los argumentos o stdin , que es lo que necesita Automator para pasar los datos. .

El shell en el que Automator ejecuta los scripts no es interactivo, por lo que su script no puede solicitar directamente al usuario una contraseña. Si puede volver a trabajar su secuencia de comandos para tomar una contraseña a través de stdin , podría usar un contenedor de AppleScript para obtener un diálogo de contraseña, si eso es lo que está esperando.

Si reescribe su secuencia de comandos pgpsign para tomar una contraseña de stdin , puede usar una acción Applescript (con algunos scripts de shell incrustados) para mostrar un diálogo de contraseña y obtener los resultados que desea.

Reemplace su acción Ejecutar shell script en su flujo de trabajo actual con una acción Ejecutar AppleScript , con el siguiente código:

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

No es lo más sencillo, así que analizaré línea por línea lo que está haciendo.

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

Esto obtiene la entrada del servicio (la carpeta que seleccionó) y la convierte en una cadena que el script de shell puede usar.

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

Esto abre un diálogo de contraseña y almacena el resultado en la variable pass . Por lo general, en AppleScript no necesita la porción System Events tell, pero debido a algunas peculiaridades con Automator, se requiere aquí.

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

Esto lo une todo y envía los parámetros requeridos a su script. Primero, cambiamos al directorio seleccionado (para responder a su pregunta en los comentarios, una vez que se haya escrito su script, es necesario que primero escriba cd en el directorio que desee). Luego, echo se usa para enviar la contraseña a stdin , y se canaliza a través de la parte de perl para eliminar la nueva línea final (que es una característica molesta de AppleScript y de lo contrario causaría que una contraseña válida falle), luego se envía a su script.

Lamento haberle dado mucho que digerir, pero si quiere usar Automator para esto, probablemente sea la forma más fácil, a menos que quiera codificar su contraseña (que obviamente no es aconsejable por razones de seguridad).

    
respondido por el robmathers 31.10.2012 - 03:26

Lea otras preguntas en las etiquetas