熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> 嵌入式開發 >> 正文

Bat腳本處理ftp超強案例分析

2022-06-13   來源: 嵌入式開發 
前言
公司有幾百台windows服務器每次程序更新如果是一台台拷數據只怕安排十個人一天都不一定做得完所以就必須研究個全自動更新方案來於是就想到了FTP做個主FTP站在幾百台客戶機上啟動BAT腳本秒檢測一次如果主站有更新程序就自動下載更新幾分鐘內台windows服務器都可以全自動更新程序完畢相當實用現把當初研究BAT的腳本思路貼出來希望對大批量運維人員一個方向當然批量更新服務器每個公司有它自己的解決辦法這個BAT的方式不是最優的可以用shell可以用perl也可以用python等腳本解決

FTP命令說明

在windows系統中因為FTP是一個程序如果在bat腳本中直接調用FTP的命令在執行時總會彈出命令行窗口循環在>FTP光標這所以要換種方式利用S:filename更多的命令請輸入h查看



FTP登錄成功後需要下載遠程單個文件時使用get命令如果下載多個文件時用mget它支持通配符在使用mget時需要對每一個文件都進行選擇Y/N如果想不交互的下載全部的文件可以輸入一次prompt命令關閉交互方式

Mput和mget命令要注意兩個問題

不能對目標文件指定命字在命令行上所有的文件都視做源文件
mputmget兩個命令不能對目錄進行上傳與下載只能對文件
Prompt每次執行一個這個命令就在on off之間循環ftp腳本開始時prompt默認為on所以一般在上傳下載文件時執行一次prompt把交互式的on關掉變為off

文件的傳輸方式
Binary 二進制傳輸
Ascii ascII傳輸
在FTP文件傳輸過程中ASCII傳輸HTML和文本編寫的文件而二進制碼傳輸可以傳送文本和非文本(執行文件壓縮文件圖片等)具有通用性二進制碼傳輸速度比ASCII傳輸要快所以在建立bat腳本時一般輸入bin命令啟用二進制傳輸如果用ASCII模式傳輸非文本文件可能會顯示一堆亂碼如果是上傳一些CGI腳本有可能將無法運行這類腳本而在浏覽器上看到server error的錯誤

Ascii和binary模式的區別是回車換行的處理binary模式不對數據進行任何處理asci模式將回車換行轉換為本機的回車字符比如Unix下是\nWindows下是\r\nMac下是\runix系統下行結束符是一個字節即十六進制的A而ms的系統是兩個字節即十六進制的DA

所以當你用ascii方式從unix的ftp server下載文件時(不管是二進制或者文本文件redhat的 vsftp默認是binaryascii默認關閉)每檢測到一個字節是A就會自動插入一個D所以如果你的文件是二進制文件比如可執行文件壓縮包什麼的就肯定不能用了如果你的文件就是unix下的文本文件你用 ascii模式是正確的要是誤用了binary模式你在windows上看這個文件是沒有換行的裡面是一個個的黑方塊
在用FTP客戶端傳輸文件時因為這些軟件都做得比較智能化它可以根據後綴自動啟用傳輸模式所以不用擔心出問題

實例求證

環境說明上有一FTP服務器端(windows版)FTP用戶名為lgh密碼為該用戶的根目錄為D\lgh裡面文件見下圖sqlrar是sqlbat的壓縮文件大家注意看圖我等下會在後面的實例中引用這個文件把mgetgetpromptbinascii等ftp命令诠釋得一清二白

  

實例一直接BAT調用FTP命令

ftpbatbat內容
(***大家建立bat文件不要命名為ftpbat執行時會有問題***)

  復制代碼 代碼如下:

  ftp
open
lgh

get sqlrar
bye


  

從圖上的結果看bat腳本直接調用xp的FTP命令是不行的執行時H:\>ftp會一直死循環我這裡的XP系統是SP其它版本的我沒有作測試如果有不同歡迎大家留言告之

實例二用putget上傳下載單個文件

把XP機器上H:\js目錄下文件flowerzip上傳到FTP服務器
把FTP服務器中的sqlrar文件下載到XP機器上的H:\JS目錄
ftpgetputbat內容如下

  復制代碼 代碼如下:

  @echo off
set ftpfilename=autoftpcfg
echo open >%ftpfilename%
echo lgh >>%ftpfilename%
echo >>%ftpfilename%
echo bin >>%ftpfilename%
echo lcd h:\js >>%ftpfilename%
echo get sqlrar >>%ftpfilename%
echo put flowerzip >>%ftpfilename%
echo bye >>%ftpfilename%
ftp s:%ftpfilename%
del %ftpfilename%



  

  我們來看看結果見下面兩張圖從XP系統上看H盤的JS目錄多了個sqlrarFTP服務器上的根目錄多了個flowerzip這說明剛才的腳本完成正常的執行了達到了預期的目的

  

