私は「reprepro」を使用して、ローカルリポジトリから最新のDebianパッケージを取得します。これは手動で正常に動作します。
今、cronジョブを介してこのプロセスを自動化する必要がありますが、repreproパスフレーズはプロンプトです。
Bashスクリプト経由でパスワードを送信する可能性はありますか? repreproのマンページに何も見つかりませんでした。
同じものが必要で、解決策を探していました。一度だけ(たとえば、ブート中に)パスワードを要求し、次の使用のためにそれをキャッシュするgpg-agent
を実行することは別として、私は何も見つけていません。
問題は、標準入力からユーザー入力を要求する対話型スクリプトと対話する方法です。 Expect (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
ステートメントが1つあるということは、パスワードが間違っていても機能する(つまり、クラッシュしない)ことを意味します。次に、gpgはパスフレーズを3回要求し、repreproは0以外の終了コードを返します。
.bashrcのSIGNING_PASSWORD
環境変数をエクスポートするか、スクリプト内の環境変数を実際のパスワードに置き換えるか、他のことを行うことができます。必要な適切なレベルのセキュリティを使用します。