로컬 디렉터리와 원격 디렉터리 경로를 입력하고 파일을 원격 디렉터리로 보내는 하위 sh 파일이 있습니다. 원격 경로가 유효하지 않으면 오류를 감지할 수 없습니다.
sh 스크립트 내의 콘텐츠 예:
sftp [email protected] <<==
cd $remote_dir <= error happens here
lcd $local_dir <= error did not happen so the return code resets
put a.tar
bye
==
$result=$?
return $result
일부 응용 프로그램은 sh 파일을 호출한 다음 반환 코드를 사용하여 파일이 성공적으로 전송되었는지 확인합니다. 그렇다면 로컬 파일을 어딘가에 백업한 다음 삭제하십시오.
문제는 파일 전송에 실패하더라도 쉘이 0을 반환한다는 것입니다. 파일은 실제로 복사되지 않습니다. 명령을 수동으로 실행하면 오류가 발생하고 화면에 경로를 찾을 수 없다고 표시되지만 작업으로 실행하면 실패하는 것을 볼 수 있습니다.
다른 방법은 2단계 프로세스를 수행하는 것입니다. 먼저 경로가 존재하는지 확인한 다음 로그 파일로 출력하고 로그에 오류가 있는지 확인하고, 오류가 없으면 sftp put 쉘 스크립트를 호출할 수 있습니다. 다른 방법이 있는지 궁금합니다.
답변1
sftp
다음 옵션을 사용하여 실행하세요 -b
.
sftp -b - [email protected] <<==
cd etc.
==
~에서sftp
수동:
-비배치
모드는 표준 입력 대신 입력 배치 파일에서 일련의 명령을 읽습니다. 사용자 상호작용이 부족하므로 비대화형 인증과 함께 사용해야 합니다. 배치 파일 "-"를 사용하여 표준 입력을 나타낼 수 있습니다.sftp가 중단됩니다다음 명령 중 하나라도 실패할 경우: get, put, reget, reput, rename, ln, rm, mkdir,목차,이,목차, chmod, chown, chgrp, lpwd, df, 기호 링크 및 lmkdir. "-" 문자를 앞에 추가하여 명령별로 오류 종료를 억제할 수 있습니다(예: -rm /tmp/blah*).
답변2
SFTP에서 오류를 처리하는 것은 고통스럽습니다. SFTP 스크립트 언어에는 조건부 구성이 없습니다. 미리 정의된 명령 시퀀스 이외의 작업을 수행하려면 각 명령 후에 서버의 출력을 구문 분석해야 합니다. 와 같은 도구를 사용하여 이 작업을 수행할 수 있지만 expect
상당한 작업이 필요하며 모든 상황을 다루었는지 확인하기가 어렵습니다.
보여준 예에서는 다음을 사용할 수 있습니다.
echo "put $local_dir/a.tar $remote_dir" | sftp [email protected]
그러나 일반적으로 오류 처리는 복잡합니다.
따라서 SFTP를 사용하지 마십시오. 대신 다음을 사용하여 원격 서버를 설치하십시오.SSHFS. SSHFS는 내부적으로 SFTP를 사용하므로 서버에 특별한 구성이 필요하지 않습니다. 넌 그냥 갖고 있으면 돼퓨즈고객을 위해 일하십시오.
SSHFS는 로컬 컴퓨터에 마운트된 파일 시스템으로 원격 파일 보기를 제공합니다. 따라서 등과 같은 일반 명령을 사용하여 각 파일의 위치에 신경 쓰지 않고 파일을 조작할 수 있습니다 cd
( cp
성능 측면에서는 제외 - 예를 들어 로컬 위치에서 원격 위치로 파일을 복사하는 것은 업로드 대역폭보다 빠르지 않습니다). .
set -e
mkdir myserver
sshfs [email protected]/ myserver
cp -p "$local_dir/a.tar" "myserver/$remote_dir/"
…
fusermount -u
답변3
팁/조언 따르기 자일스의 대답, stderr 리디렉션이 우리에게 효과적입니다.
sftp -q host <<--- > script.log 2> scripterr.log
get nonex.txt
bye
---
그런 다음 scripterr.log
"찾을 수 없음"을 확인하십시오.