實例三用putget上傳下載多個文件

在XP機器上把flowerzip復制一次改名為flowerzip
在XP機器上把把第二次實例下載的sqlrar文件刪除以免影響到本次操作
在FTP服務器上把第二次實例上傳的flowerzip文件刪除以免影響到本次操作
把XP機器上H:\js目錄下文件flowerzip 和flowerzip上傳到FTP服務器
ftpgetputmanybat內容如下

  復制代碼 代碼如下:

  @echo off
set ftpfilename=autoftpcfg
echo open >%ftpfilename%
echo lgh >>%ftpfilename%
echo >>%ftpfilename%
echo bin >>%ftpfilename%
echo lcd h:\js >>%ftpfilename%
echo put flowerzip flowerzip>>%ftpfilename%
echo bye >>%ftpfilename%
ftp s:%ftpfilename%
del %ftpfilename%



  

  到FTP服務器上查看根目錄看flowerzip與flowerzip是否已成功上傳從圖上看只成功上傳了flowerzip文件

  剛那個ftpgetputmanybat腳本裡
echo put flowerzip flowerzip>>%ftpfilename%
flowerzip是傳輸的最後一個文件是不是用put時意味著bat在處理上傳時只認最後一個文件呢我們再多加個文件flowerzip來驗證

  在XP機器上把flowerzip復制一次改名為flowerzip
在FTP服務器上把第二次實例上傳的flowerzip文件刪除以免影響到本次操作

  ftpgetputmanybat內容修改如下


  復制代碼 代碼如下:

  @echo off
set ftpfilename=autoftpcfg
echo open >%ftpfilename%
echo lgh >>%ftpfilename%
echo >>%ftpfilename%
echo bin >>%ftpfilename%
echo lcd h:\js >>%ftpfilename%
echo put flowerzip flowerzip flowerzip>>%ftpfilename%
echo bye >>%ftpfilename%
ftp s:%ftpfilename%
del %ftpfilename%



  

  結果還是只成功上傳了flowerzip因bat雙擊時執行過程會一閃而過我們看不到執行過程到命令行去執行下看到底出了什麼問題

  命令行執行ftpgetputmanybat腳本從執行情況看flowerzip三個文件都是put的但在傳輸時卻只傳了flowerzip真不解有知道的朋友嗎?給點方向

  再換個方式用通配符*試試
ftpgetputmanybat內容修改如下


  復制代碼 代碼如下:

  @echo off
set ftpfilename=autoftpcfg
echo open >%ftpfilename%
echo lgh >>%ftpfilename%
echo >>%ftpfilename%
echo bin >>%ftpfilename%
echo lcd h:\js >>%ftpfilename%
echo put flower*zip >>%ftpfilename%
echo bye >>%ftpfilename%
ftp s:%ftpfilename%
del %ftpfilename%



  在FTP服務器上把上傳的flower文件全部刪除以免影響到本次操作
執行ftpgetputmanybat結果只有flowerzip文件上傳成功了flowerzip文件怎麼都不能上傳???

  其實用put傳輸多個文件完全可用重復的方式取代比如ftpgetputmanybat內容修改如下

  復制代碼 代碼如下:

  @echo off
set ftpfilename=autoftpcfg
echo open >%ftpfilename%
echo lgh >>%ftpfilename%
echo >>%ftpfilename%
echo bin >>%ftpfilename%
echo lcd h:\js >>%ftpfilename%
echo put flowerzip >>%ftpfilename%
echo put flowerzip >>%ftpfilename%
echo put flowerzip >>%ftpfilename%
echo bye >>%ftpfilename%
ftp s:%ftpfilename%
del %ftpfilename%



實例四用mputmget上傳下載多個文件

在FTP服務器上刪除有關flower的文件

  ftpmgetmputmanybat內容如下:

  復制代碼 代碼如下:

  @echo off
set ftpfilename=autoftpcfg
echo open >%ftpfilename%
echo lgh >>%ftpfilename%
echo >>%ftpfilename%
echo bin >>%ftpfilename%
echo lcd h:\js >>%ftpfilename%
echo mput flowerzip flowerzip flowerzip>>%ftpfilename%
echo bye >>%ftpfilename%
ftp s:%ftpfilename%
del %ftpfilename%



  雙擊ftpmgetmputmanybat後發現系統彈出一窗口後就卡住了停止不前

  原因是用了mput命令但沒有用Prompt關閉交互

  ftpmgetmputmanybat內容修改如下:

  復制代碼 代碼如下:

  @echo off
