2008-09-26 83 views
3

我目前正在創建一個通宵調用Unix腳本的作業,該腳本依次使用ftp創建和傳輸文件。我想檢查所有可能的返回碼。 ftp的手冊頁未列出返回碼。有誰知道在哪裏可以找到清單?任何有此經驗的人?我們有其他一些腳本,它們會記錄日誌中的某些返回字符串,並在發生錯誤時發送電子郵件。但是,他們經常錯過未曾預料的代碼。 然後我將原因放入日誌和電子郵件中。從Unix腳本中檢查ftp返回代碼

+0

感謝你們,你們可能知道,我的Unix腳本並不是那麼遙遠。我基本上是由過去在這裏工作的人從其他腳本開始工作的。不過,我想讓它比我目前發現的更加防彈。我很感激迄今爲止所有的答案。 – 2008-09-26 15:49:35

+0

基本上我的代碼到目前爲止如下:回聲「打開$ ftpip pwd二進制lcd /輸出cd /輸入$ datafile退出」| ftp -iv> $ ftpreturn -v選項看起來像我需要的。但是$ ftpreturn變量是空白的。該文件沒有獲得ftp'd並且正在失敗。我錯過了什麼? – 2008-09-26 15:51:02

回答

7

ftp命令不會返回上大多數實現零以外的任何東西,我已經遇到。

處理日誌中的三位數字代碼會更好 - 如果您發送的是二進制文件,則可以檢查發送的字節是否正確。

三位數的代碼被稱爲「碼序列」和一個列表,可以發現here

+0

對不起是一個痛苦,但我有2個問題。 1)但日誌在哪裏?我認爲它會在$ ftpreturn。 2)如何檢查發送的字節? – 2008-09-26 16:35:33

-1

爲什麼不直接將命令的所有輸出存儲到日誌文件中,然後檢查命令的返回碼,如果不是0,則在電子郵件中發送日誌文件?

1

跛腳的答案,我知道,但如何讓ftp的來源,看看自己

+0

我該如何解決這個問題? – 2008-09-26 16:35:02

2

我認爲這是更容易地運行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 

編輯:捕捉錯誤的grep我ftp命令的輸出。但它確實不是最好的解決方案。

我不知道你有多熟悉Perl,Python或Ruby等Scriptlanguage。他們都有一個可以使用的FTP模塊。這使您可以在每個命令後檢查錯誤。這裏有一個Perl的例子:

#!/usr/bin/perl -w 
use Net::FTP; 
$ftp = Net::FTP->new("example.net") or die "Cannot connect to example.net: [email protected]"; 
$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; 
4

安裝ncftp包。它配備了ncftpgetncftpput,每個都會嘗試上傳/下載單個文件,並在出現問題時返回描述性錯誤代碼。請參閱man page的「診斷」部分。

0

這是我終於跟着去的。感謝所有的幫助。所有的答案都能幫助我走向正確的方向。 它可能有點矯枉過正,檢查結果和日誌,但它應該涵蓋所有的基礎。

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

你說你想FTP那裏的文件,但你沒有說是否常規的BSD FTP客戶端是唯一的方式,你想要它在那裏。 BSD FTP並不會爲錯誤條件提供返回代碼,因此需要進行所有解析,但是如果您或您的管理員將安裝它們,則可以使用一系列其他Unix程序來通過FTP傳輸文件。我會給你一些通過FTP傳輸文件的方法,同時還能用少量代碼捕獲所有錯誤條件。

名爲ftpuser是你的FTP用戶的登錄名

FTPPASS是你的FTP密碼

FILE是你想不帶任何路徑信息上傳(比如FILE1.TXT,不/whatever/file1.txt本地文件或什麼/ FILE1.TXT

FTPHOST是要FTP到

REMOTEDIR遠程機器是一個絕對路徑的位置,您要上傳到

在遠程機器上10

這裏是例子:

捲曲--user $名爲ftpuser:$ FTPPASS -T $文件時ftp:// $ FTPHOST /%2F $ REMOTEDIR

FTP上傳--host $ FTPHOST - 用戶$名爲ftpuser --password $ FTPPASS --as $ REMOTEDIR/$文件$ FILE

tnftp -u的ftp:// $名爲ftpuser:$ FTPPASS @ $ FTPHOST /%2F $ REMOTEDIR/$文件$ FILE

wput $ FILE ftp:// $ FTPUSER:$ FTPPASS @ $ FTPHOST /%2f $ REMOTEDIR/$ FILE

所有這些pr如果出現任何錯誤,則圖形將返回非零退出代碼,以及指示失敗的文本。你可以測試這個,然後做任何你想要的輸出,記錄它,給它發電子郵件等,如你所願。

不過請注意以下內容:

  1. 「%2F」在URL中使用,以表明以下路徑是在遠程機器上的絕對路徑。但是,如果您的FTP服務器chroots你,你將無法繞過這一點。

  2. 對於上述使用實際URL(ftp://etc)的服務器的用戶名和密碼嵌入到服務器中,如果用戶名和密碼包含特殊字符,則必須進行URL編碼。

  3. 在某些情況下,只要熟悉每個程序的語法,就可以靈活地使用遠程目錄作爲絕對文件,本地文件只是普通文件名。你可能只需要添加一個本地目錄環境變量或者只是硬編碼一切。

  4. 如果您確實絕對必須使用普通的FTP客戶端,您可以通過以下方式之一來測試故障:在腳本內部,包括首先執行PUT文件的命令,然後是另一個執行同一文件的GET以不同的名字返回它。 FTP退出後,只需在shell腳本中測試下載文件的存在性,或者甚至針對原始文件檢查下載文件,以確保其正確傳輸。是的,這太臭了,但在我看來,最好是讓代碼易於閱讀,而不是爲每個可能的錯誤條件進行大量的解析。 BSD FTP並不是那麼棒。

1

我喜歡從阿努拉格溶液,對於字節轉移的問題,我已經延長使用grep -v命令 「字節」

grep的 「^ 530」 ftp_out2。txt | grep -v「byte」

-insert of 530 you can use all error codes as Anurag did。

5

我寫了一個腳本,一次只能傳輸一個文件,並在該腳本中使用grep來檢查226 Transfer complete消息。如果它發現它,grep返回0.

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