2011-07-23 135 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}" 
相關問題