Como usar 'esperar' com 'zipcloak' II?

3

Esta pergunta é uma continuação em esta questão , como eu descobri que a solução que apresentei na pergunta anterior não funciona mais. Funcionou em algum momento, mas agora expect não funciona como esperado. Aqui está o código completo novamente:

#!/bin/bash
MYPWD="mypassword"

expect -c ' 
    spawn zipcloak test.upd
    expect "*Enter password*" 
    sleep 1
    send  "'"$MYPWD"'\r"
    sleep 1
    expect "*Verify password*" 
    sleep 1
    send  "'"$MYPWD"'\r"
    sleep 1
    '

Esse script bash não criptografa o arquivo test.upd , mas cria arquivos no meu diretório, começando com "zi", como zi0gA1rU ou zi8Vv6OD .

Por que isso? Quais são esses arquivos? Por que o script acima às vezes funciona e às vezes não? Não há como fazer com que expect se comporte como deveria?

Onde posso encontrar o código-fonte de zipcloak , então posso reescrevê-lo para evitar o uso de expect ?

Informações adicionais:

  • Eu tenho que executar este comando como root , pois o zipfile tem direitos de root. Talvez isso seja importante?

    zipcloak -v Copyright (c) 1990-2008 Info-ZIP - Digite 'zipcloak "-L"' para licença de software.

    Este é o ZipCloak 3.0 (5 de julho de 2008), da Info-ZIP. Atualmente mantido por E. Gordon. Por favor, envie relatórios de erros para os autores usando a página da web em www.info-zip.org; veja o README para detalhes.

    As últimas fontes e executáveis estão em ftp://ftp.info-zip.org/pub/infozip , a partir da data acima; veja link para outros sites.

    Compilado com o gcc 4.6.1 para Unix (Linux ELF) em 11 de junho de 2011.

    Opções especiais de compilação do ZipCloak:     [criptografia, versão 2.91 de 05 de janeiro de 2007]

Depois que ele parou de funcionar, precisei definir o último sleep para 2. Então funcionou novamente. Mas depois, isso também não funcionou mais. Então eu defino o sleep para 5 segundos. Por enquanto, meu script está funcionando. Mas NÃO é confiável.

Saída de depuração com exp_internal 1 set:

spawn /usr/bin/test.upd
parent: waiting for sync byte
parent: telling child to go ahead
parent: now unsynchronized from child
spawn: returns {28746}

expect: does "" (spawn_id exp6) match glob pattern "*Enter password*"? no
Enter password: 
expect: does "Enter password: " (spawn_id exp6) match glob pattern "*Enter password*"? yes
expect: set expect_out(0,string) "Enter password: "
expect: set expect_out(spawn_id) "exp6"
expect: set expect_out(buffer) "Enter password: "
send: sending "XXX\r" to { exp6 }

expect: does "" (spawn_id exp6) match glob pattern "*Verify password*"? no

Verify password: 
expect: does "\r\nVerify password: " (spawn_id exp6) match glob pattern "*Verify password*"? yes
expect: set expect_out(0,string) "\r\nVerify password: "
expect: set expect_out(spawn_id) "exp6"
expect: set expect_out(buffer) "\r\nVerify password: "
send: sending "XXX\r" to { exp6 }
argv[0] = expect  argv[1] = -c  argv[2] = 
    exp_internal 1
    spawn /usr/bin/zipcloak "test.upd"
    expect "*Enter password*"
    sleep 1
    send  "XXX\r"
    sleep 1
    expect "*Verify password*"
    sleep 1
    send  "XXX\r"
    sleep 1

set argc 0
set argv0 "expect"
set argv ""

Atualização: A saída do segundo script postado por glenn é:

spawn zipcloak test.upd
parent: waiting for sync byte
parent: telling child to go ahead
parent: now unsynchronized from child
spawn: returns {9956}
Gate keeper glob pattern for 'password: $' is 'password: '. Activating booster.

expect: does "" (spawn_id exp6) match regular expression "password: $"? Gate "password: "? gate=no
Enter password:
expect: does "Enter password: " (spawn_id exp6) match regular expression "password: $"? Gate "password: "? gate=yes re=yes
expect: set expect_out(0,string) "password: "
expect: set expect_out(spawn_id) "exp6"
expect: set expect_out(buffer) "Enter password: "
send: sending "mypassword\r" to { exp6 }
expect: continuing expect

expect: does "" (spawn_id exp6) match regular expression "password: $"? Gate "password: "? gate=no
mypassword

expect: does "mypassword\r\n" (spawn_id exp6) match regular expression "password: $"? Gate "password: "? gate=no
expect: timed out
argv[0] = expect  argv[1] = -c  argv[2] =
    exp_internal 1
    spawn zipcloak test.upd
    expect {
        -re {password: $} {send "mypassword\r"; exp_continue}
        eof
    }

set argc 0
set argv0 "expect"
set argv ""

Atualizar

Eu realmente quero especificar o nome do arquivo e a senha na linha de comando para chamar o código como

./myscript.sh test.upd pass

