web-dev-qa-db-fra.com

reprepro - Existe-t-il une chance de saisir la phrase secrète via bash-script?

J'utilise "reprepro" pour extraire les derniers paquets Debian de mon référentiel local, ce qui fonctionne bien manuellement.
Je dois maintenant automatiser ce processus par le biais d’une tâche cron, mais le mot de passe reprepro est une invite.

Est-il possible d'envoyer le mot de passe via le script bash? Impossible de trouver quoi que ce soit dans la page de manuel reprepro.

2
P4tR

J'avais besoin de la même chose et cherchais une solution. À part exécuter gpg-agent, qui ne demandera le mot de passe qu'une seule fois (par exemple lors du démarrage) et le mettra en cache pour une utilisation ultérieure, je n'ai rien trouvé.

Le problème est de savoir comment interagir avec les scripts interactifs, qui sont ceux qui demandent l’information de stdin à l’utilisateur. Expect (apt-get install expect) résout exactement cela.

Voici le script que j'ai écrit et enregistré dans/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

Vous pouvez l'exécuter comme ceci:

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

Par exemple:

Ajouter un nouveau package:

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

Supprimer le package

reprepro_expect /var/www/myrepo remove wheezy mypackage

Sécurité: Puisque le mot de passe de votre clé privée est stocké dans le script, je vous recommande de chown à l'utilisateur, sous lequel il sera utilisé et chmod il à 500. Pourquoi la phrase secrète n'est-elle pas passée comme une autre argument? Parce qu'il serait stocké dans ~/.bash_history et qu'il serait affiché dans ps axu pendant l'exécution.

5
mkudlacek

Comme mentionné dans d'autres réponses, expect peut résoudre ce problème. Je me suis retrouvé avec quelque chose comme ça, enregistrer en tant que reprepro.exp et le rendre exécutable avec 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

Avoir une instruction expect signifie que cela fonctionnera également (c'est-à-dire pas en panne) si le mot de passe est incorrect. Ensuite, gpg demandera le mot de passe complexe trois fois et reprepro renverra un code de sortie autre que 0.

Vous pouvez exporter la variable d'environnement SIGNING_PASSWORD dans votre fichier .bashrc ou la remplacer dans le script par le mot de passe réel ou faire autre chose. Utilisez le niveau de sécurité approprié dont vous avez besoin.

3
Ronny Andersson