FTP를 통해 파일이 올바르게 전송되었는지 확인하세요.

FTP를 통해 파일이 올바르게 전송되었는지 확인하세요.

스크립트는 FTP를 통해 파일을 보낸 다음 삭제합니다. 하지만 전송이 끝나기 전에 파일이 삭제되어 빈 파일이 수신되는 경우도 있습니다.

#!/bin/bash

tar czf <sourcefile> --directory=<directory> log
ftp -v -n $1 <<END_OF_SESSION
user <user> <password>
put <sourcefile> <targetfile>
bye
END_OF_SESSION

rm <sourcefile>

전송이 완료된 후 삭제되도록 프로세스를 동기화하는 좋은 방법은 무엇입니까?

아래 업데이트에서 볼 수 있듯이 가끔 연결이 되지 않는 경우가 있습니다.

노트:

루분투 16.04에서 실행 중입니다.

진행하면서 업데이트하세요 tar.

실패한 세션에 대한 로그 정보:

Connected to IP
220 (vsFTPd 3.0.2)
331 Please specify the password.
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
200 Switching to Binary mode.
local: /home/user01/tmp/log.tgz remote: E1/180418090056
200 PORT command successful. Consider using PASV.
425 Failed to establish connection.
221 Goodbye.

그리고 성공적인 것:

Connected to IP
220 (vsFTPd 3.0.2)
331 Please specify the password.
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
200 Switching to Binary mode.
local: /home/user01/tmp/log.tgz remote: E1/180418090344
200 PORT command successful. Consider using PASV.
150 Ok to send data.
226 Transfer complete.
6901 bytes sent in 0.00 secs (43.5848 MB/s)
221 Goodbye.

답변1

ftp명령에는 전송이 성공했는지 확인하는 기능이 없습니다. 이 FTP 전송 구현을 계속 사용해야 하는 경우 다음 두 가지 옵션이 있습니다.

  1. 전송된 파일을 로컬 임시 파일로 다운로드하고 소스 파일과 바이트 단위로 비교합니다.
  2. FTP 클라이언트에서 실행 ls하고 파일 길이가 예상한 것과 같은지 확인하십시오. 이는 ls서버에 따라 다르며 서버 구현에 따라 달라질 수 있다는 점을 명심하세요 .

rsyncFTP를 대체하거나 완전히 대체하는 것 외에 가장 좋은 솔루션은 scp안정적인 전송 상태를 제공하는 다른 FTP 클라이언트를 사용하는 것입니다.

#!/bin/bash
tar czf <sourcefile> --directory=<directory> log
lftp -u '<user>,<password>' -e 'put -E <source> -o <target>; quit' "$1"

lftp명령은 대부분의 Linux 배포판에서 사용할 수 있습니다. 이 -E플래그는 put명령을 다음과 같이 구성합니다 mv. 즉, cp성공적인 전송 후 소스 파일을 삭제합니다.

관련 정보