我目前正在創建一個通宵調用Unix腳本的作業,該腳本依次使用ftp
創建和傳輸文件。我想檢查所有可能的返回碼。 ftp
的手冊頁未列出返回碼。有誰知道在哪裏可以找到清單?任何有此經驗的人?我們有其他一些腳本,它們會記錄日誌中的某些返回字符串,並在發生錯誤時發送電子郵件。但是,他們經常錯過未曾預料的代碼。 然後我將原因放入日誌和電子郵件中。從Unix腳本中檢查ftp返回代碼
回答
的ftp
命令不會返回上大多數實現零以外的任何東西,我已經遇到。
處理日誌中的三位數字代碼會更好 - 如果您發送的是二進制文件,則可以檢查發送的字節是否正確。
三位數的代碼被稱爲「碼序列」和一個列表,可以發現here
對不起是一個痛苦,但我有2個問題。 1)但日誌在哪裏?我認爲它會在$ ftpreturn。 2)如何檢查發送的字節? – 2008-09-26 16:35:33
爲什麼不直接將命令的所有輸出存儲到日誌文件中,然後檢查命令的返回碼,如果不是0,則在電子郵件中發送日誌文件?
跛腳的答案,我知道,但如何讓ftp的來源,看看自己
我該如何解決這個問題? – 2008-09-26 16:35:02
我認爲這是更容易地運行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;
這是我終於跟着去的。感謝所有的幫助。所有的答案都能幫助我走向正確的方向。 它可能有點矯枉過正,檢查結果和日誌,但它應該涵蓋所有的基礎。
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
你說你想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如果出現任何錯誤,則圖形將返回非零退出代碼,以及指示失敗的文本。你可以測試這個,然後做任何你想要的輸出,記錄它,給它發電子郵件等,如你所願。
不過請注意以下內容:
「%2F」在URL中使用,以表明以下路徑是在遠程機器上的絕對路徑。但是,如果您的FTP服務器chroots你,你將無法繞過這一點。
對於上述使用實際URL(ftp://etc)的服務器的用戶名和密碼嵌入到服務器中,如果用戶名和密碼包含特殊字符,則必須進行URL編碼。
在某些情況下,只要熟悉每個程序的語法,就可以靈活地使用遠程目錄作爲絕對文件,本地文件只是普通文件名。你可能只需要添加一個本地目錄環境變量或者只是硬編碼一切。
如果您確實絕對必須使用普通的FTP客戶端,您可以通過以下方式之一來測試故障:在腳本內部,包括首先執行PUT文件的命令,然後是另一個執行同一文件的GET以不同的名字返回它。 FTP退出後,只需在shell腳本中測試下載文件的存在性,或者甚至針對原始文件檢查下載文件,以確保其正確傳輸。是的,這太臭了,但在我看來,最好是讓代碼易於閱讀,而不是爲每個可能的錯誤條件進行大量的解析。 BSD FTP並不是那麼棒。
我喜歡從阿努拉格溶液,對於字節轉移的問題,我已經延長使用grep -v命令 「字節」
即
grep的 「^ 530」 ftp_out2。txt | grep -v「byte」
-insert of 530 you can use all error codes as Anurag did。
我寫了一個腳本,一次只能傳輸一個文件,並在該腳本中使用grep
來檢查226 Transfer complete
消息。如果它發現它,grep
返回0.
ftp -niv < "$2"_ftp.tmp | grep "^226 "
- 1. 從另一個腳本獲取shell腳本並檢查返回代碼
- 2. 檢查unix shell腳本中psql命令的返回狀態
- 3. 在Unix shell腳本中捕獲spark的返回代碼
- 4. 檢查FTP中是否存在文件的腳本代碼
- 5. GIT,檢查命令的返回代碼(bash腳本)
- 6. 從unix檢查代碼簽名
- 7. Bash腳本從NodeJs腳本返回退出代碼
- 8. unix ftp腳本中的條件
- 9. Unix Shell腳本將文件從unix位置複製到windows FTP
- 10. 「無輸出」返回代碼Shell腳本
- 11. 的Linux腳本錯誤返回代碼
- 12. 預期腳本,源代碼並返回
- 13. Google Apps腳本返回代碼500
- 14. 捕獲並檢查Unix中的bteq返回碼
- 15. FTP到MainFrame - 需要返回代碼
- 16. PowerShell腳本 - 檢查退出代碼
- 17. WinSCP腳本退出代碼檢查
- 18. Unix的返回代碼改變
- 19. 如何從sp_addlinkedserver檢索返回代碼?
- 20. 轉換ASCII代碼在Unix shell腳本
- 21. FTP從UNIX
- 22. 查看網頁輸出並返回結果的腳本/代碼
- 23. 使用shell腳本時Ant腳本返回代碼問題?
- 24. 使用PHP腳本檢查FTP狀態碼
- 25. 在選擇查詢不返回行時退出Unix腳本
- 26. 檢查從腳本
- 27. 從UNIX返回int
- 28. 捕獲從Java返回代碼在shell腳本
- 29. 從Java執行Perl腳本tomcat返回255退出代碼
- 30. 如何使用c代碼從shell腳本獲取返回值
感謝你們,你們可能知道,我的Unix腳本並不是那麼遙遠。我基本上是由過去在這裏工作的人從其他腳本開始工作的。不過,我想讓它比我目前發現的更加防彈。我很感激迄今爲止所有的答案。 – 2008-09-26 15:49:35
基本上我的代碼到目前爲止如下:回聲「打開$ ftpip pwd二進制lcd /輸出cd /輸入$ datafile退出」| ftp -iv> $ ftpreturn -v選項看起來像我需要的。但是$ ftpreturn變量是空白的。該文件沒有獲得ftp'd並且正在失敗。我錯過了什麼? – 2008-09-26 15:51:02