2012-05-01 37 views
0

我已經通過Linux shell腳本打開了一個到遠程服務器的SFTP連接,現在我需要進入目錄/distribution中的最後創建的目錄並從它下載文件,代碼如下所示:通過sftp連接進入最後創建的目錄

lftp -u ${sourceEnv},${sourcePass} sftp://${sourceHost}<<EOF 
cd $sourceBuildDir/distribution 
variable=$(ls -t -r | tail -n 1) 
cd $variable 
mget * 
bye 
EOF 

,但它不通過SFTP連接既不是命令工作LS -t -r | tail -n 1本身也不是變量創建。 有什麼建議嗎? 在此先感謝

+1

sftp用於傳輸文件。如果你想運行遠程命令,你需要全面的SSH來調用遠程shell –

+0

嗨馬克B, 你能請指教我如何創建一個SSH連接與自動密碼注入(我不能使用關鍵認證 - 公司機器)? 謝謝。 – Rob

回答

2

在馬克B的同一精神的答案,我不認爲你可以做到所有的內部lftp。 特別是我不認爲它支持用戶變量...(我應該檢查...)

因此,對於某些目的,您可以調用從lftp腳本內部啓動lftp的shell。例如:

# This is a lftp script (like yours) 
ls -tr| ! "tail -1|awk '{print $NF}'" 

'!'傳遞給unix shell。被稱爲「尾巴」的是系統尾巴,而不是一些lftp命令。 awk也是如此,我只用它來獲取dir的名稱(lft的ls給出所有文件的權限等等)。

對於更復雜的事情(根據您的要求),我相信你會更好與其他shell命令一樣,使用lftp的shell腳本。你的例子會變成這樣:

# Call lftp to log in and do 'ls', capture the ouput and process it. 
    sourceBuildDir=$(lftp -c "open ${sourceEnv}:${sourcePass}@${sourceHost}; ls" \ 
        |tail -1|awk '{print $NF}'); 
    echo "I am about to download $sourceBuildDir"; 
    # Call lftp with the processed dir name and do the rest 
    # (btw. did you consider using the 'mirror' command?) 
    lftp -c "open ${sourceEnv}:${sourcePass}@${sourceHost}; \ 
      cd $sourceBuildDir/distribution; mget *"; 

P.S. 有時lftp命令產生額外的東西,如「[FEAT negotiation ...]」,可能會破壞腳本。你也許可以通過重複lftp命令兩次來解決問題,這樣他們第二次成功時不需要通過lftp進一步協商。

希望這有助於走上正確的軌道!乾杯。