shell實例——獲取FTP/SFTP遠(yuǎn)程文件

使用Unix/Linux系列操作系統(tǒng)就離不開shellshell本質(zhì)是和GUI一樣作為用戶和操作系統(tǒng)之間的接口而存在,它實際上是一個能夠解釋和分析用戶鍵盤輸入飒炎,執(zhí)行輸入的命令因妙,然后返回結(jié)果的解釋程序荐操。由于占用資源少诅妹,而且具有批處理功能历涝,實際開發(fā)和維護(hù)當(dāng)中掌握必要的shell技能,勢必會大大提升工作效率。

以下記錄了一個shell腳本實例荧库,是為解決實際生產(chǎn)問題而編寫。我使用的是AIX下語法較嚴(yán)格的kshell赵刑。


需求描述

深證通會將基金公司的確認(rèn)數(shù)據(jù)文件(開戶分衫、認(rèn)申購定投、贖回分紅等等)發(fā)送給對接過的小站般此,最終體現(xiàn)就是不同的小站各推到接收方一個獨(dú)立的文件夾(文件夾以小站號命名)蚪战。我作為接收方有一臺存儲服務(wù)器用于接收小站文件,此時另外一臺應(yīng)用服務(wù)器需要從存儲服務(wù)器獲取確認(rèn)數(shù)據(jù)文件铐懊。數(shù)據(jù)文件按類別不同分別有03邀桑、04、06等結(jié)尾的科乎,每天會有更新壁畸。要求是獲取每天的04、06新文件茅茂,每天的文件分別放在當(dāng)天日期命名的文件夾下捏萍。

# 遠(yuǎn)端存儲服務(wù)器目錄結(jié)構(gòu)
|——download
  |——k0001
  |  |——YYYYMMdd_xx_xxx_xxxxxxxx_03.TXT
  |  |——YYYYMMdd_xx_xxx_xxxxxxxx_04.TXT
  |  |——YYYYMMdd_xx_xxx_xxxxxxxx_06.TXT
  |  └──...
  |——k0253
  |  |——OFD_xx_xxx_YYYYMMdd_03.TXT
  |  |——OFD_xx_xxx_YYYYMMdd_04.TXT
  |  |——OFD_xx_xxx_YYYYMMdd_06.TXT
  |  └──....
  |──zdfile
  |  |——YYYYMMdd_xx_xxx_xxxxxxxx_03.TXT
  |  |——YYYYMMdd_xx_xxx_xxxxxxxx_04.TXT
  |  |——YYYYMMdd_xx_xxx_xxxxxxxx_06.TXT
  |  |——OFD_xx_xxx_YYYYMMdd_03.TXT
  |  |——OFD_xx_xxx_YYYYMMdd_04.TXT
  |  |——OFD_xx_xxx_YYYYMMdd_06.TXT
  |  └──....
  └──...

環(huán)境介紹

操作系統(tǒng):AIX
$ oslevel
7.1.0.0

$ echo $SHELL
/usr/bin/ksh

$ expect -v
expect version 5.42.1

代碼實現(xiàn)

1、定義變量

首先定義變量給定參數(shù)空闲,包括FTP/SFTP的用戶信息和路徑令杈,小站文件夾名稱,這里我用數(shù)組來存放小站文件夾名稱碴倾,等下就可以遍歷數(shù)組獲取文件逗噩,后續(xù)維護(hù)也比較方便〉疲可以直接在腳本里寫好參數(shù)异雁,也可以用傳參的方式。

# 接收參數(shù)
localPath=$1
remotePath=$2
serverIP=$3
sftpUser=$4
sftpPass=$5

# 定義變量
SYSDATE=`date +%Y%m%d`
STATION_ARR[0]="k0001"
STATION_ARR[1]="k0253"
STATION_ARR[2]="zdfile"
2矫户、處理文件夾

先判斷本地是否存在當(dāng)日日期文件夾片迅,不存在則創(chuàng)建文件夾,并賦予權(quán)限755皆辽,然后轉(zhuǎn)到該目錄下柑蛇。

# [函數(shù)]處理日期文件夾
createForlder()
{
    cd $1
    if [[ ! -d ${SYSDATE} ]]; then
        mkdir ${SYSDATE}
        chmod 755 ${SYSDATE}
    fi
    cd ${SYSDATE}
}
3、非交互式遠(yuǎn)程登錄

