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

相关内容