Я использую "reprepro" для того, чтобы вытащить последние пакеты Debian из моего локального репозитория, который хорошо работает вручную.
Теперь я должен автоматизировать этот процесс через задание крона, но reprepro пароль является подсказкой.
Там возможность состоит в том, чтобы отправить пароль с помощью сценария удара? Ничего не мог найти в reprepro странице справочника.
Я нуждался в том же самом и искал решение. Кроме выполнения gpg-agent
, который будет просить пароль только однажды (например, во время начальной загрузки) и кэшировать его для следующего использования, я ничего не нашел.
Проблема состоит в том, как взаимодействовать с интерактивными сценариями, которые являются теми, кто просит ввод данных пользователем от stdin. Ожидайте (apt-get install expect
) решает точно это.
Это - сценарий, который я записал и сохранил в/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
Можно выполнить его как это:
reprepro_expect [path_to_repository] [command] [distribution] [package_name]
Например:
Добавьте новый пакет:
reprepro_expect /var/www/myrepo includedeb wheezy mypackage_0.1-1_all.deb
Удалите пакет
reprepro_expect /var/www/myrepo remove wheezy mypackage
Безопасность: Так как пароль к Вашему закрытому ключу хранится в сценарии, я рекомендую chown
это пользователю, при котором это будет использоваться и chmod
это к 500. Почему пароль не передается как другой аргумент? Поскольку это было бы сохранено в ~/.bash_history, и это покажет в ps axu
во время времени выполнения.
Как упомянуто в других ответах, expect
может решить эту проблему. Я закончил с чем-то вроде этого, сохраните как reprepro.exp
и сделайте это исполняемым файлом с 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
Наличие одного expect
, оператор означает, что это будет также работать (т.е. не катастрофический отказ), если пароль будет неправильным. Затем gpg попросит пароль три раза, и reprepro возвратит код выхода, который не является 0.
можно экспортировать переменную среды SIGNING_PASSWORD
в .bashrc или заменить его в сценарии с действительным паролем или сделать что-то еще. Используйте соответствующий уровень безопасности, в которой Вы нуждаетесь.
Этот ответ предназначен для пользователей Ansible.
У меня была та же проблема, я создал фиктивный файл, зашифровал его и использовал gpg-agent
для кэширования пароля, как это было предложено mkudlacek, но с модулем ожидания. Я использовал следующие задачи:
- name: create test.txt, created a dummy file
file:
path: /test.txt
state: touch
mode: u=rw,g=rw,o=rw #!!! just for testing purposes
- name: encrypt file
expect:
command: gpg --pinentry-mode loopback --sign /test.txt
responses: 'Enter passphrase:': '{{ your_pw }}'
timeout: 60
Теперь вы можете добавить пакеты Reprepro через отдельную задачу и удалить файл test.txt.