
我想自動化建置過程,其中涉及從 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
或您可以刪除這兩行並將使用者和直接在生成線上輸入密碼。
編輯:
其他可能的解決方案:
這可能會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