首頁 > 軟體

shell指令碼實現ftp上傳下載檔案

2020-06-16 16:33:38

前段時間工作中需要將經過我司平台某些資訊核驗資料提取後上傳到客戶的FTP伺服器上,以便於他們進行相關的資訊比對核驗。由於包含這些資訊的主機只有4台,採取的策略是將生成的4個檔案匯集到一個主機上,然後在這台主機上將檔案上傳的目標ftp伺服器。

1,建立主機A到其他三台主機之間的信任關係,以便於遠端拷貝檔案

#生成主機A的本地認證秘鑰,可以選擇生成rsa或者dsa型別的秘鑰,這裡選取rsa
[root@linuxmi ~]#ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa >/dev/null 2>&1
#將本機的秘鑰拷貝的其他三台主機的authorized_keys檔案中,由於只有三台主機,一個一個執行就行,如果主機數量多,可以使用expect指令碼批次執行
[root@linuxmi ~]#ssh-copy-id -i ~/.ssh/id_rsa.pub "-p 22 root@192.168.1.B"
[root@linuxmi ~]#ssh-copy-id -i ~/.ssh/id_rsa.pub "-p 22 root@192.168.1.C"
[root@linuxmi ~]#ssh-copy-id -i ~/.ssh/id_rsa.pub "-p 22 root@192.168.1.D"
#出現讓輸入B、C、D的root密碼時,輸入密碼後回車,出現如下提示時表示建立本機到目標主機的信任關係成功
Now try logging into the machine, with "ssh '-p 22 root@192.168.1.B'", and check in:

  .ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

2,建立上傳檔案到目標FTP伺服器的指令碼

  客戶的要求是每天凌晨上傳前一天的資料,我們生成的資料檔案都是以當天日期_主機名_Result.csv型別的。

#以下展示指令碼的內容
[root@linuxmi getfile] cat upload_csv.sh
#!/bin/bash
#此指令碼用於每天定時將生成的資料檔案上傳到客戶FTP伺服器

#指定上傳檔案所在的主目錄
SRCDIR=/tmp/test_jr/getfile/files/
#指定所需上傳對端FTP伺服器的目錄
DESDIR=/JRAQ_FILE/

#指定對端FTP伺服器的使用者名稱和密碼
USER=finftp
PASSWD="ABC@123"
#指定目標FTP伺服器的IP
IP=3.3.3.3
#指定目標FTP伺服器埠,一般都是預設
PORT=21

#指定所要上傳檔案的日期
targetDay=`date -d "-1 days" +"%Y%m%d"`

#獲取所要上傳的檔案
cd $SRCDIR
for host in 192.168.1.B 192.168.1.C 192.168.1.D
do
    scp root@$host:$SRCDIR/$targetDay_*_Result.csv ./
done
#判定檔案是否獲取正確
[ $? -eq 0 ] || echo "Copy romote files failed, pls check." >>$SRCDIR/upload_file.log

#上傳檔案到FTP伺服器
ftp -ivn <<EOF
    open $IP $PORT
    user $USER $PASSWD
    binary
    cd $DESDIR
    lcd $SRCDIR
    put ${targetDay}_*_Result.csv
    quit
EOF

#判定檔案是否上傳成功
[ $? -eq 0 ] && echo "Upload $targetDay's files to romote FTP server successful." >>$SRCDIR/upload_file.log || echo "Upload files failed, pls check." >>$SRCDIR/upload_file.log

3,有可能用到的轉碼

  由於csv檔案是可以用Excel開啟的,但是Excel開啟utf-8編碼的檔案時,所有中文名稱會顯示亂碼,此時就需要用到轉碼,比如將utf-8格式轉換成gbk編碼的,Excel就可以完美開啟了。

[root@linuxmi ~]iconv -futf8 -tgbk -c -o file2.csv file1.csv
#file1是待轉碼的檔案
#file2是轉碼後檔名
#-f --from-code 即從那種格式轉化
#-t --to-code 轉化為那種格式
#-o --output 輸出的檔名
#-c 忽略輸出的非法字元  加這個引數是防止檔案中有某些非法字串,如果不加此引數iconv遇到非法字串後會自動終止轉碼,即使後面還有正常的未轉碼的字元。


IT145.com E-mail:sddin#qq.com