svn: Serverzertifikat automatisch akzeptieren

svn: Serverzertifikat automatisch akzeptieren

Ich möchte einen Build-Prozess automatisieren, bei dem Code aus einem SVN-Repository abgerufen wird. Dem Serverzertifikat wird nicht automatisch vertraut.

Dinge, die ich versucht habe, die aber nicht funktionieren:

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

    führt zu

    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/

    führt zum selben Ergebnis

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

Bei der Verwendung

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

dann erscheint der Dialog (R)eject or accept (t)emporarily?und wenn man 't' drückt, wird die Quelle geholt.

Besonders die manuelle Methode und die echo "t"Methode verwirren mich, denn eigentlich sollte es das Gleiche sein. Hat jemand eine Erklärung dafür oder kennt eine Lösung, die funktionieren könnte?

Antwort1

Ihre echo "t"Eingabe wird höchstwahrscheinlich ignoriert, weil svnder Stream geleert wird, bevor der Benutzer zur Eingabe aufgefordert wird, sodass die von bereitgestellte Zeichenfolge echoverworfen wird. Dieses Verhalten ist bei wichtigen Fragen weit verbreitet, bei denen eine unerwünschte Eingabe etwas ruinieren oder zu Aktionen führen könnte, die nicht rückgängig gemacht werden können. Sie können stracedies bestätigen, indem Sie verwenden.

Die von Dalvenjia verwendete Lösung expectwird wahrscheinlich funktionieren (obwohl technisch gesehen immer noch ein Race Condition vorliegen wird), oder Sie können versuchen, auf die schnelle und einfache Art und Weise über das Leeren hinaus zu warten:

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

Antwort2

Sie können verwenden expect. Dabei handelt es sich um eine Befehlszeilen-Anwendung zum Simulieren von Benutzerinteraktionen. Installieren Sie sie einfach und kopieren Sie das folgende Skript in eine neue ausführbare Datei.

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

Bearbeiten Sie das Skript einfach nach Ihren Wünschen. Im Wesentlichen führt es den Befehl aus und liest die Ausgabe, gibt dann t ein und gibt return(\r) ein und gibt die Sitzung frei.

Das Timeout gibt an, wie lange expectauf die Ausgabe gewartet wird, bevor aufgegeben wird. Benutzer und Kennwort sind Variablen, die über Befehlszeilenargumente festgelegt werden. Sie müssen das Skript also so aufrufen, expectscript.exp user passwordoder Sie können diese beiden Zeilen einfach entfernen und Benutzer und Kennwort direkt in die Spawn-Zeile einfügen.


BEARBEITEN:

Andere mögliche Lösung:

Dadurch kann möglicherweise svnSTDIN vor dem Lesen der Antwort „bereinigt“ werden, indem die Antwort ständig von einem gegabelten Prozess an das Terminal gesendet wird.

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

Ich hoffe, es funktioniert. Ich habe keine Möglichkeit, es auszuprobieren.

EDIT2:

Bei näherer Überlegung funktioniert dies möglicherweise in einer interaktiven Sitzung, aber nachweislich nicht mit einem Skript.

EDIT3:

Vielleicht die Antwort in einer Pipe verzögern?

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

Antwort3

Die --trust-server-certOption akzeptiert keine abgelaufenen Zertifikate, soweit ich weiß. Ich glaube, sie funktioniert nur für unbekannte Zertifizierungsstellen. Ihre SVN-Version kann dieses Verhalten ebenfalls beeinflussen, wie indiese Frage.

Ich bin mir nicht wirklich sicher, warum der echoBefehl nicht funktioniert, da ich das Verhalten nicht reproduzieren kann. Das „t“ wird möglicherweise an eine andere Eingabeaufforderung oder Stelle zurückgesendet, an der eine Eingabe möglich ist. Stattdessen können Sie den folgenden yesBefehl versuchen:

yes 't'

Als Teil Ihres Befehls:

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

Antwort4

Wenn Sie --trust-server-certdie --non-interactiveOption aktiviert haben, gehen Sie folgendermaßen vor:

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

Das wird sicher klappen.

Hier ist ein Beispielcode:

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

verwandte Informationen