svn: aceita automaticamente o certificado do servidor

2

Eu gostaria de automatizar um processo de construção que envolve obter algum código de um repositório svn. O certificado do servidor não é confiável automaticamente.

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

  1. 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 o 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" -method me confundem, porque na verdade deve ser a mesma coisa. Alguém tem uma explicação para isso ou conhece uma solução que poderia funcionar?

    
por user236012 22.10.2016 / 18:13

3 respostas

1

Sua entrada echo "t" é ignorada, provavelmente porque svn libera o fluxo antes de solicitar a entrada do usuário, portanto, a sequência fornecida por echo é descartada. Esse comportamento é bastante difundido para questões importantes em que uma entrada indesejada pode arruinar algo ou levar a ações impossíveis de desfazer. Você pode usar strace para confirmar isso.

A solução usando expect por Dalvenjia provavelmente funcionará (embora tecnicamente uma condição de corrida ainda esteja lá), ou você pode tentar esperar após o flush the quick & caminho sujo:

{sleep 3; echo "t"; } | svn checkout ...
    
por 26.10.2016 / 14:53
1

Você pode usar o expect , é um aplicativo de linha de comando para simular a interação do usuário, basta instalá-lo e copiar o seguinte script em 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 de acordo com as suas necessidades, basicamente ele executará o comando e lerá a saída, depois "digitará" e retornará (\ r) e liberará a sessão

O tempo limite é por quanto tempo expect irá esperar 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 password ou você pode remova essas duas linhas e coloque o usuário e a senha diretamente na linha de desova.

EDITAR:

Outra solução possível:

Isso pode cuidar de svn "limpeza" 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.

EDIT2:

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

EDIT3:

Talvez atrasar a resposta em um tubo?

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

A opção --trust-server-cert não aceita certificados expirados, AFAIK. Eu acredito que só funciona para autoridades de certificação desconhecidas. Sua versão do SVN também pode afetar esse comportamento, conforme indicado em pergunta .

Não sei ao certo por que o comando echo não está funcionando, pois não posso 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 comando yes :

yes 't'

Como parte do seu comando:

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