svn: acepta automáticamente el certificado del servidor

svn: acepta automáticamente el certificado del servidor

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:

  1. 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

  2. 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 svnvacía la secuencia antes de pedirle entrada al usuario, por lo que la cadena proporcionada por echose 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 stracepara confirmar eso.

La solución que usa expectDalvenjia 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 expectque 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 passwordo 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 echocomando 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 yescomando:

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-certcon la --non-interactiveopció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

información relacionada