
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
Dalvenjia가 사용하는 솔루션은 expect
작동할 가능성이 높습니다(기술적으로 경쟁 조건은 여전히 존재하지만). 또는 빠르고 더러운 방법으로 플러시를 지나서 기다릴 수 있습니다.
{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
옵션은 만료된 인증서(AFAIK)를 허용하지 않습니다. 알 수 없는 인증 기관에서만 작동한다고 생각합니다. 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