svnリポジトリからいくつかのコードを取得するビルドプロセスを自動化したいと思います。サーバー証明書は自動的に信頼されません。
試したがうまくいかなかったもの:
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
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"
無視される可能性が高くなります。この動作は、不要な入力によって何かが破損したり元に戻せない操作を引き起こす可能性がある重要な問題で非常に一般的です。これを確認するために使用できます。svn
echo
strace
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