2014-12-24 3 views
1

원격 서버에 특정 파일의 존재를 알 수있는 expect 스크립트를 작성하고 있습니다. 내 테스트 서버는 원격 서버와 동일한 네트워크에 있습니다. 비슷한 물건에 대해 stackoverflow를 통해 검색하려고했지만 찾을 수있는 것은 로컬 서버에서 작동하는 스크립트를 기대합니다.원격 서버에 파일 존재를 찾기위한 스크립트가 필요합니다.

이 링크 (How to find if a file exists in expect script)가 가장 근접했습니다. "

#! /usr/bin/expect 

set fileName [lindex $argv 0] 
set hostIp "10.0.0.1" 

puts "SSH to server" 
spawn sftp [email protected]$hostIp 
sleep 2 
expect "Password:" 
sleep 2 
exp_send "local123\r" 
sleep 2 
expect "sftp> " 
sleep 2 
set prompt "sftp> " 

exp_send "ls $fileName\r" 
sleep 2 

expect { 
"$fileName" { send_user "\n Found \n" } 
"sftp>" { send_user "\n Not Found \n" } 
} 

에 관계없이에 대한 응답의 - 내 스크립트 기대 작성하는 노력 모두를 기반으로

스크립트 기대 Expect with SFTP

- 비슷한 라인에

난에 다음 웹 사이트를 발견 ls $ fileName ", 출력을"Found "로 얻습니다. 기대의 논리는 부분이었다 -

스크립트 출력이 "FOUND"입니다 찾을 수 찾을 수 없습니다 논리

spawn sftp [email protected] 
Connecting to 10.0.0.1... 
CentOS release 6.2 (Final) 
Kernel 2.6.32-279.14.1.el6.x86_64 on an x86_64 

Password: 
sftp> ls file1.txt 
file1.txt 

로직 두 경우에 따라서

spawn sftp [email protected] 
Connecting to 10.0.0.1... 
CentOS release 6.2 (Final) 
Kernel 2.6.32-279.14.1.el6.x86_64 on an x86_64 

sftp> ls file2.txt 
Couldn't stat remote file: No such file or directory 
Can't ls: "/file2.txt" not found 
sftp> 

난을하지 않는 곳이다 논리. 파일이 있으면 파일 이름이 팝업 될 것으로 예상됩니다. 그 외에는 "Could not state ....."라는 메시지를보기를 기대합니다.

질문

  1. 는 프롬프트를 감지 기대할 수 있습니까? 어딘가에 저장할 수 있습니까?

  2. 원격 서버에 파일이 있는지 확인하는 더 좋은 방법이 있습니까?

  3. 내 스크립트에 문제가 있습니까?

도움을 주셔서 감사합니다.

+0

$ fileName은 (는) 발견 된 응답과 찾을 수없는 응답에 모두 존재합니다. –

+0

@BradLanam - 파일이 발견되면 "ls $ fileName"의 출력은 fileName 자체가됩니다. 발견 된 논리 에서처럼. 파일은 그 다음없는 인쇄 것이 발견되지 않는 경우 - 원격 파일에 시작할 수 없습니다 : 는 LS 할 수 없습니다 그런 파일이나 디렉토리 : "/file2.txt는"SFTP> –

답변

0

Expecttcl이 수행 할 수있는 모든 작업을 수행 할 수 있습니다. 물론 프롬프트를 일부 변수에 저장하고 더 많이 사용할 수 있습니다.

set prompt "sftp> $" 

여기에 $ 기호가 무엇입니까? 기본적으로 expect은 glob 스타일과 일치하고 ^은 시작 부분을 일치시키는 데 사용되며 $은 문자열의 끝과 일치시킵니다.

당신은 당신이 얻을하려고하는 방법은 expect에 관해서 유일하게 좋은 접근 방식을 무엇이든간에

expect $prompt 

로 코드에서 사용할 수있다.

스크립트에 몇 가지 문제점이 있습니다. Brad Lanam이 지적했듯이 파일 존재 여부를 확인하기 위해 일치 기준으로 filename을 사용해서는 안됩니다.

절충 방식은 파일을 사용할 수없는 경우, 우리는 분명히 기준 파일을 사용할 수없는 경우입니다 No such file or directory로 메시지를 받고

#!/usr/bin/expect 
if {$argc!=1} { 
     puts "\nUsage : $argv0 <file-name>\n" 
     exit 
} 
set prompt "sftp> $"; # To match 'sftp> ' at the end 
set filename [lindex $argv 0]; # User input 
set timeout 60; # 1 min 
spawn sftp dinesh1,[email protected]; # Replace this with your sftp server 
expect "Password:" 
send "mypassword\r" 
expect $prompt 
send "cd htdocs\r" 
expect $prompt 
send "ls $filename\r" 
expect { 
     "No such file or directory" { puts "\n\n File is not available :(\n\n" } 
     -re "\n$filename\\s+\n$prompt" { puts "\n\n File is available :) \n\n" } 
     timeout { puts "\n\n timeout happened :(\n\n" } 
} 

과 같이 쓸 수있다. 파일 존재하는 경우

는, 출력 명령 ls dinesh.txt가 출력에 두 번 볼되고있는 이유

sftp>ls dinesh.txt 
ls dinesh.txt 
dinesh.txt 
sftp> 

당신은 궁금 할 것이다, 다음과 같습니다. 이는 스폰 된 프로세스가 send을 통해 전송 된 명령을 다시 표시하기 때문입니다. 다음과 같이 (이것은 다른 이야기입니다. 당신이 관심이 있다면에 대해 더 알고 here에서 찾아 보게한다)

이 일치를, 내가

-re "\n$filename\\s+\n$prompt" 

로 정규 표현식을 사용하고 내가 일치하도록 시도하고있다 ,

dinesh.txt 
sftp> 

\n - 이전 라인

$filename에서있는 새로운 라인을 일치하는 -이 것 지정된 파일명으로 옮겨 놓을 수 있습니다. 즉, 'dinesh.txt'

\\s+은 - 일치하는 둘 이상의 공간보다

$prompt -이는 경우 시간 초과의 경우에서 마지막으로, 나는 timeout을 추가 한 'SFTP> $'

를 대체됩니다 expect와 함께 발생합니다. 기본 제한 시간 값은 10 초이며 스크립트에서 60 초로 변경되었습니다.

참고 : 파일 이름과 프롬프트 사이에 공백이 여러 개인 경우 알아야합니까? 왜 파일 이름, 줄 바꿈 및 프롬프트와 같을 수 없는지. 결과를 봄으로써 우리는 이와 같은 결론을 내릴 수 있습니다. 찾을 수있는 마법이 없기 때문에 expect-d (또는 exp_internal 1) 옵션으로 표시되는 이유가 있습니다. 이러한 옵션으로 트리거하면 예상 전문가가됩니다. :)

+0

를 찾을 수 없음이 명확 해 주셔서 감사합니다 스크립트에 대한 설명. 나는 이제 내 기대 스크립트에 어떤 문제점이 있는지 이해했다. 귀하의 제안과 의견으로 스크립트를 성공적으로 업데이트했습니다. 그것은 내가 예상했던 것과 똑같은 방식으로 작동합니다. 도와 주셔서 감사합니다. –

관련 문제