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"됩니다 . 이 동작은 원치 않는 입력으로 인해 무언가가 망가지거나 실행 취소가 불가능한 작업으로 이어질 수 있는 중요한 질문에 대해 매우 널리 퍼져 있습니다. 이를 확인하는 데 사용할 수 있습니다 .svnechostrace

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

관련 정보