svn: aceita automaticamente o certificado do servidor

svn: aceita automaticamente o certificado do servidor

Gostaria de automatizar um processo de construção que envolve a obtenção de algum código de um repositório SVN. O certificado do servidor não é automaticamente confiável.

Coisas que tentei, mas que não funcionam:

  1. svn checkout --non-interactive --trust-server-cert --username name --password password --no-auth-cache -r revision https://server.address/trunk/

    resulta em

    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/

    resulta no mesmo resultado

    svn: E230001: Server SSL certificate verification failed: certificate has expired, issuer is not trusted

No entanto, ao usar

svn checkout --username name --password password --no-auth-cache -r revision https://server.address/trunk/

então a caixa de diálogo (R)eject or accept (t)emporarily?aparece e, ao pressionar 't', a fonte é buscada.

Particularmente o método manual e o echo "t"método me confundem, pois na verdade deveriam ser a mesma coisa. Alguém tem uma explicação para isso ou conhece uma solução que possa funcionar?

Responder1

Sua echo "t"entrada é ignorada provavelmente porque svnlibera o fluxo antes de solicitar a entrada do usuário, portanto, a string fornecida por echoé descartada. Este comportamento é bastante difundido para questões importantes onde uma entrada indesejada pode arruinar algo ou levar a ações impossíveis de desfazer. Você poderia usar stracepara confirmar isso.

A solução usada expectpor Dalvenjia provavelmente funcionará (embora tecnicamente uma condição de corrida ainda exista), ou você pode tentar esperar além da descarga da maneira rápida e suja:

{sleep 3; echo "t"; } | svn checkout ...

Responder2

Você pode usar expect, é um aplicativo de linha de comando para simular a interação do usuário, basta instalá-lo e copiar o script a seguir para um novo arquivo executável.

#!/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

Basta editar o script conforme sua necessidade, basicamente ele irá executar o comando e ler a saída, então irá "digitar" t e retornar(\r) e liberar a sessão

O tempo limite é quanto tempo expectesperará pela saída antes de desistir, o usuário e a senha são variáveis ​​que serão definidas a partir dos argumentos da linha de comando, então você deve chamar o script como expectscript.exp user passwordou pode simplesmente remover essas 2 linhas e colocar o usuário e senha diretamente na linha de spawn.


EDITAR:

Outra solução possível:

Isso pode cuidar da svn"limpeza" do STDIN antes de ler a resposta, enviando constantemente a resposta de um processo bifurcado para o terminal.

# 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/

Espero que funcione, não tenho como tentar.

EDITAR2:

Pensando bem, isso pode funcionar em uma sessão interativa, mas provavelmente não em um script.

EDITAR3:

Talvez atrasando a resposta em um cano?

(echo -n; sleep 5; printf %b 't\r') | svn checkout --username name --password password --no-auth-cache -r revision https://server.address/trunk/

Responder3

A --trust-server-certopção não aceita certificados expirados, AFAIK. Acredito que só funciona para autoridades de certificação desconhecidas. Sua versão do SVN também pode afetar esse comportamento, conforme indicado emessa questão.

Não sei ao certo por que o echocomando não está funcionando, pois não consigo replicar o comportamento. O 't' pode ser repetido para um prompt ou ponto diferente onde a entrada é possível. Em vez disso, você pode tentar o yescomando:

yes 't'

Como parte do seu comando:

yes 't' | svn checkout --username name --password password --no-auth-cache -r revision https://server.address/trunk/

Responder4

Ao usar --trust-server-certcom a --non-interactiveopção habilitada, use desta forma:

svn checkout --username $user --password $passwd -r $Revision --no-auth-cache --trust-server-cert --non-interactive https://server/trunk/ local_checkout_path

Isso certamente dará certo.

Aqui está um exemplo de código:

#!/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

informação relacionada