簡體   English   中英

bash sh腳本進行遠程備份

[英]bash sh script for remote backups

我在服務器上遇到問題,在這種情況下,從服務器到遠程主機的自動備份失敗。

目前,這使我沒有最近的備份,也沒有一堆.tar.gz文件占用服務器上的大量空間。

目前,我要糾正此問題的當前過程是手動輸入膩子,並通過命令行在各個文件中分別通過FTP傳輸這些文件。 這既費時又乏味。

我想編寫一個.sh腳本,我可以將其上傳到該文件夾​​,並告訴服務器將文件夾中的每個.tar.gz文件放入其中。 我無法傳輸整個文件夾,而只能傳輸其中的每個文件,因為某些文件已經正確傳輸,等等。

我發現了這個問題該問題顯示了一個適用於該問題發問者的腳本,但我需要調整此腳本的一部分,我不知道(不夠自信)使用.sh指令來執行此操作,並且也對搞砸任何內容持謹慎態度服務器端。

#!/bin/sh
USERNAME="user"
PASSWORD="pass"
SERVER="123.456.78.90"
DATE="`date +%Y-%m-%d`"
BACKUPDIR="/${DATE}/accounts/"

find . -type f -name "*.tar.gz" -exec basename {} .tar.gz \; |
  while read filename ; do
    /bin/ftp -inv $SERVER >> /tmp/ftp_backup.log <<EOF
user $USERNAME $PASSWORD
cd $BACKUPDIR
binary
put $filename
EOF
    echo "$date copied $filename" >> /tmp/ftp_backup.log
done

我的目的是讓這個腳本,我可以把它上傳到服務器文件夾中的問題,然后運行該腳本(后chmod文件夾中移動的荷蘭國際集團吧) .tar.gz文件-一個在一個時間- FTP'd轉到備份目錄( /<date>/accounts/ ),並在它們全部移動后完成。

(然后,我將刪除服務器端的.tar.gz文件和上面的.sh腳本。)

共有約60個文件,最大大小為15Gb。 文件名不包含空格。

文件路徑結構:

服務端:

/backupsfolder/2018-07-11/filename1.tar.gz
/backupsfolder/2018-07-11/filename2.tar.gz
/backupsfolder/2018-07-11/backupscript.sh //我上面的腳本
/backupsfolder/2018-07-11/master.meta //其他文件

FTP端:

/2018-07-11/accounts/filename1.tar.gz

為此,我需要對上述腳本進行哪些調整?

經過一些工作后,我發現了一些需要注意和解決的問題:

1)為了運行, .sh文件需要在服務器上使用chmod來“啟用”。

 chmod +x ./<filename> 

2) Unix行尾; 使用Notepad ++時,它聲稱已保存了正確的行尾,但是該錯誤出現在以下服務器上:

/ bin / sh ^ M:解釋錯誤:沒有這樣的文件或目錄

這可以通過以下方式解決:

 sed -i 's/\\r//' <filepath>/<filename> 

這個答案

3)推送到FTP的文件名是錯誤的-不包括.tar.gz-我還沒有意識到-exec功能會切斷.tar.gz

這是固定的

 -exec basename {} .tar.gz 

變成

 -exec basename {} 

4)日志文件輸出未在新行上設置; 而是全部都在同一條線上。 通過閱讀此anwser並在echo語句上使用-e並使用\\n語法,可以解決此問題。

echo -e "$date copied $filename\n" 

最終完全可用的bash腳本可以滿足我的需求:

  • 1)將腳本保存到服務器
  • 2)運行sed -i 's/\\r//' /<filepath>/<filename>
  • 3)運行chmod +x ./<filename>
  • 4)在bash中運行文件。
  • 5)在指定的tmp目錄中查看結果。

劇本

該腳本從當前目錄中獲取.tar.gz文件,並將它們保存到遠程FTP,依次循環瀏覽每個文件。

#!/bin/sh
USERNAME="user"
PASSWORD="pass"
SERVER="123.456.78.90"
DATE="`date +%Y-%m-%d`"
BACKUPDIR="/${DATE}/accounts/"

find . -type f -name "*.tar.gz" -exec basename {} \; |
  while read filename ; do 
    ftp -inv $SERVER >> /tmp/My_ftp_backup.log <<EOF
user $USERNAME $PASSWORD
cd $BACKUPDIR
binary
put $filename
EOF
    echo -e "$date copied $filename\n" >> /tmp/My_ftp_backup.log
done

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM