OSX bash脚本工作但在SFTP上的crontab中失败

时间:2011-07-23 09:59:52

标签: macos bash cron sftp

这个主题已经详细讨论过,但是,我对主题的变体是我无法破解的。现在两天,并决定ping社区。 THx提前阅读..

EXEC键。总结一下,我在OS X中有一个运行正常的脚本,并且在手动完成时执行没有问题或错误。当我将脚本放在crontab中以便每天运行时它仍然运行,但它不会运行所有命令(特别是SFTP)。

我已经阅读了足够多的帖子来介绍环境问题,正如您将在下面看到的那样,在发生PATH问题时,我很难引用SFTP的位置......

我唯一能想到的是IdentityFile。注意:我将这个放在crontab中,而不是root用户。所以我理解应该拾取我创建的id_dsa.pub(并且已经与服务器共享)..

我没有尝试做任何时髦的期望命令绕过密码等。我不知道为什么从cron运行时它正在跳过SFTP线。

请参阅下面的代码..非常感谢帮助.. 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

1 个答案:

答案 0 :(得分:3)

不是答案,只是对您的代码的评论。

  • 使用空格处理文件名的方法是引用变量:"$var" - eval不是要走的路。养成引用所有变量的习惯,除非你特别想要使用不引用的副作用。

  • 除非您调用的命令希望在环境中看到它们,否则您不需要export变量。

  • 您不需要两次调用date,因为YYMMDD值是DATE的子字符串:YYMMDD="${DATE:0:6}"

  • 只是偏好:我在脚本中使用$HOME而不是~

  • 你从不使用“file2”临时文件 - 为什么要创建它?

  • 因为你的sftp批处理文件非常简单,所以你真的不需要一个文件:

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


这是一个重写,大大缩短了:

#!/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}"