2012-04-24 224 views
0

我試圖從一個文件夾上傳多個文件到FTP站點和寫這個劇本:Shell腳本加載多個FTP文件

#!/bin/bash 
for i in '/dir/*' 
do 
if [-f /dir/$i]; then 
HOST='x.x.x.x' 
USER='username' 
PASSWD='password' 
DIR=archives 
File=$i 

ftp -n $HOST << END_SCRIPT 
quote USER $USER 
quote PASS $PASSWD 
ascii 
put $FILE 
quit  
END_SCRIPT 
fi  

這是給我下面的錯誤,當我嘗試執行:

[email protected]:~/Documents/Python$ ./script.sh 
./script.sh: line 22: syntax error: unexpected end of file 

我似乎無法得到這個工作。任何幫助深表感謝。

感謝, Mayank

+0

'文件意外結束'是因爲你有'for'循環w末尾沒有匹配的「完成」。 – 2012-04-24 15:36:02

+0

爲了讓你的幫手更容易,請縮進'for','if'等控件結構體。謝謝! – Jens 2012-05-04 15:12:20

回答

1

它的抱怨,因爲您for循環沒有一個done標記指示循環的結束。您還需要在您的if更多的空間:

if [ -f "$i" ]; then 

回想一下,[實際上是一個命令,如果沒有出現這樣它不會被識別。

而且,如果您單引號您的glob(在for),那麼它將不會被展開。沒有引號,但使用$i時加了雙引號。當您使用$i時,您可能也不想包含/dir/部件,因爲它包含在您的glob中。

+0

我讓你們建議的修改,並得到以下錯誤:**用戶@主持人:命令〜/文檔/ Python的$ ./script.sh 次序錯誤。 錯誤的命令序列。 (本地文件)(遠程文件) 錯誤的命令序列。 錯誤的命令序列。 (本地文件)(遠程文件)** – maksaraswat 2012-04-24 16:13:47

0

如果我沒有記錯,ncftp可以採取通配符參數:

ncftpput -u username -p password x.x.x.x archives /dir/* 

如果您還沒有安裝它,它在您的操作系統的標準回購可能可用。

+0

'lftp'也可以做到這一點(它有一個'mput'命令做一個單一的,多文件)。 – 2012-04-24 15:29:55

+0

此外,我不認爲你的命令在這裏使用ASCII模式,使它不同於原始腳本。 – 2012-04-24 15:38:09

+0

當然,期待OP做一些*小小的工作是公平的...... :) – 2012-04-24 15:52:42

0

首先,字面,固定,你的腳本答案:

#!/bin/bash 
# no reason to set variables that don't change inside the loop 
host='x.x.x.x' 
user='username' 
password='password' 
dir=archives 
for i in /dir/*; do # no quotes if you want the wildcard to be expanded! 
    if [ -f "$i" ]; then # need double quotes and whitespace here! 
    file=$i 
    ftp -n "$host" <<END_SCRIPT 
quote USER $user 
quote PASS $password 
ascii 
put $file $dir/$file 
quit  
END_SCRIPT 
    fi 
done 

接下來,最簡單的方法:

lftp -e 'mput -a *.i' -u "$user,$password" "ftp://$host/" 

(是的,lftp的擴展通配符內部,而不是期望這由外殼完成)。

+0

謝謝大家的所有建議。它確實有幫助。我已將腳本更改爲Charles所建議的內容,並在執行時遇到以下錯誤:用戶名@主機:〜/ Documents/Python $ ./script.sh 錯誤的命令序列。 錯誤的命令序列。 (本地文件)(遠程文件) 錯誤的命令序列。 錯誤的命令序列。 (本地文件)(遠程文件) – maksaraswat 2012-04-24 15:59:51

+0

@ user1354065 FTP實現有所不同,因此沒有一個腳本可以保證可以跨所有腳本工作。我可以建議你試試lftp版本嗎? – 2012-04-24 16:17:14

+0

@ user1354065 ...在審查時表示 - 可變資本化是不一致的;該名稱被分配給'$ File',但是'$ FILE'被取消引用。對於未導出到環境中的變量,使用全大寫實際上與慣例相反,所以我更新了它以使用全小寫。 – 2012-04-24 16:21:06

0

首先,我沒有在問題中明確自己的道歉。我的實際任務是將文件從本地文件夾複製到SFTP站點,然後將文件移動到存檔文件夾。由於SFTP由供應商託管,因此我無法使用密鑰共享(供應商限制)。另外,如果在shell腳本中使用SCP,則需要輸入密碼,因此我必須使用SSHPASS。但是,對於CentOS,SSHPASS位於Ubuntu回購站中安裝from here

當前線程How to run the sftp command with a password from Bash script?也給了我如何寫劇本,我會在這裏分享我的解決方案更好的理解:

#!/bin/bash 
#!/usr/bin 

for i in /dir/*; do 
if [ -f "$i" ]; then 
file=$i 
    export SSHPASS=password 
    sshpass -e sftp -oBatchMode=no -b - [email protected] << ! 
    cd foldername/foldername 
    put $file 
bye 
! 
mv $file /somedir/test 
fi 
done 

謝謝大家對所有的答覆 --Mayank