1 votos

ejecutar el shell script que requiere la entrada del usuario utilizando el Automator

Utilizando el automatizador ¿es posible ejecutar un shell script que requiera la entrada del usuario (una contraseña)? El shell script debe ser ejecutado en la carpeta actualmente seleccionada. Escribí una acción "Ejecutar Shell script" como en la siguiente figura:

enter image description here

Sobre las acciones de la cáscara:

cd $1
~/scripts/pgpsign

Primero cambio a la carpeta actual seleccionada y luego ejecuto mi script, que por lo que entiendo está fallando ya que requiere procesar una entrada antes de proceder.

A continuación el código completo del script (en 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).!!
    }
  }
}

2voto

Ged Byrne Puntos 481

No estoy muy familiarizado con el lenguaje Scala en absoluto, pero parece que el script sólo está construido para tomar la entrada del usuario para la contraseña, no argumentos o stdin que es lo que se necesita para que Automator le pase los datos.

El shell en el que Automator ejecuta scripts no es interactivo, por lo que tu scriptsscriptscripts no puede pedir directamente la contraseña al usuario. Si puede rehacer su scriptsscriptscripts para tomar una contraseña a través de stdin Si no se puede, se puede utilizar una envoltura de AppleScript para obtener un cuadro de diálogo con la contraseña, si eso es lo que usted está esperando.

Si se reajusta su pgpsign script para tomar una contraseña de stdin Si no se ha hecho nada, se puede utilizar una acción de Applescript (con algunas secuencias de comandos de shell incrustadas) para mostrar un diálogo de contraseña y obtener los resultados deseados.

Sustituya su Ejecutar Shell script en su flujo de trabajo actual con un 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 voy a repasar línea por línea lo que hace.

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 seleccionada) y la convierte en una cadena que el shell scriptpuede utilizar.

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

Esto hace que aparezca un cuadro de diálogo con la contraseña y almacena el resultado en el pass variable. Normalmente, en AppleScript no se necesita la variable System Events pero debido a algunas peculiaridades de 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 necesarios a su script. Primero cambiamos al directorio seleccionado (para responder a tu pregunta en los comentarios, como tu script está escrito, es necesario primero cd al directorio que desee). A continuación, echo se utiliza 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 que, de otro modo, haría que una contraseña válida fallara), y luego se canaliza a su script.

Siento haberte dado mucho que digerir, pero si quieres usar Automator para esto, es probablemente la forma más fácil, a menos que quieras codificar tu contraseña (lo cual es obviamente desaconsejable por razones de seguridad).

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X