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 ""