
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:
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
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 svn
libera 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 strace
para confirmar isso.
A solução usada expect
por 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 expect
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 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-cert
opçã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 echo
comando 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 yes
comando:
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-cert
com a --non-interactive
opçã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