这个主题已经详细讨论过,但是,我对主题的变体是我无法破解的。现在两天,并决定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
答案 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}"