Question

Je crée actuellement un travail de nuit qui appelle un script Unix qui crée et transfère un fichier à l'aide de ftp . Je voudrais vérifier tous les codes de retour possibles. La page de manuel pour ftp ne répertorie pas les codes de retour. Est-ce que quelqu'un sait où trouver une liste? Quelqu'un avec de l'expérience avec ça? Nous avons d'autres scripts qui grep pour certaines chaînes de retour dans le journal et ils envoient un courrier électronique en cas d'erreur. Cependant, ils manquent souvent des codes imprévus. Je suis ensuite en train de mettre la raison dans le journal et le courrier électronique.

Était-ce utile?

La solution

La commande ftp ne renvoie rien d'autre que zéro dans la plupart des implémentations rencontrées.

Il est préférable de traiter les codes à trois chiffres du journal. Si vous envoyez un fichier binaire, vous pouvez vérifier que les octets envoyés sont corrects.

Les codes à trois chiffres sont appelés "codes de série" et une liste est disponible ici

Autres conseils

J'ai écrit un script pour ne transférer qu'un fichier à la fois. Dans ce script, utilisez grep pour rechercher le message 226 Transfert terminé . S'il le trouve, grep renvoie 0.

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

Installez le package ncftp . Il est fourni avec ncftpget et ncftpput qui tentera à chaque fois de charger / télécharger un fichier et renverra un code d'erreur descriptif en cas de problème. Voir les & # 8220; Diagnostics & # 8221; section de la page de manuel .

Je pense qu'il est plus facile d'exécuter le ftp et de vérifier le code de sortie de ftp en cas de problème.

Je l'ai fait comme dans l'exemple ci-dessous:

# ...
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

Modifier: Pour intercepter les erreurs, je récupère la sortie de la commande ftp. Mais ce n’est vraiment pas la meilleure solution.

Je ne sais pas à quel point vous êtes familier avec un langage de script tel que Perl, Python ou Ruby. Ils ont tous un module FTP que vous pouvez utiliser. Cela vous permet de vérifier les erreurs après chaque commande. Voici un exemple en 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;

Pour que cette logique fonctionne, l'utilisateur doit rediriger STDERR aussi bien à partir de la commande ftp que ci-dessous

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

La commande ci-dessous attribuera toujours 0 (succès) car la commande ftp ne renverra ni succès ni échec. Donc, l'utilisateur ne devrait pas en dépendre

EXITFTP=$?

réponse nue je sais, mais que diriez-vous d'obtenir les sources FTP et de voir par vous-même

J'aime la solution d'Anurag. Pour le problème des octets transférés, j'ai étendu la commande avec grep -v "octets"

.

c'est-à-dire

grep "^ 530" ftp_out2.txt | grep -v "octet"

-au lieu de 530, vous pouvez utiliser tous les codes d’erreur comme Anurag.

Vous avez dit que vous vouliez envoyer le fichier par FTP ici, mais vous n'avez pas précisé si le client FTP BSD ordinaire était ou non le seul moyen de le récupérer. BSD FTP ne vous donne pas de code de retour pour les conditions d'erreur nécessitant toute cette analyse, mais il existe toute une série d'autres programmes Unix qui peuvent être utilisés pour transférer des fichiers par FTP si vous ou votre administrateur les installez. Je vais vous donner quelques exemples de moyens de transférer un fichier par FTP tout en détectant toutes les conditions d'erreur avec de petites quantités de code.

FTPUSER est votre identifiant d'utilisateur ftp

FTPPASS est votre mot de passe ftp

FILE est le fichier local que vous voulez télécharger sans aucune information sur le chemin (par exemple, fichier1.txt, pas /wther/file1.txt ou autre / file1.txt

FTPHOST est la machine distante à laquelle vous voulez envoyer un FTP

REMOTEDIR est un CHEMIN ABSOLU à l’emplacement de la machine distante sur laquelle vous souhaitez télécharger

.

Voici les exemples:

curl --user $ FTPUSER: $ FTPPASS -T $ FICHIER ftp: // $ FTPHOST /% 2f $ REMOTEDIR

ftp-upload --host $ FTPHOST --user $ FTPUSER --password $ FTPPASS --as $ REMOTEDIR / $ FILE $ FILE

tnftp -u ftp: // $ FTPUSER: $ FTPPASS @ $ FTPHOST /% 2f $ REMOTEDIR / $ FILE $ FILE

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

Tous ces programmes renverront un code de sortie différent de zéro en cas de problème, ainsi qu'un texte indiquant ce qui a échoué. Vous pouvez tester cela, puis faire ce que vous voulez avec le résultat, le connecter, l'envoyer par courrier électronique, etc. comme vous le souhaitez.

Notez cependant les points suivants:

  1. "% 2f" est utilisé dans les URL pour indiquer que le chemin suivant est un chemin absolu sur la machine distante. Cependant, si votre serveur FTP vous chrootera, vous ne pourrez pas le contourner.

  2. pour les commandes ci-dessus qui utilisent une URL réelle ( ftp: // etc ) sur le serveur avec l'utilisateur. et le mot de passe qui y est intégré, le nom d'utilisateur et le mot de passe DOIVENT être codés en URL s'ils contiennent des caractères spéciaux.

  3. Dans certains cas, vous pouvez être flexible avec le répertoire distant étant absolu et le fichier local étant simplement le nom de fichier ordinaire une fois que vous êtes familiarisé avec la syntaxe de chaque programme. Vous devrez peut-être simplement ajouter une variable d’environnement de répertoire local ou simplement tout coder en dur.

  4. SI vous devez impérativement utiliser un client FTP standard, vous pouvez tester l'échec en insérant une commande dans le script, y compris une commande qui place le fichier, puis une autre qui effectue une opération GET identique. fichier le renvoyant sous un nom différent. Après la fermeture de FTP, testez simplement l’existence du fichier téléchargé dans votre script shell, ou même contrôlez-le par rapport à l’original pour vous assurer qu’il a été transféré correctement. Oui, ça pue, mais à mon avis, il est préférable d’avoir un code facile à lire que des tonnes d’analyses pour toutes les erreurs possibles. BSD FTP n’est tout simplement pas si bon.

Voici ce avec quoi je suis finalement allé. Merci pour votre aide. Toutes les réponses m'aident à aller dans la bonne direction. Il est peut-être un peu excessif de vérifier à la fois le résultat et le journal, mais cela devrait couvrir toutes les bases.

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

Pourquoi ne pas simplement stocker toutes les sorties de la commande dans un fichier journal, puis vérifier le code de retour de la commande et, si ce n'est pas à 0, envoyer le fichier journal dans l'email?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top