설정 Ubuntu 16.04에는 스크립트가 필요합니다
아래의 간단한 스크립트에서 목표는 ssh를 사용하여 원격 시스템의 디렉터리에서 가장 오래된 .zip 파일을 찾는 것입니다.
그런 다음 scp를 사용하여 이 파일을 로컬 "workingBuild" 디렉터리에 다운로드합니다.
현재 스크립트
#!/usr/bin/expect
set user "hidden"
set pass "hidden"
set sourceDir "/opt/tomcat/someDirectoryName/"
set workingDir "/home/someUser/workingBuild"
spawn sh -c "ssh $user@www ls -t $sourceDir | head -1"
expect "password:"
send "$pass\r"
expect -re ".*\.zip"
set sourceFile $expect_out(0,string)
spawn sh -c "echo 'bob'$sourceFile'bob2'"
spawn sh -c "scp $user@www:$sourceDir$sourceFile $workingDir"
expect {
password: {send "$pass\r"; exp_continue}
}
질문
저장된 파일 이름 앞에 숨겨진 캐리지 리턴(\r)을 사용하여 $sourceFile 변수를 채우는 것 같습니다. 그러면 scp 명령이 파일 이름과 대상 디렉터리를 새 줄에 넣기 때문에 문제가 발생합니다. 잘못된 명령 결과:
spawn sh -c scp meliudaj@www:/opt/tomcat/someDirectoryName/
build_0.0.1.zip /home/meliudaj/workingBuild
위 코드의 다음 디버그 라인도 이를 보여줍니다.
spawn sh -c "echo 'bob'$sourceFile'bob2'"
$sourceFile'bob2'는 항상 'bob' 아래의 새 줄에 있습니다.
원하는 결과는 다음과 같습니다.
spawn sh -c scp meliudaj@www:/opt/tomcat/someDirectoryName/ build_0.0.1.zip /home/meliudaj/workingBuild
질문
$sourceFile 변수에서 \r을 제거하는 방법 또는 (\r)이 처음에 나타나는 것을 방지하기 위해 $sourceFile 변수를 다르게 채우는 방법은 무엇입니까?
추신: 저는 sed, awk 및 tr을 사용하여 다양한 시도를 시도했지만 아무 것도 도움이 되지 않는 것 같습니다.
답변1
비밀번호를 보내고 "Enter"를 누른 후 ssh가 가장 먼저 하는 일은 개행 문자를 내보내는 것입니다. Expect_out 버퍼에서 추출한 텍스트에서는 이를 고려하지 않았습니다. 또한 기대는 CRNL을 사용하여 줄 바꿈을 나타냅니다. 이는 일부 네트워크 프로토콜 표준과 일치해야 한다는 것을 이해합니다.
이 대화형 예상 세션은 문제를 거의 재현합니다. 마지막으로 변수 내용을 외부 명령으로 보내 od
그 내용을 정확히 확인합니다.
expect1.1> spawn sh -c {read password; ls -t | head -1}
spawn sh -c read password; ls -t | head -1
42945
expect1.2> send "\r"
expect1.3> expect "*.zip"
somefile.zip
expect1.4> set sourceFile $expect_out(0,string)
somefile.zip
expect1.5> exec od -c << $sourceFile
0000000 \r \n s o m e f i l e . z i p
0000016
당신이 원하는 것은 ".zip"으로 끝나는 텍스트를 캡처하는 것입니다.마지막 개행 문자 뒤. 정규식을 사용하는 것은 매우 간단합니다.
expect1.1> spawn sh -c {read password; ls -t | head -1}
spawn sh -c read password; ls -t | head -1
42992
expect1.2> send "\r"
expect1.3> expect -re {.*\r\n(.*\.zip)}
somefile.zip
expect1.4> set sourceFile $expect_out(1,string)
somefile.zip
expect1.5> exec od -c << $sourceFile
0000000 s o m e f i l e . z i p
0000014
(1,string)
첫 번째 대괄호 세트로 캡처된 텍스트를 가져오는 데 사용됩니다 .