svn:自動的にサーバー証明書を受け入れる

svn:自動的にサーバー証明書を受け入れる

svnリポジトリからいくつかのコードを取得するビルドプロセスを自動化したいと思います。サーバー証明書は自動的に信頼されません。

試したがうまくいかなかったもの:

  1. svn checkout --non-interactive --trust-server-cert --username name --password password --no-auth-cache -r revision https://server.address/trunk/

    明らかにする

    svn: E230001: Server SSL certificate verification failed: certificate has expired, issuer is not trusted

  2. echo "t" | svn checkout --username name --password password --no-auth-cache -r revision https://server.address/trunk/

    同じ結果につながる

    svn: E230001: Server SSL certificate verification failed: certificate has expired, issuer is not trusted

ただし、使用時

svn checkout --username name --password password --no-auth-cache -r revision https://server.address/trunk/

その後、ダイアログボックスが表示され、(R)eject or accept (t)emporarily?「t」を押すとソースがインポートされます。

特に、手動の方法とecho "t"方法は実際には同じでなければならないので混乱します。これについての説明があるか、考えられる解決策を知っている人はいますか?

答え1

ユーザー入力を要求する前にストリームがフラッシュされ、指定された文字列が削除されるため、入力がecho "t"無視される可能性が高くなります。この動作は、不要な入力によって何かが破損したり元に戻せない操作を引き起こす可能性がある重要な問題で非常に一般的です。これを確認するために使用できます。svnechostrace

Dalvenjiaで使用されているソリューションがexpect機能する可能性があり(技術的に競合状態がまだ存在していても)、フラッシュが通過するのを待つ迅速で汚れた方法を試すことができます。

{sleep 3; echo "t"; } | svn checkout ...

答え2

を使用すると、expectユーザーの対話をシミュレートするコマンドラインアプリケーションをインストールし、次のスクリプトを新しい実行可能ファイルにコピーできます。

#!/usr/bin/expect -f

set timeout 20
set user [lindex $argv 0]
set password [lindex $argv 1]

spawn svn checkout --username $user --password $password --no-auth-cache -r revision https://server.address/trunk/

expect "(R)eject or accept (t)emporarily?" { send "t\r" }

interact

必要に応じてスクリプトを編集します。デフォルトでは、コマンドを実行して出力を読み取り、tを「入力」して返し(\ r)、セッションを解放します。

タイムアウトは、expect放棄する前に出力を待つ時間で、ユーザーとパスワードはコマンドライン引数で設定される変数なので、次のようにスクリプトを呼び出す必要があるか、expectscript.exp user passwordこれらの2行を削除してユーザーとパスワードを入力できます。ビルドラインから直接。


編集する:

他の考えられる解決策:

これにより、svnフォークされたプロセスから端末に回答を継続的に送信し、回答を読む前にSTDINを「クリーンアップ」することができます。

# The following command will fork to the background
# and keep sending 't^M' (^M is return) for 5 seconds to the terminal
{ for X in {1..5}; do printf %b 't\r' >$(tty); sleep 1; done } &

svn checkout --username name --password password --no-auth-cache -r revision https://server.address/trunk/

効果があったらいいのに試してみる方法がないですね。

編集2:

もう一度考えると、これは対話型セッションでは機能できますが、スクリプトでは機能しないことがわかりました。

編集3:

パイプラインで回答が遅れることがありますか?

(echo -n; sleep 5; printf %b 't\r') | svn checkout --username name --password password --no-auth-cache -r revision https://server.address/trunk/

答え3

AFAIK、この--trust-server-certオプションは期限切れの証明書を許可しません。不明な認証機関でのみ機能すると思います。 SVNバージョンは、次のようにこの動作に影響を与える可能性があります。この問題

echo動作を複製できないため、このコマンドが機能しない理由がわかりません。 「t」は、入力できる他のプロンプトまたはポイントに再エコーできます。代わりに、次のyesコマンドを試すことができます。

yes 't'

コマンドの一部として:

yes 't' | svn checkout --username name --password password --no-auth-cache -r revision https://server.address/trunk/

答え4

--trust-server-certこのオプションが有効になったら、--non-interactive次のように使用します。

svn checkout --username $user --password $passwd -r $Revision --no-auth-cache --trust-server-cert --non-interactive https://server/trunk/ local_checkout_path

確かに良い運動です。

以下はいくつかのサンプルコードです。

#!/bin/bash
user=$0
passwd=$1
svn checkout --username $user --password $passwd -r $Revision --no-auth-cache --trust-server-cert --non-interactive https://server/trunk/ local_checkout_path

関連情報