2011-02-04 13 views
9

में 'ftp' कमांड से निकास स्थिति कोड प्राप्त करना मुझे कमांड लाइन प्रोग्राम से निकास स्थिति कोड को पुनः प्राप्त करने की आवश्यकता है। कोई चिंता नहीं, मैंने $ इस्तेमाल किया? लेकिन एफटीपी के लिए, भले ही यह कनेक्ट न हो, यह एफटीपी खोल खोलता है, इसलिए मैं समझ नहीं पा रहा हूं कि कनेक्शन नहीं हुआ है।लिनक्स खोल

के लिए इस कोड का प्रयास करें समझते हैं:

#!/bin/sh 

ftp 1234567 
OUT=$? 
if [ $OUT -eq 0 ];then 
    echo "ftp OK" 
else 
    echo "ftp Error: "$OUT 
fi 

exit 0 

किसी भी मदद की? धन्यवाद फिलिपो

+0

आप कोड को बहुत सरल बना सकते हैं: यदि ftp ...; फिर ...; अन्य ...; fi $ को स्पष्ट रूप से जांचने की कोई आवश्यकता नहीं है? –

उत्तर

17

आप के बजाय एफ़टीपी आदेश से सफलता संदेश की तलाश की जानी चाहिए एक स्थिति की तलाश में। यह "226 स्थानांतरण पूर्ण" है। आप इसे अपने सिस्टम पर ftp मैनुअल के साथ पुष्टि कर सकते हैं।

200 PORT command successful. 
150 Opening ASCII mode data connection for filename. 
226 Transfer complete. 
189 bytes sent in 0.145 seconds (0.8078 Kbytes/s) 

यहां एक नमूना स्क्रिप्ट है।

FTPLOG=/temp/ftplogfile 
ftp -inv <<! > $FTPLOG 
open server 
user ftp pwd 
put filename 
close 
quit 
! 

FTP_SUCCESS_MSG="226 Transfer complete" 
if fgrep "$FTP_SUCCESS_MSG" $FTPLOG ;then 
    echo "ftp OK" 
else 
    echo "ftp Error: "$OUT 
fi 
exit 0 
+0

आपके उत्तर के लिए धन्यवाद! यह वही बात है जो मैंने संदेश त्रुटि प्राप्त करने के लिए आउटपुट के लिए दो फ़ाइलों का उपयोग करके, आयुष द्वारा पोस्ट किए गए समाधान के आधार पर किया था। – Possa

1

कुछ स्क्रिप्ट करते हैं -

ftp -n $HOST > /tmp/ftp.worked 2> /tmp/ftp.failed <<END_SCRIPT 
blah blah 
END_SCRIPT 

EXITSTATUS=$? 

if [ $EXITSTATUS != "0" ] 
then 
    # handle the error... 
fi 

सिवाय कि ऊपर हमेशा काम नहीं करता - सबसे FTP क्लाइंट हमेशा 0. की स्थिति यह बदसूरत "मिथ्या नकारात्मक" की ओर जाता है के साथ बाहर निकलें: फ़ाइल स्थानांतरण विफल रहता है, लेकिन स्क्रिप्ट समस्या का पता नहीं लगाता है। सत्यापित करने के लिए

एक तरीका यह है कि एक फ़ाइल स्थानांतरण जगह ले ली - यह वापस स्थानांतरित:

#!/bin/sh 

ftp -n << END_SCRIPT 
open $1 
user $2 $3 
put $4 
get $4 retrieval.$$ 
bye 
END_SCRIPT 

if [ -f retrieval.$$ ] 
then 
    echo "FTP of $4 to $1 worked" 
    rm -f retrieval.$$ 
else 
    echo "FTP of $4 did not work" 
fi 
+0

पहले जवाब के लिए, ईमानदार होने के लिए, मैं वास्तव में आपके समाधान को बहुत अच्छी तरह समझ नहीं पा रहा हूं। – Possa

+1

मैंने आपके पहले समाधान पर काम किया है और यह थोड़ा संशोधित के साथ काम करता है: मैं ftp.worked में ftp को वर्बोज़ मोड में चलाता हूं, अगर "226 ट्रांसफर ओके" मौजूद है तो स्थानांतरण किया गया है! Elseif मैं ftp.failed से त्रुटि संदेश retrive। धन्यवाद! आपके लिए +1! – Possa

5

आप कुछ डाउनलोड करने और, तुम क्यों wget का उपयोग नहीं करते डाउनलोड सफल देखने के लिए की जरूरत है? यह एफ़टीपी प्रोटोकॉल का समर्थन करता है।

यह कई वापसी कोड (आदमी पृष्ठ से बोली) के साथ डाउनलोड की स्थिति रिपोर्ट करेंगे:

EXIT STATUS 
    Wget may return one of several error codes if it encounters problems. 
    0 No problems occurred. 
    1 Generic error code. 
    2 Parse error---for instance, when parsing command-line options, the .wgetrc or .netrc... 
    3 File I/O error. 
    4 Network failure. 
    5 SSL verification failure. 
    6 Username/password authentication failure. 
    7 Protocol errors. 
    8 Server issued an error response. 
+0

मुझे mkdir, cd, फ़ाइल डालना है ... – Possa

+0

तो wput का उपयोग करने का प्रयास करें। – user562374

+1

मैं मशीनों पर कुछ भी इंस्टॉल नहीं कर सकता। – Possa

0

पिछली बार मैं एक स्क्रिप्ट में एफ़टीपी का उपयोग करने की जरूरत है, मैं इसके साथ इतना निराश है कि मैं अंत में एक बीएसडी लाइसेंस प्राप्त FTP क्लाइंट स्रोत पाया गया और बस इसे संशोधित यह व्यवहार मैं जरूरत देने के लिए, और उपयोग ओएस के साथ प्रदान किए गए संस्करण की बजाय।