要想通過shell腳本登錄FTP驱闷,就需要使用非交互式的方式讓腳本自動填充指令信息耻台,FTP使用-n參數(shù)打開非交互式操作

# FTP非交互式操作
ftp_download()
{
    ftp -n $1 <<!
    user $2 $3
    prom
    bin
    cd $4
    mget *$sysdate*04.*
    mget *$sysdate*06.*
    bye
    !
}

如果使用的是SFTP協(xié)議,那么此協(xié)議是沒有提供非交互式參數(shù)可以使用的空另,此時有兩種方案可以解決盆耽,一種就是讓遠(yuǎn)程服務(wù)器端保存本機(jī)的MAC密鑰,從而自動驗證免密登錄。當(dāng)然對于很多對安全性要求較高的情況來說是不允許這種方式的摄杂。另外一種就是使用自動化交互工具expect坝咐,具體實現(xiàn)如下:

# SFTP非交互式操作
sftp_download()
{
    expect <<- EOF
    set timeout 5
    spawn sftp $1@$2
    expect {
        "(yes/no)?" {send "yes\r"; expect_continue}
        "password:" {send "$3\r"}
    }
    expect "sftp>"
    send "cd $4\r"
    set timeout -1
    expect "sftp>"
    send "mget *$sysdate*04.*\r"
    expect "sftp>"
    send "mget *$sysdate*06.*\r"
    expect "sftp>"
    send "bye\r"
    EOF
}
4、遍歷小站獲取文件

循環(huán)遍歷數(shù)組STATION_ARR[]獲得小站文件夾名稱析恢,并拼接好遠(yuǎn)程路徑remoteDir墨坚,然后調(diào)用函數(shù)ftp_downloadsftp_download獲取文件。

for station in ${STATION_ARR[@]}; do
    remoteDir=${remotePath}${station}
    ftp_download ${serverIP} ${sftpUser} ${sftpPass} ${remoteDir}
#   sftp_download ${sftpUser} ${serverIP} ${sftpPass} ${remoteDir}
done

至此映挂,需求功能已全部實現(xiàn)泽篮。完整腳本代碼如下:

#!/usr/bin/ksh

############################################################
## 功能:從存儲服務(wù)器獲取確認(rèn)文件
## By    xiaosong  2017-12-31
############################################################

#------------------------參數(shù)說明----------------------------
#--接收
#   localPath         -本地文件路徑
#   remotePath        -遠(yuǎn)程文件路徑
#   serverIP          -遠(yuǎn)程服務(wù)器IP
#   sftpUser          -sftp用戶名
#   sftpPass          -sftp密碼
#--變量
#   SYSDATE           -系統(tǒng)日期
#   STATION_ARR[]     -小站文件夾數(shù)組,新增小站增加此數(shù)組即可
#-----------------------------------------------------------

# 接收參數(shù)
localPath=$1
remotePath=$2
serverIP=$3
sftpUser=$4
sftpPass=$5

# 定義變量
SYSDATE=`date +%Y%m%d`
STATION_ARR[0]="k0001"
STATION_ARR[1]="k0253"
STATION_ARR[2]="zdfile"

# [函數(shù)]處理日期文件夾
createForlder()
{
    cd $1
    if [[ ! -d ${SYSDATE} ]]; then
        mkdir ${SYSDATE}
        chmod 755 ${SYSDATE}
    fi
    cd ${SYSDATE}
}

# [函數(shù)]SFTP非交互式操作
sftp_download()
{
    expect <<- EOF
    set timeout 5
    spawn sftp $1@$2
    expect {
        "(yes/no)?" {send "yes\r"; expect_continue}
        "password:" {send "$3\r"}
    }
    expect "sftp>"
    send "cd $4\r"
    set timeout -1
    expect "sftp>"
    send "mget *$sysdate*04.*\r"
    expect "sftp>"
    send "mget *$sysdate*06.*\r"
    expect "sftp>"
    send "bye\r"
    EOF
}


# 獲取中登文件
createForlder ${localPath}

for station in ${STATION_ARR[@]}; do
    remoteDir=${remotePath}${station}
    sftp_download ${sftpUser} ${serverIP} ${sftpPass} ${remoteDir}
done

完善腳本

1柑船、參數(shù)校驗

