J'ai besoin de rétrécir le code d'état de sortie d'un programme de ligne de commande. Pas de soucis, j'ai utilisé $?. Mais pour FTP, même s'il ne se connecte pas, il ouvre la coque FTP, donc je ne suis pas capable de comprendre que la connexion n'a pas eu lieu.
Essayez ce code pour comprendre: P>
#!/bin/sh ftp 1234567 OUT=$? if [ $OUT -eq 0 ];then echo "ftp OK" else echo "ftp Error: "$OUT fi exit 0
6 Réponses :
Certains scripts font - sauf que ce qui précède ne fonctionne pas toujours - la plupart des clients FTP quittent toujours avec un statut de 0. Cela conduit à des "faux négatifs" laids. : Le transfert de fichier échoue, mais le script ne détecte pas le problème. strong> p> Un moyen de vérifier qu'un transfert de fichier a eu lieu - Transférez-le: P> #!/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
Pour la première réponse, pour être honnête, je ne comprends vraiment pas très bien votre solution.
J'ai travaillé sur votre première solution et cela a fonctionné avec un peu de modification: i Exécution du FTP en mode Verbose, si dans le FTP.worked est présent, le transfert "226 OK" de sorte que le transfert a été fait! ElseSIF I Retente le message d'erreur de FTP.FAILED. Merci! +1 pour vous!
Si vous avez besoin de télécharger quelque chose et de voir si le téléchargement a réussi, pourquoi n'utilisez-vous pas wget ? Il prend en charge le protocole FTP. Cela signalera l'état du téléchargement avec plusieurs codes de retour (citation de Man): P> 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.
Je ne peux rien installer sur les machines.
Vous devez rechercher un message de réussite de la commande FTP plutôt que de rechercher un statut. C'est "226 transfert complet". Vous pouvez le confirmer avec le manuel FTP sur votre système. Voici un exemple de script. P> 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
Merci pour votre réponse! C'est la même chose que j'ai faite, basée sur la solution postée par AYUSH, en utilisant deux fichiers pour la sortie afin d'obtenir l'erreur de message.
La dernière fois que j'avais besoin d'utiliser FTP dans un script, je suis tellement frustré par le fait que j'ai enfin trouvé une source client FTP sous licence BSD et simplement la modifier pour lui donner le comportement dont j'avais besoin et a utilisé cela au lieu de la Version fournie avec le système d'exploitation. P>
moche, mais la profondeur des bosses de niveau de la tête dans la paroi du cube commençait à se ridiculer p>
Il fournit en fait un chemin d'accès à une solution - Personnalisation de l'outil est une réponse d'un programmeur et vous n'avez pas à mettre en œuvre la fonctionnalité à partir de zéro si vous commencez par la source sous licence BSD. Mais oui, wget pourrait être plus simple. Ou non surprenant aujourd'hui (mais peut-être pas quand cela a été demandé) Il existe des bibliothèques clientes FTP pour Python que je considère sérieusement si elles sont confrontées au même problème que j'étais en 2008.
Essayez les scripts suivants.
à copier: p> pour déplacer: p> voici quelques Cas de test: p> pour la copie. p> pour le déplacement. p> mise à jour: N'oubliez pas de LIRE MAN 5 NETRC P> P>
Une autre solution consiste à vérifier si vous avez le fichier sur votre transfert de courrier serveur!
quelque chose comme ... p>
p>
if ![ -s "$INPUT_DIR/HOP_PSA_Transactions_$BATCH_ID.csv" ] then ## No Transactions file FAIL_TIME=`date +"%d-%m-%Y %H:%M"` echo "ERROR: File HOP_PSA_Transactions_$BATCH_ID.csv not found @ $FAIL_TIME" >>$LOGFILE_DIR$LOGFILE_NAME exit $ERR_NO_TRANS_FILE fi
Vous pouvez considérablement simplifier le code: si ftp ...; alors ...; autre ...; fi il n'y a pas besoin de vérifier explicitement $?