Expect 스크립트의 변수에서 캐리지 리턴(\r) 제거

Expect 스크립트의 변수에서 캐리지 리턴(\r) 제거

설정 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)첫 번째 대괄호 세트로 캡처된 텍스트를 가져오는 데 사용됩니다 .

관련 정보