腳本功能函數(shù)執(zhí)行前帽撑,可以校驗是否傳遞了完整的參數(shù)。若參數(shù)個數(shù)不對鞍时,則直接退出腳本終止執(zhí)行亏拉。

if [[ $# != 5 ]]; then
    exit
fi
2、日志

為腳本增加日志函數(shù)寸癌,記錄腳本運(yùn)行情況专筷,作為歷史記錄歸檔,也方便回查定位問題蒸苇。

SYSTIME=`date '+%Y-%m-%d %H:%M:%S'`

# [函數(shù)]腳本運(yùn)行日志
wLog(){
    echo "${SYSTIME}  $1" >> ${LOGPATH}/DownloadFile.log
}
3磷蛹、返回值

如果不是配置crontab定時任務(wù)執(zhí)行腳本,而是通過其他方式調(diào)用腳本執(zhí)行溪烤,那么可能還需要為腳本設(shè)置返回值味咳。

#-----------------------------------------------------------
#--返回值RETURNCODE
#   0         -成功
#   1         -參數(shù)傳遞異常
#   2         -處理文件夾異常
#   3         -獲取文件異常
#-----------------------------------------------------------

# [函數(shù)]腳本執(zhí)行返回值
retrunCode()
{
    if [ ${result} -eq "1" ]; then
        RETURNCODE=$1
        echo ${RETURNCODE}
    fi
}

然后在關(guān)鍵步驟位置調(diào)用返回值處理函數(shù)。

# 校驗參數(shù)個數(shù)
if [[ $# != 5 ]]; then
    exit
fi
result=$?
retrunCode "1"

# 處理文件夾
createForlder ${localPath}
result=$?
retrunCode "2"

# 循環(huán)獲取文件
for station in ${STATION_ARR[@]}; do
    remoteDir=${remotePath}${station}
    sftp_download ${sftpUser} ${serverIP} ${sftpPass} ${remoteDir}
done
result=$?
retrunCode "3"
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末檬嘀,一起剝皮案震驚了整個濱河市槽驶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鸳兽,老刑警劉巖掂铐,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異揍异,居然都是意外死亡全陨,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進(jìn)店門衷掷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辱姨,“玉大人,你說我怎么就攤上這事戚嗅∮晏危” “怎么了枢舶?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長替久。 經(jīng)常有香客問我凉泄,道長,這世上最難降的妖魔是什么侣肄? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任旧困,我火速辦了婚禮,結(jié)果婚禮上稼锅,老公的妹妹穿的比我還像新娘。我一直安慰自己僚纷,他們只是感情好矩距,可當(dāng)我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著怖竭,像睡著了一般锥债。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上痊臭,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天哮肚,我揣著相機(jī)與錄音,去河邊找鬼广匙。 笑死允趟,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的鸦致。 我是一名探鬼主播潮剪,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼分唾!你這毒婦竟也來了抗碰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤绽乔,失蹤者是張志新(化名)和其女友劉穎弧蝇,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體折砸,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡看疗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了鞍爱。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鹃觉。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖睹逃,靈堂內(nèi)的尸體忽然破棺而出盗扇,到底是詐尸還是另有隱情祷肯,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布疗隶,位于F島的核電站佑笋,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏斑鼻。R本人自食惡果不足惜蒋纬,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望坚弱。 院中可真熱鬧蜀备,春花似錦、人聲如沸荒叶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽些楣。三九已至脂凶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間愁茁,已是汗流浹背蚕钦。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留鹅很,地道東北人嘶居。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像道宅,于是被迫代替她去往敵國和親食听。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,828評論 2 345

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理污茵,服務(wù)發(fā)現(xiàn)樱报,斷路器,智...
    卡卡羅2017閱讀 134,600評論 18 139
  • Ubuntu的發(fā)音 Ubuntu盗飒,源于非洲祖魯人和科薩人的語言,發(fā)作 oo-boon-too 的音陋桂。了解發(fā)音是有意...
    螢火蟲de夢閱讀 99,157評論 9 467
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,748評論 6 342
  • 第1章 小試牛刀 $ 是普通用戶逆趣,# 表示管理員用戶 root。 shebang:#!嗜历。sharp / hash ...
    巴喬書摘閱讀 6,326評論 1 4
  • 1.Linux下如何用命令查看實時日志(完整命令) tail -f 路徑.log查看前多少行 tai-200f 路...
    qianyewhy閱讀 2,251評論 0 11