#2012/05/18#
幫同事寫雙認證的sftp的批次檔,在Put的批次檔是順利的,但在Get的批次檔則遇到麻煩。
首先是psftp沒有像ftp的mls的指令,所以SFTP上的抓檔清單要自行想辦法產生。
其二是psftp在批次檔使用Get抓檔時,要指定一個檔名給它儲存。
本來用底下的語法產生psftp抓檔指令:
echo cd %sftpdir% >> %ftpcmd2%
for /f "tokens=1" %%a in (%list2%) do echo get "%%a" >> %ftpcmd2% && echo mv "%%a" "./bak/%%a-%strdt%" >> %ftpcmd2%
—
產生的%ftpcmd2%檔案內容如下:
cd /DPK
get "DPK-20120415.txt"
mv "DPK-20120415.txt" "./bak/DPK-20120415.txt-20120518-171154"
get "DPK-20120416.txt"
mv "DPK-20120416.txt" "./bak/DPK-20120416.txt-20120518-171154"
quit
—
執行psftp指令列
psftp.exe %sftpuser%@%sftpip% -pw %sftppass% -i %sftpkey% -bc -b "%ftpcmd2%" >> "%log%"
查看%log%檔案,出現錯誤訊息:
local: unable to open
—
用手動登入執行%ftpcmd2%檔案內容的指令,能正常抓檔及移檔。
心想會不會是psftp的版本bug問題,於是換不同的版本,但狀況如前。
心想這一定是bug了。
後來在官方網站再次查看psftp的使用方法時,看到這種psftp的語法:
psftp> get "spacey file name.txt" "save it under this name.txt"
Link:http://ftp.gnome.org/pub/putty/putty-0.57/htmldoc/Chapter6.html
心想,會不會加個儲存檔名給它就可以了呢?於是把語法改成如下:
for /f "tokens=1" %%a in (%list2%) do echo get "%%a" "%%a" >> %ftpcmd2% && echo mv "%%a" "./bak/%%a-%strdt%" >> %ftpcmd2%
—
產生的%ftpcmd2%檔案內容如下:
cd /DPK
get "DPK-20120415.txt" "DPK-20120415.txt"
mv "DPK-20120415.txt" "./bak/DPK-20120415.txt-20120518-171154"
get "DPK-20120416.txt" "DPK-20120416.txt"
mv "DPK-20120416.txt" "./bak/DPK-20120416.txt-20120518-171154"
quit
—
這樣就閃過bug了,山不轉,路轉啊!
—
同樣的put也是一樣,有時會遇到open for write: failure,解決辦法如同get。