बदसूरत, लेकिन घन दीवार में सिर स्तर के छात्रों की गहराई प्राप्त करने के लिए हास्यास्पद

1

निम्न स्क्रिप्ट का प्रयास शुरू कर दिया गया था।

कॉपी करने के लिए:

#!/bin/bash 
# cftp.sh 
# set -x 

FTPSERVER="$1" 
FTPPORT="$2" 
REMOTEDIR="$3" 

[[ "$REMOTEDIR" ]] || { echo -e "Usage: $0 <ftpserver> <ftpport> <remotedir> [file1] [file2] ..." > /dev/stderr ; exit 1 ; } 

L=$((BASH_ARGC-3)) 

LOCALFILES=("${BASH_ARGV[@]:0:$L}") 

RETCODE=0 

for LOCALFILE in "${LOCALFILES[@]}" 
do 
    THISRETCODE=0 
    [[ -f "$LOCALFILE" ]] || THISRETCODE=1 

    LOCALDIR="$(dirname "$LOCALFILE")" 
    LOCALFILENAME="$(basename "$LOCALFILE")" 

    [[ $THISRETCODE = 0 ]] && 
    /usr/bin/ftp -iv "$FTPSERVER" << EOF | grep -q '226 Transfer complete' || THISRETCODE=1 
    lcd $LOCALDIR 
    cd $REMOTEDIR 
    put $LOCALFILENAME 
EOF 

    RETCODE=$((RETCODE+THISRETCODE)) 
done 

exit $RETCODE 

ले जाने के लिएः

नकल के लिए:

#!/bin/bash 
# mftp.sh 
# set -x 

FTPSERVER="$1" 
FTPPORT="$2" 
REMOTEDIR="$3" 

[[ "$REMOTEDIR" ]] || { echo -e "Usage: $0 <ftpserver> <ftpport> <remotedir> [file1] [file2] ..." > /dev/stderr ; exit 1 ; } 

L=$((BASH_ARGC-3)) 

LOCALFILES=("${BASH_ARGV[@]:0:$L}") 

RETCODE=0 

for LOCALFILE in "${LOCALFILES[@]}" 
do 
    THISRETCODE=0 
    [[ -f "$LOCALFILE" ]] || THISRETCODE=1 

    LOCALDIR="$(dirname "$LOCALFILE")" 
    LOCALFILENAME="$(basename "$LOCALFILE")" 

    [[ $THISRETCODE = 0 ]] && 
    /usr/bin/ftp -iv "$FTPSERVER" << EOF | grep -q '226 Transfer complete' || THISRETCODE=1 
    lcd $LOCALDIR 
    cd $REMOTEDIR 
    put $LOCALFILENAME 
EOF 

    [[ $THISRETCODE = 0 ]] && 
    /bin/rm -f "$LOCALFILE" || THISRETCODE=1 

    RETCODE=$((RETCODE+THISRETCODE)) 
done 

exit $RETCODE 

यहाँ कुछ परीक्षण मामलों रहे हैं।

$ ./cftp.sh ; echo return code: $? 
Usage: ./cftp.sh <ftpserver> <ftpport> <remotedir> [file1] [file2] ... 
return code: 1 
$ ./cftp.sh ftpserver 21 /mnt/disk4/d0/test ; echo return code: $? 
return code: 0 
$ ./cftp.sh ftpserver 21 /mnt/disk4/d0/test cftp.sh mftp.sh ; echo return code: $? 
return code: 0 
$ ./cftp.sh ftpserver 21 /mnt/disk4/d0/test *ftp.sh ; echo return code: $? 
return code: 0 
$ ./cftp.sh ftpserver 21 /mnt/disk4/d0/test cftp.s ; echo return code: $? 
return code: 1 
$ ./cftp.sh ftpserver 21 /mnt/disk4/d0/test cftp.s mftp.s ; echo return code: $? 
return code: 2 
$ ./cftp.sh ftpserver 21 /mnt/disk4/d0/tes cftp.sh ; echo return code: $? 
return code: 1 

चलने के लिए।

$ ./mftp.sh ftpserver 21 /mnt/disk4/d0/test cftp.sh ; echo return code: $? 
/bin/rm: cannot remove `cftp.sh': Permission denied 
return code: 1 
$ echo foo > /tmp/bar 
$ ./mftp.sh ftpserver 21 /mnt/disk4/d0/test /tmp/bar ; echo return code: $? 
return code: 0 
$ ls -lha /tmp/bar 
ls: cannot access /tmp/bar: No such file or directory 

अद्यतन: आदमी 5 netrc

0

एक और तरीका है पढ़ने के लिए याद रखें चारों ओर इस यदि आप अपने सर्वर पद हस्तांतरण पर फ़ाइल है जांच करने के लिए है!

कुछ की तरह ...

if ![ -s "$INPUT_DIR/HOP_PSA_Transactions_$BATCH_ID.csv" ] 
 
then 
 
    ## No Transactions file 
 
    FAIL_TIME=`date +"%d-%m-%Y %H:%M"` 
 
\t echo "ERROR: File HOP_PSA_Transactions_$BATCH_ID.csv not found @ $FAIL_TIME" >>$LOGFILE_DIR$LOGFILE_NAME 
 
\t exit $ERR_NO_TRANS_FILE  
 
fi

यदि यह वहाँ नहीं है तो इसे सफलतापूर्वक स्थानांतरित नहीं किया है!

संबंधित मुद्दे