문제

나는 현재 Unix 스크립트를 호출하는 하룻밤 작업을 만들고 있는데,이를 사용하여 파일을 생성하고 전송합니다. ftp. 가능한 모든 반품 코드를 확인하고 싶습니다. 남자 페이지 ftp 리턴 코드를 나열하지 않습니다. 목록을 어디에서 찾을 수 있는지 아는 사람이 있습니까? 이것에 대한 경험이있는 사람이 있습니까? 로그에서 특정 반환 문자열에 대해 Grep을 그린 다른 스크립트가 있으며 오류가 발생하면 이메일을 보냅니다. 그러나 그들은 종종 예상치 못한 코드를 그리워합니다. 그런 다음 이유를 로그와 이메일에 넣고 있습니다.

도움이 되었습니까?

해결책

그만큼 ftp 명령은 내가 만나는 대부분의 구현에서 0 이외의 것을 반환하지 않습니다.

로그에서 세 자리 코드를 처리하는 것이 훨씬 좋습니다. 이진 파일을 보내는 경우 전송 된 바이트가 올바른지 확인할 수 있습니다.

세 자리 코드를 '시리즈 코드'라고하며 목록을 찾을 수 있습니다. 여기

다른 팁

한 번에 하나의 파일 만 전송하기 위해 스크립트를 작성했으며 해당 스크립트에서 grep 확인하려면 226 Transfer complete 메시지. 그것을 찾으면 grep 반환 0.

ftp -niv < "$2"_ftp.tmp | grep "^226 "

설치 NCFTP 패키지. 함께 제공됩니다 ncftpget 그리고 ncftpput 각각 단일 파일을 업로드/다운로드하려고 시도하고 문제가있는 경우 설명 오류 코드로 반환합니다. "진단"섹션을 참조하십시오 남자 페이지.

FTP를 실행하고 문제가 발생하면 FTP의 종료 코드를 확인하는 것이 더 쉽다고 생각합니다.

아래의 예와 같이 이것을했습니다.

# ...
ftp -i -n $HOST 2>&1 1> $FTPLOG << EOF
quote USER $USER
quote PASS $PASSWD
cd $RFOLDER
binary
put $FOLDER/$FILE.sql.Z $FILE.sql.Z
bye
EOF

# Check the ftp util exit code (0 is ok, every else means an error occurred!)
EXITFTP=$?
if test $EXITFTP -ne 0; then echo "$D ERROR FTP" >> $LOG; exit 3; fi
if (grep "^Not connected." $FTPLOG); then echo "$D ERROR FTP CONNECT" >> $LOG; fi 
if (grep "No such file" $FTPLOG); then echo "$D ERROR FTP NO SUCH FILE" >> $LOG; fi 
if (grep "access denied" $FTPLOG ); then echo "$D ERROR FTP ACCESS DENIED" >> $LOG; fi
if (grep "^Please login" $FTPLOG ); then echo "$D ERROR FTP LOGIN" >> $LOG; fi

편집하다: 오류를 잡으려면 FTP 명령의 출력을 grep합니다. 그러나 그것은 진정으로 최고의 솔루션이 아닙니다.

나는 당신이 Perl, Python 또는 Ruby와 같은 대본으로 얼마나 가족인지 모르겠습니다. 그들은 모두 당신이 사용할 수있는 FTP 모듈을 가지고 있습니다. 이를 통해 각 명령 후 오류를 확인할 수 있습니다. 다음은 Perl의 예입니다.

#!/usr/bin/perl -w
use Net::FTP;
$ftp = Net::FTP->new("example.net") or die "Cannot connect to example.net: $@";
$ftp->login("username", "password") or die "Cannot login ", $ftp->message;
$ftp->cwd("/pub") or die "Cannot change working directory ", $ftp->message;
$ftp->binary;
$ftp->put("foo.bar") or die "Failed to upload ", $ftp->message;
$ftp->quit;

이 논리가 작업하기 위해서는 사용자가 아래와 같이 FTP 명령에서 stderr를 리디렉션해야합니다.

ftp -i -n $HOST >$FTPLOG 2>&1 << EOF

아래 명령은 FTP 명령이 성공 또는 실패를 반환하지 않기 때문에 항상 0 (성공)을 할당합니다. 따라서 사용자는 그것에 의존해서는 안됩니다

EXITFTP=$?

내가 알고있는 절름발

나는 Anurag의 솔루션을 좋아합니다. 바이트 전송 문제에 대해 GREP -V "BYTES"로 명령을 확장했습니다.

grep "^530"ftp_out2.txt | grep -v "바이트"

-530 대신 Anurag와 마찬가지로 모든 오류 코드를 사용할 수 있습니다.

