
Я хотел бы автоматизировать процесс сборки, который включает получение некоторого кода из репозитория svn. Сертификат сервера не является автоматически доверенным.
Что я пробовал, но не работает:
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
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
для подтверждения этого.
Решение, предложенное expect
Dalvenjia, скорее всего, сработает (хотя технически состояние гонки все равно будет), или вы можете попробовать подождать после промывки быстрым и грязным способом:
{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