2012-05-01 20 views
7

Estoy intentando escribir una secuencia de comandos que extraiga la última versión de mi software de un repositorio git y actualice los archivos de configuración. Sin embargo, al sacar del repositorio, debo ingresar una contraseña. Quiero que el script automatice todo, así que necesito que lo complete automáticamente. Encontré este sitio que explicaba cómo usar "esperar" para buscar la solicitud de contraseña y enviar la contraseña. Sin embargo, no puedo hacer que funcione. Aquí está mi script:usando la secuencia de comandos expect in bash

#!/usr/bin/expect -f 
set password [lrange $argv 0 0] 
set timeout -1 

clear 
echo "Updating Source..." 
cd sourcedest 
git pull -f origin master 

match_max 100000 
# Look for passwod prompt 
expect "*?assword:*" 
# Send password aka $password 
send -- "$password\r" 
# send blank line (\r) to make sure we get back to gui 
send -- "\r" 
expect eof 

git checkout -f master 
cp Config/database.php.bak Config/database.php 
cp webroot/index.php.bak webroot/index.php 
cp webroot/js/config.js.bak webroot/js/config.js 

¿Qué estoy haciendo mal? aquí está el sitio del que lo obtuve: http://bash.cyberciti.biz/security/expect-ssh-login-script/

+0

Supongamos que has olvidado el engendro. – bdecaf

+0

no quiero esa parte. Estoy ejecutando esto dentro de mi máquina local. – LordZardeck

+0

No git, cd y cp no son comandos de espera válidos. Necesitas engendrar un caparazón para eso. – bdecaf

Respuesta

16

Esto se debe a los comentarios, con algunas observaciones propias. Pero nadie parece querer dar una respuesta real a esta, así que aquí va:

Su problema es que hay un esperan guión y se está tratando como si fuera un guiónbash. Esperar no sabe qué significan cd, cp y git. Bash lo hace. Lo que quiere es un script bash que haga un llamado a esperar. Por ejemplo:

#!/usr/bin/env bash 

password="$1" 
sourcedest="path/to/sourcedest" 
cd $sourcedest 

echo "Updating Source..." 
expect <<- DONE 
    set timeout -1 

    spawn git pull -f origin master 
    match_max 100000 

    # Look for passwod prompt 
    expect "*?assword:*" 
    # Send password aka $password 
    send -- "$password\r" 
    # send blank line (\r) to make sure we get back to gui 
    send -- "\r" 
    expect eof 
DONE 

git checkout -f master 
cp Config/database.php.bak Config/database.php 
cp webroot/index.php.bak webroot/index.php 
cp webroot/js/config.js.bak webroot/js/config.js 

Sin embargo, como larsks señalaron en los comentarios, que podría ser mejor usar las claves ssh. Entonces podría deshacerse de la llamada expect por completo.

+0

funcionó para mí! ¡Muchas gracias! – Deano

Cuestiones relacionadas