esecuzione di script di shell che richiedono l'input dell'utente che utilizza Automator

0

Utilizzando l'automatore è possibile eseguire uno script di shell che richiede l'input dell'utente (una password)? Lo script della shell deve essere eseguito nella cartella attualmente selezionata. Ho scritto un'azione "Esegui Shell Script" come nella seguente figura:

Informazionisulleazionidellashell:

cd$1~/scripts/pgpsign

Perprimacosapassoallacartellacorrenteselezionataepoieseguoilmioscript,cheperquantohocapitononfunzionapoichérichiedel'elaborazionediuninputprimadiprocedere.

Sottoilcodicecompletodelloscript(inScala)

#!/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).!!
    }
  }
}
    
posta Sergio 30.10.2012 - 23:37
fonte

1 risposta

2

Non ho alcuna familiarità con il linguaggio di Scala, ma sembra che lo script sia costruito per prendere input dell'utente per la password, non per gli argomenti o stdin , che è ciò che è necessario affinché Automator passi i dati .

La shell su cui Automator esegue gli script non è interattiva, quindi lo script non può richiedere direttamente all'utente una password. Se riesci a rielaborare lo script per acquisire una password tramite stdin , puoi utilizzare un wrapper AppleScript per ottenere una finestra di dialogo con password, se è quello che ti aspetti.

Se rielabori lo script pgpsign per prendere una password da stdin , puoi utilizzare un'azione di Applescript (con alcuni script di shell incorporati) per visualizzare una finestra di dialogo della password e ottenere i risultati che desideri.

Sostituisci l'azione Esegui script shell nel tuo flusso di lavoro corrente con un'azione Esegui AppleScript , con il seguente codice:

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

Non è il più semplice, quindi eseguirò linea per linea ciò che sta facendo.

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

Questo ottiene l'input dal servizio (la cartella selezionata) e lo trasforma in una stringa che lo script della shell può utilizzare.

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

Questo fa apparire una finestra di dialogo della password e memorizza il risultato nella variabile pass . Normalmente in AppleScript non hai bisogno della porzione di System Events tell, ma a causa di alcune stranezze con Automator, è necessario qui.

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

Ciò lega tutto insieme e invia i parametri richiesti al tuo script. Per prima cosa passiamo alla directory selezionata (per rispondere alla tua domanda nei commenti, poiché il tuo script è scritto, è necessario prima cd alla directory che vuoi). Quindi echo viene usato per inviare la password a stdin , e viene convogliata attraverso la parte perl per rimuovere la riga finale finale (che è una caratteristica fastidiosa di AppleScript e altrimenti causerebbe il fallimento di una password valida), quindi inviata al tuo script.

Ci scusiamo per darti un sacco di cose da digerire, ma se vuoi usare Automator per questo, è probabilmente il modo più semplice, a meno che tu non voglia hardcare la tua password (che ovviamente è sconsigliabile per ragioni di sicurezza).

    
risposta data 31.10.2012 - 03:26
fonte

Leggi altre domande sui tag