2017-08-17 37 views
-1

我想從遠程服務器獲取文件列表並將該列表放置在本地文件或數組中。遍歷文件列表並從遠程到本地一次獲取每個文件。 但是,ls命令不能在遠程服務器上運行,get命令不起作用。 下面是我的腳本:ls不工作在sftp korn外殼和命令不工作在循環內

#!/user/bin/ksh 
Sftp [email protected] <<EOF 
Cd source_path 
Set -A list_value $(ls source_path) 
for file in ${list_value[*]} 
do 
get /source_path/$file /dest_folder 
If ($? -eq 0); then 
rm /source_path/$file 
else 
echo "error" 
Exit 
fi 
done 
Bye 
EOF 

我甚至嘗試

ls source_path > output.txt 

沒有什麼工作。在本地它使用數組,但for循環內的命令沒有得到執行。在遙控器上沒有工作。我甚至用echo *嘗試並找到。它在ls附近拋出無效命令錯誤並得到。

+0

用四個空格前綴代碼/數據。請看[編輯幫助](http://stackoverflow.com/editing-help)。 – Cyrus

+1

'sftp'有一個有限的命令集,我很確定它不包含'set','for/do/done','if/then/else/fi';是不是有一個原因,你不只是把一整套文件放在一個過程中,也就是說,爲什麼要存儲在一個數組中,然後遍歷數組呢? – markp

+0

是的,我需要在文件成功傳輸到本地文件夾後刪除遠程服務器中的文件。這就是原因,我試圖一次拉出每個文件,而不是全部拉在一起。 – Kks

回答

0

假設:

  • 您想以後使用的文件名的數組的東西(否則我很可能只是直接喂ssh/find結果爲while循環)
  • 您的遠程主機可能的Solaris(不支持find/maxdepth),在這種情況下,我們必須使用一個有點時髦find命令效仿maxdepth=1
  • 你有你的帳戶設置爲允許無密碼的ssh/scp電話

下面就做你想做的一種方式:

$ cat mycp 
#!/bin/ksh 

# replace `source_path' and 'dest_folder' accordingly 

remotedir=source_path 
localdir=dest_folder 

# the 'find' is a bit funky to allow us to emulate find/maxdepth if remote host is solaris 
# 'sed' command strips off the leading 2 characters (./) of the result 

set -A farray $(ssh [email protected] "cd ${remotedir} ; find . -name . -o -type d -prune -o -name '*' -print" | sed -r 's/^.{2}//') 

# iterate through the array 

for i in ${!farray[@]} 
do 
    # pull array element into variable => less typing for rest of loop 

    fname=${farray[${i}]} 

    # replace 'scp' with comparable 'sftp' if you wish 

    scp -p [email protected]:${remotedir}/${fname} ${localdir} 

    # if file exists locally, then remove remotely 

    [ -f ${localdir}/${fname} ] && ssh [email protected] "'rm' -rf ${remotedir}/${fname}" 
done 

反覆回正與來回調用scp/ssh不完全是有效的,但編碼是相當簡單的。

更高效的過程需要多一點編碼,但如果您不打算經常運行此過程或者使用相對較少的文件,則可能會過度使用。一種方法是這個樣子:

  • 使用單一scp(或sftp/mget)命令靠邊停車一次所有文件
  • 建立一個文件,你剛纔複製的文件和地點的列表
  • scp(或sftp)文件名的文件返回給遠程主機(例如在/tmp的地方)
  • ssh到遠程主機上,並使用文件名的該文件驅動while/rm循環,當完成刪除文件文件名稱爲
  • 結果:3個scp/ssh呼叫

以上的變化:

  • 使用單個scp(或sftp/mget)命令靠邊一次所有文件
  • 的,而不是一個文件文件名,建立'rm'命令文件
  • scp'rm'命令到遠程主機的文件/tmp
  • ssh遠程主機和a)chmod 700'rm'文件,然後執行該文件或b)源'rm'文件;刪除一旦做
  • 結果「RM」的文件:3個scp/ssh電話

「當然,如果你是在經常執行此操作計劃也可能是值得的,看看你能得到2臺主機設置了共享文件系統,因此不需要執行任何ssh/scp/sftp調用。

+0

謝謝markp。 你可以請建議,如果有一種方法來減少來回scp/ssh,因爲我必須經常執行此操作。我只能執行sftp或scp,無法使用共享文件系統獲取兩臺主機的設置。 – Kks

+0

我已經更新了一些關於如何減少後退的答案 – markp

+0

謝謝markp。我無法將變量傳遞給SSH腳本。你能幫忙嗎?我將變量傳遞給ksh腳本,並在SSH中使用類似的變量。在$(cat'「$ 3/$ 4」')中的文件爲SSH $ 1 @ $ 2';做rm'「$ 3」'/ $文件; done',其中$ 1,2,3,4是傳遞給korn shell的變量。 – Kks