2011-07-23 136 views
0

本主题已经被详细讨论过,但是,我有一个主题变体,我无法破解。现在两天,并决定平社区。 THx提前阅读..OSX bash脚本可以正常工作,但在SFTP的crontab中失败

执行。总结是我有一个在OS X中的脚本,运行良好,手动完成时没有问题或错误执行。当我把脚本放在crontab中,每天运行它仍然运行,但它并不运行所有的命令(特别是SFTP)。

我已阅读足够的岗位走下来的环境问题的路径,所以你会看到下面,我很难引用的路径问题的情况下SFTP的位置...

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

我不想做任何时髦的expect命令来绕过密码,等等。我不知道为什么从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

您正在为临时文件做一件辛苦的工作,用maketmp保持它简单(http://developer.apple .com/library/mac/#documentation/Darwin/Reference/ManPages/man3/mktemp.3.html) – hmontoliu

+0

'eval'是复杂且危险的,不要在不需要时使用它。在这里你不需要它,所以删除它;您确实需要将'FEED =“〜/ Dropbox /”'更改为'FEED =〜/ Dropbox'。用'A =“$(mktemp)”'替换'A =“/ tmp/some_fixed_name”'。 (这些不是问题的原因。)密钥上是否有密码?如果有的话,你如何期待'sftp'获得它? – Gilles

+0

...另外,为什么你使用这个疯狂的号码不需要的“eval”命令。我的第一个建议是,你应该简化你的脚本,删除多余或不需要的复杂东西。 – hmontoliu

回答

3

不是一个答案,只是评论你的代码。

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

  • 你不需要export你的变量,除非有你打电话的命令,希望在环境中看到它们。

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

  • 只是一个偏好:我在脚本中使用$HOME超过~

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

  • 因为您的SFTP批处理文件是非常简单的,你并不需要为它指定一个文件:

    printf "%s\n" "get -r *" "quit" | sftp -b - "[email protected]$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}" 
相关问题