简体   繁体   中英

OSX bash script works but fails in crontab on SFTP

this topic has been discussed at length, however, I have a variant on the theme that I just cannot crack. Two days into this now and decided to ping the community. THx in advance for reading..

Exec. summary is I have a script in OS X that runs fine and executes without issue or error when done manually. When I put the script in the crontab to run daily it still runs but it doesnt run all of the commands (specifically SFTP).

I have read enough posts to go down the path of environment issues, so as you will see below, I hard referenced the location of the SFTP in the event of a PATH issue...

The only thing that I can think of is the IdentityFile. NOTE: I am putting this in the crontab for my user not root. So I understand that it should pickup on the id_dsa.pub that I have created (and that has already been shared with the server)..

I am not trying to do any funky expect commands to bypass the password, etc. I dont know why when run from the cron that it is skipping the SFTP line.

please see the code below.. and help is greatly appreciated.. thx

#!/bin/bash
export DATE=`date +%y%m%d%H%M%S`
export YYMMDD=`date +%y%m%d`
PDATE=$DATE
YDATE=$YYMMDD
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
FEED="~/Dropbox/"

USER="user"
HOST="host.domain.tld"

A="/tmp/5nPR45bH"

>${A}.file1${PDATE}
>${A}.file2${PDATE}

BYEbye ()
{
rm ${A}.file1${PDATE}
rm ${A}.file2${PDATE}

echo "Finished cleaning internal logs"
exit 0 
}


echo "get -r *" >> ${A}.file1${PDATE}
echo "quit" >> ${A}.file1${PDATE}

eval mkdir ${FEED}${YDATE}
eval cd ${FEED}${YDATE}


eval /usr/bin/sftp -b ${A}.file1${PDATE} ${USER}@${HOST}

BYEbye
exit 0

Not an answer, just comments about your code.

  • The way to handle filenames with spaces is to quote the variable: "$var" -- eval is not the way to go. Get into the habit of quoting all variables unless you specifically want to use the side effects of not quoting.

  • you don't need to export your variables unless there's a command you call that expects to see them in the environment.

  • you don't need to call date twice because the YYMMDD value is a substring of the DATE: YYMMDD="${DATE:0:6}"

  • just a preference: I use $HOME over ~ in a script.

  • you never use the "file2" temp file -- why do you create it?

  • since your sftp batch file is pretty simple, you don't really need a file for it:

    printf "%s\n" "get -r *" "quit" | sftp -b - "$USER@$HOST"


Here's a rewrite, shortened considerably:

#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
FEED_DIR="$HOME/Dropbox/$(date +%Y%m%d)"
USER="user"
HOST="host.domain.tld"

mkdir "$FEED_DIR" || { echo "could not mkdir $FEED_DIR"; exit 1; }
cd "$FEED_DIR"
{
  echo "get -r *"
  echo quit
} | 
sftp -b - "${USER}@${HOST}"

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM