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
이 두 줄을 제거하고 사용자와 비밀번호를 입력할 수 있습니다. 빌드 라인에서 직접.
편집하다:
다른 가능한 해결 방법:
이렇게 하면 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
AFAIK, 이 --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