reprepro - Existe alguma chance de inserir a senha via bash-script?

2

Eu uso "reprepro" para obter os pacotes Debian mais recentes do meu repositório local, que funciona bem manualmente.
Agora preciso automatizar esse processo por meio de um cron job, mas a frase secreta reprepro é um prompt.

Existe alguma possibilidade de enviar a senha via script bash? Não foi possível encontrar nada na manpage do reprepro.

    
por P4tR 12.12.2014 / 12:20

2 respostas

5

Eu precisava da mesma coisa e estava procurando por solução. Além de executar gpg-agent , que pedirá a senha apenas uma vez (por exemplo, durante a inicialização) e armazenará em cache para o próximo uso, não encontrei nada.

O problema é como interagir com os scripts interativos, que são os que solicitam a entrada do usuário do stdin. Espere ( apt-get install expect ) resolve exatamente isso.

Este é o script que eu escrevi e salvei em / usr / local / bin / reprepro_expect:

#!/usr/bin/expect -f
set timeout 2
set passphrase "mysupersecretpassword"

spawn reprepro -b [lindex $argv 0] [lindex $argv 1] [lindex $argv 2] [lindex $argv 3]
expect {
        "*passphrase:*" {
                send -- "$passphrase\r"
        }
}
expect {
        "*passphrase:*" {
                send -- "$passphrase\r"
        }
}
interact

Você pode executá-lo assim:

reprepro_expect [path_to_repository] [command] [distribution] [package_name]

Por exemplo:

Adicionar novo pacote:

reprepro_expect /var/www/myrepo includedeb wheezy mypackage_0.1-1_all.deb

Excluir pacote

reprepro_expect /var/www/myrepo remove wheezy mypackage

Segurança: Como a senha da sua chave privada é armazenada no script, recomendo chown to user, sob o qual será usada e chmod to 500. Por que a frase secreta não é passada como outro argumento? Porque ele seria armazenado em ~ / .bash_history e seria mostrado em ps axu durante o tempo de execução.

    
por mkudlacek 08.04.2015 / 06:49
3

Como mencionado em outras respostas, expect pode resolver esse problema. Acabei com algo assim, salve como reprepro.exp e torne-o executável com chmod 755 reprepro.exp

#!/usr/bin/expect -f

set timeout 5

set passphrase "$env(SIGNING_PASSWORD)"

# Call reprepro with variable length arguments, so that this script
# takes the same arguments as the original program
spawn reprepro {*}$argv

expect {
    timeout                     {send_error "\nFailed to get password prompt\n";
                                 exit 1}
    "Please enter passphrase*"  {send -- "$passphrase\r";
                                 send_user " *** entering passphrase ***";
                                 exp_continue}
}

# Get the pid, spawnid, oserr and exitcode from the spawned reprepro command
set returnvalues [wait]

# Extract the reprepro exit code
set exitcode [lindex $returnvalues 3]

# Exit with the exitcode from reprepro (0 on success)
exit $exitcode

Ter uma instrução expect significa que isso também funcionará (ou seja, não travará) se a senha estiver errada. Em seguida, o gpg pedirá a frase-senha três vezes e o reprepro retornará um código de saída que não é 0.

Você pode exportar a variável de ambiente SIGNING_PASSWORD em seu .bashrc ou substituí-la no script pela senha real ou fazer outra coisa. Use o nível apropriado de segurança que você precisa.

    
por Ronny Andersson 30.03.2016 / 17:39