前言
公司有幾百台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命令要注意兩個問題 Ⅰ
不能對目標文件指定命字
在命令行上所有的文件都視做源文件
Ⅱ
mput
mget兩個命令不能對目錄進行上傳與下載
只能對文件
Ⅲ
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下是\n
Windows下是\r\n
Mac下是\r
unix系統下行結束符是一個字節
即十六進制的
A
而ms的系統是兩個字節
即十六進制的
D
A
所以當你用ascii方式從unix的ftp server下載文件時(不管是二進制或者文本文件
redhat的 vsftp默認是binary
ascii默認關閉)
每檢測到一個字節是
A
就會自動插入一個
D
所以如果你的文件是二進制文件比如可執行文件
壓縮包什麼的
就肯定不能用了
如果你的文件就是unix下的文本文件
你用 ascii模式是正確的
要是誤用了binary模式
你在windows上看這個文件是沒有換行的
裡面是一個個的黑方塊
在用FTP客戶端傳輸文件時
因為這些軟件都做得比較智能化
它可以根據後綴
自動啟用傳輸模式
所以不用擔心出問題
二實例求證 環境說明
上有一FTP服務器端(windows版)
FTP用戶名為lgh
密碼為
該用戶的根目錄為D
\lgh
裡面文件見下圖
sql
rar是sql
bat的壓縮文件
大家注意看圖
我等下會在後面的實例中引用這個文件
把mget
get
prompt
bin
ascii等ftp命令诠釋得一清二白
實例一直接BAT調用FTP命令 ftpbat
bat內容
(***大家建立bat文件不要命名為ftp
bat
執行時會有問題***)
復制代碼 代碼如下:
ftp
open
lgh
get sqlrar
bye
從圖上的結果看
bat腳本直接調用xp的FTP命令是不行的
執行時H:\>ftp會一直死循環
我這裡的XP系統是SP
的
其它版本的
我沒有作測試
如果有不同
歡迎大家留言告之
實例二用putget上傳下載單個文件 把XP機器上H:\js目錄下文件flower
zip上傳到FTP服務器
把FTP服務器中的sql
rar文件下載到XP機器上的H:\JS目錄
ftp
get
put
bat內容如下
復制代碼 代碼如下:
@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機器上把flower
zip復制一次
改名為flower
zip
在XP機器上把把第二次實例下載的sql
rar文件刪除
以免影響到本次操作
在FTP服務器上把第二次實例上傳的flower
zip文件刪除
以免影響到本次操作
把XP機器上H:\js目錄下文件flower
zip 和flower
zip上傳到FTP服務器
ftp
get
put
many
bat內容如下
復制代碼 代碼如下:
@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電腦上的rmb
jpg通過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%
執行ftp
get
ascii
bat後
發現rmb
jpg可以正常上傳
並且可以正常打開
那
這個現象與前面所以的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%
執行ftp
getascii
bat
看結果
rmb
jpg文件有下載到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或put如restart
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缺省為ascii如type binary設置二進制傳輸方式
umask[newmask]將遠程服務器的缺省umask設置為newmask如umask
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