set ftpfilename=autoftpcfg
echo open >%ftpfilename%
echo lgh >>%ftpfilename%
echo >>%ftpfilename%
echo Prompt >>%ftpfilename%
echo bin >>%ftpfilename%
echo lcd h:\js >>%ftpfilename%
echo mput flowerzip flowerzip flowerzip>>%ftpfilename%
echo bye >>%ftpfilename%
ftp s:%ftpfilename%
del %ftpfilename%



  再次執行ftpmgetmputmanybat結果見下圖

  用通配符*試試
在FTP服務器上刪除有關flower的文件
ftpmgetmputmanybat內容修改如下:


  復制代碼 代碼如下:

  @echo off
set ftpfilename=autoftpcfg
echo open >%ftpfilename%
echo lgh >>%ftpfilename%
echo >>%ftpfilename%
echo Prompt >>%ftpfilename%
echo bin >>%ftpfilename%
echo lcd h:\js >>%ftpfilename%
echo mput flower*zip >>%ftpfilename%
echo bye >>%ftpfilename%
ftp s:%ftpfilename%
del %ftpfilename%



照樣成功上傳有關flower*zip文件因為結果與上一步是一樣的所以就不抓圖了

實例五用ascii在windows系統間傳輸非文本文件

把XP電腦上的rmbjpg通過ascii傳到FTP服務器的根目錄

  

  ftpgetasciibat內容修改如下:


  復制代碼 代碼如下:

  @echo off
set ftpfilename=autoftpcfg
echo open >%ftpfilename%
echo lgh >>%ftpfilename%
echo >>%ftpfilename%
echo ascii >>%ftpfilename%
echo lcd h:\js >>%ftpfilename%
echo put rmbjpg>>%ftpfilename%
echo bye >>%ftpfilename%
ftp s:%ftpfilename%
del %ftpfilename%



執行ftpgetasciibat後發現rmbjpg可以正常上傳並且可以正常打開這個現象與前面所以的ascii不能傳輸非文本東西有出入這是怎麼回會事呢
     這是因為FTP服務器是WINDOWS系統XP電腦上的bat腳本也是在windows系統上運行的所以bat在windows系統裡用FTP傳輸文件不管是用ascii還是用binary都是可以的接下來我們再做一個實驗FTP服務器選centos再測下ascii傳輸非文本文件問題


實例六用ascii在windows系統與linux系統間傳輸非文本文件

在RHEL 位系統上建立一vsftpd服務器

上面說過redhat默認啟用二進制傳輸關閉了ascii碼傳輸所以我們還要修改一下vsftpd的配置文件修改/etc/vsftpd/nf文件允許客戶端進行ascii傳輸並重啟vsftpd

  

  把rmbjpg放到FTP服務器大家注意下H:\js目錄下只有ftpgetasciibat文件

  ftpgetasciibat文件內容修改如下

  復制代碼 代碼如下:

  @echo off
set ftpfilename=autoftpcfg
echo open >%ftpfilename%
echo ftp >>%ftpfilename%
echo redhat >>%ftpfilename%
echo asc >>%ftpfilename%
echo lcd h:\js >>%ftpfilename%
echo get rmbjpg >>%ftpfilename%
echo bye >>%ftpfilename%
ftp s:%ftpfilename%
del %ftpfilename%



執行ftpgetasciibat看結果rmbjpg文件有下載到XP電腦裡雙擊這個文件發現圖像亂碼文件被破壞了都是ascii碼傳輸惹的禍

  換bin傳輸測試一下
在XP電腦上刪除rmbjpg文件再雙擊ftpgetasciibat文件去從LINUX的FTP服務器下載一個rmbjpg文件

  修改ftpgetasciibat把ascii改給二進制傳輸

  復制代碼 代碼如下:

  @echo off
set ftpfilename=autoftpcfg
echo open >%ftpfilename%
echo ftp >>%ftpfilename%
echo redhat >>%ftpfilename%
echo bin >>%ftpfilename%
echo lcd h:\js >>%ftpfilename%
echo get rmbjpg >>%ftpfilename%
echo bye >>%ftpfilename%
ftp s:%ftpfilename%
del %ftpfilename%



結果文件正常下載圖像也顯示正常

  擴展閱讀
ftp使用的內部命令如下(中括號表示可選項):
![cmd[args]]在本地機中執行交互shellexit回到ftp環境!ls*zip
$ macroame[args]執行宏定義macroname
account[password]提供登錄遠程系統成功後訪問系統資源所需的補充口令
append localfile[remotefile]將本地文件追加到遠程系統主機若未指定遠程系統文件名則使用本地文件名
ascii使用ascii類型傳輸方式
bell每個命令執行完畢後計算機響鈴一次
bin使用二進制文件傳輸方式
bye退出ftp會話過程
case在使用mget時將遠程主機文件名中的大寫轉為小寫字母
cd remotedir進入遠程主機目錄
cdup進入遠程主機目錄的父目錄
chmod mode filename將遠程主機文件filename的存取方式設置為mode chmod aout
close中斷與遠程服務器的ftp會話(與open對應)
cr使用asscii方式傳輸文件時將回車換行轉換為回行
delete remotefile刪除遠程主機文件
debug[debugvalue]設置調試方式 顯示發送至遠程主機的每條命令 deb up 若設為表示取消debug
dir[remotedir][localfile]顯示遠程主機目錄並將結果存入本地文件localfile
disconnection同close
form format將文件傳輸方式設置為format缺省為file方式
get remotefile[localfile] 將遠程主機的文件remotefile傳至本地硬盤的localfile
glob設置mdeletemgetmput的文件名擴展缺省時不擴展文件名同命令行的g參數
hash每傳輸字節顯示一個hash符號(#)
help[cmd]顯示ftp內部命令cmd的幫助信息help get
idle[seconds]將遠程服務器的休眠計時器設為[seconds]秒
image設置二進制傳輸方式(同binary)
lcd[dir]將本地工作目錄切換至dir
ls[remotedir][localfile]顯示遠程目錄remotedir 並存入本地文件localfile
macdef macroname定義一個宏遇到macdef下的空行時宏定義結束
mdelete[remotefile]刪除遠程主機文件
mdir remotefiles localfile與dir類似但可指定多個遠程文件 mdir *o*zipoutfile
mget remotefiles傳輸多個遠程文件
mkdir dirname在遠程主機中建一目錄
mls remotefile localfile同nlist但可指定多個文件名
mode[modename]將文件傳輸方式設置為modename 缺省為stream方式
modtime filename顯示遠程主機文件的最後修改時間
mput localfile將多個文件傳輸至遠程主機
newer filename 如果遠程機中filename的修改時間比本地硬盤同名文件的時間更近則重傳該文件
nlist[remotedir][localfile]顯示遠程主機目錄的文件清單並存入本地硬盤的localfile
nmap[inpattern outpattern]設置文件名映射機制 使得文件傳輸時文件中的某些字符相互轉換nmap $$$[$$][$$]則傳輸文件aaa文件名變為aa該命令特別適用於遠程主機為非UNIX
機的情況
ntrans[inchars[outchars]]設置文件名字符的翻譯機制如ntransR則文件名LLL將變為RRR
open host[port]建立指定ftp服務器連接可指定連接端口
passive進入被動傳輸方式
prompt設置多個文件傳輸時的交互提示
proxy ftpcmd在次要控制連接中執行一條ftp命令 該命令允許連接兩個ftp服務器以在兩個服務器間傳輸文件第一條ftp命令必須為open以首先建立兩個服務器間的連接
put localfile[remotefile]將本地文件localfile傳送至遠程主機
pwd顯示遠程主機的當前工作目錄
quit同bye退出ftp會話
quote argarg將參數逐字發至遠程ftp服務器quote syst
recv remotefile[localfile]同get
reget remotefile[localfile]類似於get但若localfile存在則從上次傳輸中斷處續傳
rhelp[cmdname]請求獲得遠程主機的幫助
rstatus[filename]若未指定文件名則顯示遠程主機的狀態否則顯示文件狀態
rename[from][to]更改遠程主機文件名
reset清除回答隊列
restart marker從指定的標志marker處重新開始get或putrestart
rmdir dirname刪除遠程主機目錄
runique設置文件名唯一性存儲若文件存在則在原文件後加後綴
send localfile[remotefile]同put
sendport設置PORT命令的使用
site argarg將參數作為SITE命令逐字發送至遠程ftp主機
size filename顯示遠程主機文件大小site idle
status顯示當前ftp狀態
struct[structname]將文件傳輸結構設置為structname 缺省時使用stream結構
sunique將遠程主機文件名存儲設置為唯一(與runique對應)
system顯示遠程主機的操作系統類型
tenex將文件傳輸類型設置為TENEX機的所需的類型
tick設置傳輸時的字節計數器
trace設置包跟蹤
type[typename]設置文件傳輸類型為typename缺省為asciitype binary設置二進制傳輸方式
umask[newmask]將遠程服務器的缺省umask設置為newmaskumask
user username[password][account]向遠程主機表明自己的身份需要口令時必須輸入口令user anonymous my@email
verbose同命令行的v參數即設置詳盡報告方式ftp服務器的所有響應都將顯示給用戶缺省為on
?[cmd]同help


From:http://tw.wingwit.com/Article/program/qrs/201401/30223.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.