&attach_input |
sftp1 |
put foo |
sftp -b sftp2_input [email protected] |
sftp -b sftp2_input [email protected] |
안타깝게도 sftp는 입력 파일에 있는 모든 요청을 단순히 차례로 실행할 뿐이며, 전송이 성공했는지 여부를 테스트할 수 있는 메커니즘이 없습니다.
명령어 매크로를 사용할 수 없다면 대안이 있을까요? gnu_tools 제품에는 expect라는 프로그램이 포함되어 있습니다. 이 프로그램은 명령어를 전송하고, 다양한 응답을 기다린 후 출력 스트림에서 확인한 내용에 따라 작업을 수행하는 데 사용할 수 있습니다. 저는 expect 전문가는 아니지만, 그림 6의 스크립트가 시작하는 데 도움이 될 것입니다. 웹에서 "expect 스크립트"를 검색하면 제 간단한 예제를 사용자 정의하는 데 도움이 될 많은 참고 자료를 찾을 수 있습니다.
# If we get an end-of-file (eof) it means that the sftp process# 이 절차는 키 문자열을 찾는 정규 표현식 일치를 수행합니다# 실행된 명령어로부터 수집된 출력에서. 이 경우 # 저는 단지 오류 유형을 보고할 뿐이지만 다른 조치도 가능합니다 # 또한. 나도 오직 2개의 오류를 확인합니다. 다른 오류들도 있습니다. 당신은 # 발견하는 대로 추가하세요. # proc checkforerrors {buf cmd} { if [정규 표현식 {.*not found} $buf] { puts "명령어 실패: 찾을 수 없음" 1을 반환합니다 } if [정규 표현식 {.*Permission denied} $buf] { “$cmd 실패 : 접근 문제”를 출력합니다. 1을 반환합니다 } 0을 반환합니다 }# 타임아웃을 -1로 설정하여 타임아웃이 없도록 합니다. 기본값은 10초입니다. # 그리고 대부분의 파일 전송은 그보다 더 오래 걸립니다. 저는 설정하지 않기로 결정했습니다. # 타임아웃, 변경할 수 있습니다. 타임아웃 설정 -1 # sftp 시작 # sftp 프롬프트를 기다리되, 인증 프롬프트( # 테스트를 위한 편리한 디렉토리로 변경 # 모든 수집된 문자를 send "put foo" send "get bar" "quitr"을 |
expect sftp3.exp잘못된 서버에 연결되었거나 서버가 재시작되었습니다.이 스크립트를 다시 실행하기 전에 서버 키를 검증해야 합니다. 준비 완료 10:41:10 |
expect sftp3.expsftp> get bar원격 파일을 찾을 수 없습니다: 해당 파일 또는 디렉터리가 없습니다 파일 "/SysAdmin/Noah_Davids/sftp_test/bar"을 찾을 수 없습니다. sftp> get bar FAILED : not found ready 10:42:11 |
마지막으로, 제 FTP 블로그에서 FTP가 아직 열려 있는 파일을 읽을 수 있어 때때로 불완전한 파일이 전송되는 경우가 있다고 언급한 바 있습니다. FTP 매크로가 특정 위치에 파일이 나타날 때까지 기다린 후 전송하는 경우, 해당 파일이 더 이상 잠겨 있지 않은지 반드시 확인해야 한다고 제안했습니다. 동일한 문제가 SFTP에서도 발생할 수 있으며 해결 방법도 동일합니다. 파일 잠금 확인을 명령 매크로(그림 9)에 배치한 후, 파일이 더 이상 잠겨 있지 않을 때 적절한 스크립트와 함께 expect를 호출할 수 있습니다.
&label AGAIN |
