我想自动化构建过程,其中涉及从 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