당신은 당신이 파일을 FTP로 만들고 싶다고 말했지만 일반 BSD FTP 클라이언트가 당신이 그것을 얻고 싶은 유일한 방법인지는 말하지 않았습니다. BSD FTP는 모든 구문 분석이 필요한 오류 조건에 대한 반환 코드를 제공하지 않지만 귀하 또는 귀하의 관리자가 설치하는 경우 FTP로 파일을 전송하는 데 사용할 수있는 모든 일련의 다른 UNIX 프로그램이 있습니다. 코드가 거의없는 모든 오류 조건을 포착하면서 FTP로 파일을 전송하는 방법의 몇 가지 예를 제공합니다.

FTPUSER는 FTP 사용자 로그인 이름입니다

FTPPass는 FTP 비밀번호입니다

파일은 경로 정보없이 업로드하려는 로컬 파일입니다 (예 : file1.txt, not/whothate/file1.txt 또는 뭐든지/file1.txt

ftphost는 당신이 ftp로 원하는 원격 기계입니다.

Remotedir는 업로드하려는 원격 시스템의 위치로의 절대적인 경로입니다.

예는 다음과 같습니다.

Curl -user $ ftpuser : $ ftppass -t $ 파일 ftp : // $ ftphost/%2f $ remotedir

ftp-upload-host $ ftphost --user $ ftpuser--password $ ftppass -as $ remotedir/$ 파일 $ 파일

tnftp -u ftp : // $ ftpuser : $ ftppass@$ ftphost/%2f $ remotedir/$ 파일 $ 파일

wput $ 파일 ftp : // $ ftpuser : $ ftppass@$ ftphost/%2f $ remotedir/$ 파일

이 모든 프로그램은 실패한 내용을 나타내는 텍스트와 함께 전혀 잘못되면 0이 아닌 출구 코드를 반환합니다. 이를 테스트 한 다음 원하는대로 원하는대로 원하는대로 원하는대로 수행 할 수 있습니다.

그러나 다음은 다음과 같습니다.

  1. "%2F"는 URL에서 사용하여 다음 경로가 원격 시스템의 절대 경로임을 나타냅니다. 그러나 FTP 서버가 당신을 chroot하는 경우, 당신은 이것을 우회 할 수 없습니다.

  2. 실제 URL을 사용하는 위의 명령의 경우 (ftp : // 등) 사용자와 비밀번호가 포함 된 서버에 특수 문자가 포함 된 경우 사용자 이름과 비밀번호를 URL에 인코딩해야합니다.

  3. 경우에 따라 원격 디렉토리가 절대적이며 로컬 파일이 각 프로그램의 구문에 익숙해지면 일반 파일 이름 일뿐입니다. 로컬 디렉토리 환경 변수를 추가하거나 모든 것을 하드 코드 만 추가하면됩니다.

  4. 실제로, 정기적 인 FTP 클라이언트를 사용해야하는 경우, 실패를 테스트 할 수있는 한 가지 방법은 스크립트 내부에서 파일을 넣는 명령을 포함하여, 다른 파일을 다른 파일로 가져 오는 것을 포함하여 다른 방법으로, 다른 파일을 다른 파일로 가져 오는 것입니다. 이름. FTP가 종료 된 후에는 쉘 스크립트에 다운로드 된 파일의 존재를 테스트하거나 원본에 대해 확인하여 올바르게 전송되는지 확인하십시오. 예, 그 점은 악취가 있지만, 내 의견으로는 가능한 모든 오류 조건에 대해 많은 양의 구문 분석보다 읽기 쉬운 코드를 갖는 것이 좋습니다. BSD FTP는 그다지 큰 것은 아닙니다.

여기 내가 마침내 함께 갔던 것입니다. 모든 도움에 감사드립니다. 모든 대답은 나를 올바른 방향으로 인도하는 데 도움이됩니다. 결과와 로그를 모두 점검하면서 약간 과잉 일 수 있지만 모든베이스를 덮어야합니다.

echo "open ftp_ip
pwd
binary    
lcd /out
cd /in
mput datafile.csv
quit"|ftp -iv > ftpreturn.log

ftpresult=$?

bytesindatafile=`wc -c datafile.csv | cut -d " " -f 1`    
bytestransferred=`grep -e '^[0-9]* bytes sent' ftpreturn.log | cut -d " " -f 1`    
ftptransfercomplete=`grep -e '226 ' ftpreturn.log | cut -d " " -f 1`

echo "-- FTP result code: $ftpresult" >> ftpreturn.log
echo "-- bytes in datafile: $bytesindatafile bytes" >> ftpreturn.log
echo "-- bytes transferred: $bytestransferred bytes sent" >> ftpreturn.log

if [ "$ftpresult" != "0" ] || [ "$bytestransferred" != "$bytesindatafile" ] || ["$ftptransfercomplete" != "226" ]    
then    
  echo "-- *abend* FTP Error occurred" >> ftpreturn.log    
  mailx -s 'FTP error' `cat email.lst` < ftpreturn.log
else    
  echo "-- file sent via ftp successfully" >> ftpreturn.log    
fi

명령에서 로그 파일로 모든 출력을 저장 한 다음 명령에서 리턴 코드를 확인하고 0이 아닌 경우 이메일로 로그 파일을 보내는 이유는 무엇입니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top