
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:
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
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 svn
der Stream geleert wird, bevor der Benutzer zur Eingabe aufgefordert wird, sodass die von bereitgestellte Zeichenfolge echo
verworfen 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 strace
dies bestätigen, indem Sie verwenden.
Die von Dalvenjia verwendete Lösung expect
wird 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 expect
auf 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 password
oder 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 svn
STDIN 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-cert
Option 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 echo
Befehl 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 yes
Befehl 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-cert
die --non-interactive
Option 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