SFTP 연결에서 일부 데이터를 다운로드한 다음 해당 FTP에서 데이터를 삭제해야 합니다. 하지만 데이터가 올바르게 다운로드되었는지 확인해야 합니다.
현재 저는 cron이 실행하는 스크립트에서 이 작업을 수행합니다.
sftp -oIdentityFile=key user@server <<EOF
mget -r *
mdelete *
bye
EOF
하지만 FTP 연결은 다음 명령만 실행하고 작업 실패 후 연결을 중단하지 않기 때문에 어떤 이유로든 다운로드가 중단되면 어차피 파일이 삭제될까 봐 걱정됩니다.
가급적이면 해시 비교를 수행하여 파일이 올바르게 다운로드되었는지 확인해야 합니다. 그러나 FTP가 이 기능을 제공하는지 매우 의심스럽기 때문에 이 문제에 대한 최선의 해결책은 무엇입니까?
이것이 가능하지 않은 경우: 모든 파일을 FTP 서버에 유지하고 새 파일만 다운로드하는 것이 해결 방법일 수 있습니다. 이것이 더 간단한 해결책인 것 같습니다. 이 솔루션에 대한 제안 사항이 있습니까?
편집: 서버에 아무런 영향을 미치지 않기 때문에 모든 파일을 삭제하기 전에 다운로드할 수 있는 가장 실용적인 솔루션을 찾고 있습니다. 나는 데이터 자체의 무결성에 대해 크게 걱정하지 않습니다(나는 SSH를 신뢰합니다).
답변1
귀하와 같은 간단한 스크립트는 sftp
빠르고 지저분한 가져오기 스크립트에는 적합하지만 이를 사용하여 파일을 삭제(특히 와일드카드 삭제)하면 재앙이 발생합니다.
스크립트의 매우 명백한 위험은 mdelete *
런타임 디렉토리의 파일뿐만 아니라 mget -r *
실행 후 소스 디렉토리에 업로드된 파일도 삭제한다는 것입니다 . mget
심지어 .mget
사용할 수 있는 다른 (더 안전한) 옵션이 몇 가지 있습니다. 다음은 두 가지입니다.
사용sshfssftp 디렉토리를 시스템 어딘가에 마운트합니다. 그런 다음 ,
cp
등 의 표준 UNIX 명령을 사용하여mv
파일을 이동할 수 있습니다. 이것이 최선의 선택입니다.rm
rsync
SFTP 라이브러리가 있는 언어(예: Perl 또는 Python 및 가장 일반적이고 현재 컴파일된 언어)를 사용하여 원격 서버에 연결하는 프로그램을 작성하고 다음을 수행합니다.
- 전송할 파일 목록 가져오기
- 각 파일에 대해 다음을 수행합니다.
- 다운로드 해
- 어떻게든 확인하세요(예: @thrig가 md5sum 파일 또는 유사한 파일 사용을 제안함)
- 괜찮다면 원격서버에서 삭제해주세요