
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 を「入力」して return(\r) し、セッションを解放します。
タイムアウトは、expect
出力を待つ時間の長さです。ユーザーとパスワードは、コマンド ライン引数から設定される変数なので、スクリプトを として呼び出す必要があります。expectscript.exp user password
または、これらの 2 行を削除して、ユーザーとパスワードを spawn 行に直接配置することもできます。
編集:
その他の解決策:
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
この--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