Ich schreibe ein BASH-Shell-Skript, um alle Dateien in einem Verzeichnis auf einen Remote-Server hochzuladen und sie dann zu löschen. Es wird alle paar Stunden über einen CRON-Job ausgeführt.
Mein komplettes Skript ist unten. Das Grundproblem ist, dass der Teil, der herausfinden soll, ob die Datei erfolgreich hochgeladen wurde oder nicht, nicht funktioniert. Der Exit-Status des SFTP-Befehls ist immer "0", unabhängig davon, ob der Upload tatsächlich erfolgreich war oder nicht.
Wie kann ich herausfinden, ob eine Datei korrekt hochgeladen wurde oder nicht, damit ich weiß, ob ich sie löschen oder zulassen soll?
#!/bin/bash
# First, save the folder path containing the files.
FILES=/home/bob/theses/*
# Initialize a blank variable to hold messages.
MESSAGES=""
ERRORS=""
# These are for notifications of file totals.
COUNT=0
ERRORCOUNT=0
# Loop through the files.
for f in $FILES
do
# Get the base filename
BASE=`basename $f`
# Build the SFTP command. Note space in folder name.
CMD='cd "Destination Folder"\n'
CMD="${CMD}put ${f}\nquit\n"
# Execute it.
echo -e $CMD | sftp -oIdentityFile /home/bob/.ssh/id_rsa bob@ftp.example.edu
# On success, make a note, then delete the local copy of the file.
if [ $? == "0" ]; then
MESSAGES="${MESSAGES}\tNew file: ${BASE}\n"
(( COUNT=$COUNT+1 ))
# Next line commented out for ease of testing
#rm $f
fi
# On failure, add an error message.
if [ $? != "0" ]; then
ERRORS="${ERRORS}\tFailed to upload file ${BASE}\n"
(( ERRORCOUNT=$ERRORCOUNT+1 ))
fi
done
SUBJECT="New Theses"
BODY="There were ${COUNT} files and ${ERRORCOUNT} errors in the latest batch.\n\n"
if [ "$MESSAGES" != "" ]; then
BODY="${BODY}New files:\n\n${MESSAGES}\n\n"
fi
if [ "$ERRORS" != "" ]; then
BODY="${BODY}Problem files:\n\n${ERRORS}"
fi
# Send a notification.
echo -e $BODY | mail -s $SUBJECT bob@example.edu
Aufgrund einiger betrieblicher Überlegungen, die meinen Kopf verletzen, kann ich SCP nicht verwenden. Der Remote-Server verwendet WinSSHD unter Windows und verfügt nicht über EXEC-Berechtigungen. Daher schlagen SCP-Befehle mit der Meldung "Exec-Anforderung auf Kanal 0 fehlgeschlagen" fehl. Das Hochladen muss daher über den interaktiven SFTP-Befehl erfolgen.
sftp
Exits und welcher Exit-Status angezeigt werden. Ich bin froh, dass das den Trick gemacht hat.