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"輸入很可能被忽略,因為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或您可以刪除這兩行並將使用者和直接在生成線上輸入密碼。


編輯:

其他可能的解決方案:

這可能會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

相關內容