Aqui está o script:

#!/bin/bash
expect -c " 
    exp_internal 1
    spawn zipcloak \"$1\"
    expect {
        -re {password: \$} {send \"$2\r\"; exp_continue}
        expect eof
    }
"

No entanto, ele cria novamente um arquivo que começa com zi e não criptografa o arquivo real. Eu não tinha ideia de que cada mudança aparentemente lógica poderia interromper todo o fluxo de trabalho do script esperado. Aqui está a saída:

spawn zipcloak test.upd
parent: waiting for sync byte
parent: telling child to go ahead
parent: now unsynchronized from child
spawn: returns {16791}
Gate keeper glob pattern for 'password: $' is 'password: '. Activating booster.

expect: does "" (spawn_id exp6) match regular expression "password: $"? Gate "password: "? gate=no
"expect"? no
Enter password:
expect: does "Enter password: " (spawn_id exp6) match regular expression "password: $"? Gate "password: "? gate=yes re=yes
expect: set expect_out(0,string) "password: "
expect: set expect_out(spawn_id) "exp6"
expect: set expect_out(buffer) "Enter password: "
send: sending "pass\r" to { exp6 }
expect: continuing expect

expect: does "" (spawn_id exp6) match regular expression "password: $"? Gate "password: "? gate=no
"expect"? no
pass

expect: does "pass\r\n" (spawn_id exp6) match regular expression "password: $"? Gate "password: "? gate=no
"expect"? no
expect: timed out
argv[0] = expect  argv[1] = -c  argv[2] =
    exp_internal 1
    spawn zipcloak "test.upd"
    expect {
        -re {password: $} {send "pass\r"; exp_continue}
        expect eof
    }

set argc 0
set argv0 "expect"
set argv ""
    
por Alex 29.11.2013 / 11:24

1 resposta

4

Eu escreveria esse zipcloak-er como

#!/usr/bin/env expect
set zipfile [lindex $argv 0]
if {![file exists $zipfile]} {error "no such zipfile: $zipfile"}
set pass "mypassword"
spawn zipcloak $zipfile
expect {
    -re {password: $} {send "$pass\r"; exp_continue}
    eof
}

Como os prompts "digitar senha:" e "verificar senha:" têm um sufixo comum, faz sentido usar exp_continue para reutilizar o código.

"não funciona" não é útil. Você usou exp_internal 1 ? Tente isto:

#!/bin/bash
MYPWD="mypassword"

expect -c " 
    exp_internal 1
    spawn zipcloak test.upd
    expect {
        -re {password: \$} {send \"$MYPWD\r\"; exp_continue}
        eof
    }
"

Desculpe Alex, não entendi o seu problema. Isso é o que acontece comigo no bash:

$ zip test.upd file
  adding: file (deflated 22%)
$ MYPWD="mypassword"
$ expect -c " 
    exp_internal 1
    spawn zipcloak test.upd
    expect {
        -re {password: \$} {send \"$MYPWD\r\"; exp_continue}
        eof
    }
"
spawn zipcloak test.upd
parent: waiting for sync byte
parent: telling child to go ahead
parent: now unsynchronized from child
spawn: returns {27485}
Gate keeper glob pattern for 'password: $' is 'password: '. Activating booster.

expect: does "" (spawn_id exp4) match regular expression "password: $"? Gate "password: "? gate=no
Enter password: 
expect: does "Enter password: " (spawn_id exp4) match regular expression "password: $"? Gate "password: "? gate=yes re=yes
expect: set expect_out(0,string) "password: "
expect: set expect_out(spawn_id) "exp4"
expect: set expect_out(buffer) "Enter password: "
send: sending "mypassword\r" to { exp4 }
expect: continuing expect

expect: does "" (spawn_id exp4) match regular expression "password: $"? Gate "password: "? gate=no

Verify password: 
expect: does "\r\nVerify password: " (spawn_id exp4) match regular expression "password: $"? Gate "password: "? gate=yes re=yes
expect: set expect_out(0,string) "password: "
expect: set expect_out(spawn_id) "exp4"
expect: set expect_out(buffer) "\r\nVerify password: "
send: sending "mypassword\r" to { exp4 }
expect: continuing expect

expect: does "" (spawn_id exp4) match regular expression "password: $"? Gate "password: "? gate=no


expect: does "\r\n" (spawn_id exp4) match regular expression "password: $"? Gate "password: "? gate=no
encrypting: file

expect: does "\r\nencrypting: file\r\n" (spawn_id exp4) match regular expression "password: $"? Gate "password: "? gate=no
expect: read eof
expect: set expect_out(spawn_id) "exp4"
expect: set expect_out(buffer) "\r\nencrypting: file\r\n"
argv[0] = expect  argv[1] = -c  argv[2] =  
    exp_internal 1
    spawn zipcloak test.upd
    expect {
        -re {password: $} {send "mypassword\r"; exp_continue}
        eof
    }

set argc 0
set argv0 "expect"
set argv ""
    
por 29.11.2013 / 23:09

Tags