svn: автоматически принимать сертификат сервера

svn: автоматически принимать сертификат сервера

Я хотел бы автоматизировать процесс сборки, который включает получение некоторого кода из репозитория svn. Сертификат сервера не является автоматически доверенным.

Что я пробовал, но не работает:

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

    результаты в

    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/

    приводит к тому же результату

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

Однако при использовании

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

затем появляется диалоговое окно (R)eject or accept (t)emporarily?, и при нажатии «t» извлекается источник.

Особенно меня смущает ручной метод и echo "t"метод, потому что это должно быть одно и то же. Есть ли у кого-нибудь объяснение этому или кто-нибудь знает решение, которое могло бы сработать?

решение1

Ваш echo "t"ввод, скорее всего, игнорируется, поскольку svnочищает поток перед запросом ввода у пользователя, поэтому строка, предоставленная echoотбрасывается. Такое поведение довольно распространено для важных вопросов, где нежелательный ввод может что-то испортить или привести к действиям, которые невозможно отменить. Вы можете использовать straceдля подтверждения этого.

Решение, предложенное expectDalvenjia, скорее всего, сработает (хотя технически состояние гонки все равно будет), или вы можете попробовать подождать после промывки быстрым и грязным способом:

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

решение2

Вы можете использовать expect— это приложение командной строки для имитации взаимодействия с пользователем, просто установите его и скопируйте следующий скрипт в новый исполняемый файл.

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

Просто отредактируйте скрипт по своему усмотрению. По сути, он выполнит команду и прочитает вывод, затем «напечатает» t и вернет (\r), а затем завершит сеанс.

Тайм-аут определяет, как долго expectбудет ждаться вывод, прежде чем прекратить работу, пользователь и пароль — это переменные, которые будут установлены из аргументов командной строки, поэтому вы должны вызвать скрипт как expectscript.exp user passwordили вы можете просто удалить эти 2 строки и поместить пользователя и пароль непосредственно в строку создания.


РЕДАКТИРОВАТЬ:

Другое возможное решение:

Это может обеспечить svn«очистку» STDIN перед чтением ответа путем постоянной отправки ответа из разветвленного процесса на терминал.

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

Надеюсь, это сработает, но у меня нет возможности это проверить.

ПРАВКА2:

Если подумать, это может сработать в интерактивном сеансе, но, скорее всего, не в сценарии.

РЕДАКТИРОВАНИЕ3:

Может быть, отложить ответ в трубку?

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

решение3

Насколько мне известно, эта --trust-server-certопция не принимает просроченные сертификаты. Я считаю, что она работает только для неизвестных центров сертификации. Ваша версия SVN также может влиять на это поведение, как указано вэтот вопрос.

Я не совсем уверен, почему echoкоманда не работает, так как я не могу воспроизвести поведение. 't' может быть отображено в другой подсказке или точке, где возможен ввод. Вместо этого вы можете попробовать команду yes:

yes 't'

В рамках вашего приказа:

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

решение4

При использовании --trust-server-certс --non-interactiveвключенной опцией используйте ее следующим образом:

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

Это наверняка сработает.

Вот пример кода:

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

Связанный контент