web-dev-qa-db-ja.com

reprepro-bash-scriptを介してパスフレーズを入力する機会はありますか?

私は「reprepro」を使用して、ローカルリポジトリから最新のDebianパッケージを取得します。これは手動で正常に動作します。
今、cronジョブを介してこのプロセスを自動化する必要がありますが、repreproパスフレーズはプロンプトです。

Bashスクリプト経由でパスワードを送信する可能性はありますか? repreproのマンページに何も見つかりませんでした。

2
P4tR

同じものが必要で、解決策を探していました。一度だけ(たとえば、ブート中に)パスワードを要求し、次の使用のためにそれをキャッシュするgpg-agentを実行することは別として、私は何も見つけていません。

問題は、標準入力からユーザー入力を要求する対話型スクリプトと対話する方法です。 Expectapt-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に表示されるためです。

5
mkudlacek

他の回答で述べたように、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環境変数をエクスポートするか、スクリプト内の環境変数を実際のパスワードに置き換えるか、他のことを行うことができます。必要な適切なレベルのセキュリティを使用します。

3
Ronny Andersson