
Me gustaría automatizar un proceso de compilación que implica obtener código de un repositorio svn. El certificado del servidor no es de confianza automáticamente.
Cosas que probé pero que no funcionan:
svn checkout --non-interactive --trust-server-cert --username name --password password --no-auth-cache -r revision https://server.address/trunk/
resultados en
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/
da como resultado el mismo resultado
svn: E230001: Server SSL certificate verification failed: certificate has expired, issuer is not trusted
Sin embargo, al utilizar
svn checkout --username name --password password --no-auth-cache -r revision https://server.address/trunk/
luego (R)eject or accept (t)emporarily?
aparece el cuadro de diálogo y, al presionar 't', se recupera la fuente.
Particularmente me confunde el método manual y el echo "t"
método, porque en realidad debería ser lo mismo. ¿Alguien tiene una explicación para esto o conoce una solución que podría funcionar?
Respuesta1
Su echo "t"
entrada se ignora probablemente porque svn
vacía la secuencia antes de pedirle entrada al usuario, por lo que la cadena proporcionada por echo
se descarta. Este comportamiento está bastante extendido en cuestiones importantes en las que una entrada no deseada podría arruinar algo o dar lugar a acciones imposibles de deshacer. Podrías usar strace
para confirmar eso.
La solución que usa expect
Dalvenjia probablemente funcionará (aunque técnicamente seguirá existiendo una condición de carrera), o puede intentar esperar más allá del lavado de la manera rápida y sucia:
{sleep 3; echo "t"; } | svn checkout ...
Respuesta2
Puede usar expect
, es una aplicación de línea de comandos para simular la interacción del usuario, simplemente instálela y copie el siguiente script en un nuevo archivo ejecutable.
#!/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
Simplemente edite el script según sus necesidades, básicamente ejecutará el comando y leerá el resultado, luego "escribirá" t y regresará (\r) y liberará la sesión.
El tiempo de espera es el tiempo expect
que esperará la salida antes de darse por vencido, el usuario y la contraseña son variables que se establecerán a partir de los argumentos de la línea de comando, por lo que debe llamar al script como expectscript.exp user password
o simplemente puede eliminar esas 2 líneas y poner el usuario y contraseña directamente en la línea de generación.
EDITAR:
Otra posible solución:
Esto podría encargarse de svn
"limpiar" STDIN antes de leer la respuesta enviando constantemente la respuesta desde un proceso bifurcado al 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, no tengo forma de probarlo.
EDITAR2:
Pensándolo bien, esto puede funcionar en una sesión interactiva, pero probablemente no en un guión.
EDITAR3:
¿Quizás retrasar la respuesta en una tubería?
(echo -n; sleep 5; printf %b 't\r') | svn checkout --username name --password password --no-auth-cache -r revision https://server.address/trunk/
Respuesta3
El--trust-server-cert
opción no acepta certificados caducados, AFAIK. Creo que sólo funciona para autoridades certificadoras desconocidas. Su versión de SVN también podría afectar este comportamiento, como se indica enesta pregunta.
No estoy realmente seguro de por qué el echo
comando no funciona ya que no puedo replicar el comportamiento. La 't' puede repetirse en un mensaje o punto diferente donde es posible realizar entradas. En su lugar, puedes probar el yes
comando:
yes 't'
Como parte de tu comando:
yes 't' | svn checkout --username name --password password --no-auth-cache -r revision https://server.address/trunk/
Respuesta4
Cuando lo use --trust-server-cert
con la --non-interactive
opción habilitada, úselo de esta manera:
svn checkout --username $user --password $passwd -r $Revision --no-auth-cache --trust-server-cert --non-interactive https://server/trunk/ local_checkout_path
Esto seguramente funcionará.
Aquí hay un código de muestra:
#!/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