在shell中使用ftp

我經(jīng)常用ftp從一臺(tái)電腦傳輸一個(gè)文件到另一臺(tái)電腦拓哺。有時(shí)我用命令行交互模式執(zhí)行操作,但更多時(shí)候,我喜歡寫(xiě)一個(gè)腳本來(lái)做這件苦差事沼侣。這個(gè)任務(wù)著實(shí)使我蒙逼了一陣子,但我最終解決了那些坑歉秫。我沒(méi)有見(jiàn)過(guò)這方面有關(guān)的文檔蛾洛,所以我寫(xiě)了這個(gè)供你參考。</br>

問(wèn)題所在

我在過(guò)程中遇到的關(guān)鍵問(wèn)題是,你要提供一個(gè)密碼給ftp服務(wù)器.典型的ftp客戶端(比如unix下的,linux下的,solaris下的,NetBSD下的)都從/dev/tty讀取密碼.

(non-working) 腳本例子

#!/bin/sh
HOST='ftp.users.qwest.net'
USER='yourid'
PASSWD='yourpw'
FILE='file.txt'

ftp $HOST <<END_SCRIPT
user $USER
$PASSWD
put $FILE
quit
END_SCRIPT
exit 0

上面的腳本并不會(huì)完成工作,無(wú)論是執(zhí)行在前景還是作為定時(shí)任務(wù)執(zhí)行在背景,都不會(huì)工作.</br>
/dev/tty是一種奇怪的設(shè)備.每一個(gè)進(jìn)程(精確的說(shuō)是每一個(gè)進(jìn)程組)有不同的/dev/tty,你不能天真地讓ftp客戶端從某個(gè)文件中(比如here document)讀取密碼.當(dāng)在終端執(zhí)行時(shí),上面的腳本會(huì)掛著,因?yàn)樗鼜?code>/dev/tty讀取密碼,終端構(gòu)成了腳本的/dev/tty,所以腳本等著鍵盤(pán)輸入.

(working) 腳本例子

#!/bin/sh
HOST='ftp.users.qwest.net'
USER='yourid'
PASSWD='yourpw'
FILE='file.txt'

ftp -n $HOST <<END_SCRIPT
quote USER $USER
quote PASS $PASSWD
put $FILE
quit
END_SCRIPT
exit 0

訣竅所在

不需要ftp客戶端從/dev/tty讀取密碼需要耍兩個(gè)把戲:</br>

  1. 使用 -n 選項(xiàng)連接ftp客戶端以阻止ftp客戶端立即登錄.這樣,ftp客戶端就不要你輸入一個(gè)用戶名和密碼了.所以沒(méi)有用到/dev/tty
  2. 使用ftp客戶端命令quote發(fā)送用戶名和密碼.</br>
    你必須在開(kāi)頭和結(jié)尾加上END_SCRIPT,盡管命令已經(jīng)縮進(jìn)了,還是要加上.</br>

進(jìn)一步改良

上面的腳本會(huì)從ftp客戶端涌出許多輸出到標(biāo)準(zhǔn)輸出,即便它運(yùn)行良好轧膘。運(yùn)行上面的腳本會(huì)立刻顯示許多亂七八糟的內(nèi)容給用戶钞螟,改良一下的方法是把輸出輸?shù)狡渌牡胤饺ィ竭h(yuǎn)越好:

ftp -n $HOST > /tmp/ftp.worked 2> /tmp/ftp.failed <<END_SCRIPT

還可以改良一下處理錯(cuò)誤,就是處理ftp客戶端的退出狀態(tài).

ftp -n $HOST > /tmp/ftp.worked 2> /tmp/ftp.failed <<END_SCRIPT
blah blah
END_SCRIPT
EXITSTATUS=$?
if [ $EXITSTATUS != "0" ]
then
    # handle the error...
fi 

then里面的代碼一般不會(huì)執(zhí)行,大多數(shù)時(shí)候ftp客戶端都會(huì)返回狀態(tài)0.這只會(huì)給你沒(méi)用的信息:文件傳輸失敗了,但腳本也不能查出問(wèn)題.</br>
下面的方法可以證實(shí)文件是否傳輸成功:

#!/bin/sh
ftp -n << END_SCRIPT
open $1
user $2 $3
put $4
get $4 retrieval.$$
bye
END_SCRIPT
if [ -f retrieval.$$ ]
then
    echo "FTP of $4 to $1 worked"
    rm -f retrieval.$$
else
    echo "FTP of $4 did not work"
fi

不合格的傳輸會(huì)留下文件.

代替腳本

我在usenet 文章上看到另一種方法:

#!/bin/sh
USER=userid
PASSWD=userpw
ftp -n f2dev <<SCRIPT
user $USER $PASSWD
binary
get some.file
quit
SCRIPT

這里依然用到-n把戲,但是它發(fā)送用戶名和密碼都在一條ftp命令

譯自:How to use ftp in a shell script

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末谎碍,一起剝皮案震驚了整個(gè)濱河市鳞滨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蟆淀,老刑警劉巖拯啦,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異扳碍,居然都是意外死亡提岔,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門(mén)笋敞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)碱蒙,“玉大人,你說(shuō)我怎么就攤上這事夯巷∪停” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵趁餐,是天一觀的道長(zhǎng)喷兼。 經(jīng)常有香客問(wèn)我,道長(zhǎng)后雷,這世上最難降的妖魔是什么季惯? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮臀突,結(jié)果婚禮上勉抓,老公的妹妹穿的比我還像新娘。我一直安慰自己候学,他們只是感情好藕筋,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著梳码,像睡著了一般隐圾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上掰茶,一...
    開(kāi)封第一講書(shū)人閱讀 49,730評(píng)論 1 289
  • 那天暇藏,我揣著相機(jī)與錄音,去河邊找鬼濒蒋。 笑死叨咖,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播甸各,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼垛贤,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了趣倾?” 一聲冷哼從身側(cè)響起聘惦,我...
    開(kāi)封第一講書(shū)人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎儒恋,沒(méi)想到半個(gè)月后善绎,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡诫尽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年禀酱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片牧嫉。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡剂跟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出酣藻,到底是詐尸還是另有隱情曹洽,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布辽剧,位于F島的核電站送淆,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏怕轿。R本人自食惡果不足惜偷崩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望撞羽。 院中可真熱鬧阐斜,春花似錦、人聲如沸放吩。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)渡紫。三九已至,卻和暖如春考赛,著一層夾襖步出監(jiān)牢的瞬間惕澎,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工颜骤, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留唧喉,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像八孝,于是被迫代替她去往敵國(guó)和親董朝。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容