練功房推薦書單

  • 猛虎出柙雙劍合璧版:最新 OCA / OCP Java SE 7 Programmer 專業認證
  • 流浪教師存零股存到3000萬
  • SCJP 6.0認證教戰手冊(第二版)Oracle Certified Professional Java Programmer(附光碟)
  • 小資女艾蜜莉:我的資產翻倍存股筆記
[Linux]如何定時自動備份網站及資料庫到遠端伺服器  RSS feed
Forum Index » Linux
Author Message
andowson

七段學員
[Avatar]

Joined: 2007-01-02 22:20:40
Messages: 705
Location: 台北
Offline
要讓網站不因為機器硬體故障或人為操作錯誤而造成損失,備份是需要的。雖然我們可以將整個硬碟備份並燒成光碟,但是每天燒一片也等於每天製造一片垃圾(如果網站都一直沒事的話)。故我們可以採用將重要資料備份到硬碟的作法,如果一段時間沒用上,我們可以將最舊的備份資料刪除掉,這樣就不怕資料庫掛了或人為錯誤了。不過存放在本地端硬碟也有個風險,就是一旦硬碟掛了,就什麼都沒有了。比較保險一點的作法是同時也上傳一份檔案到遠端伺服器去,同時可以每個月或每季再燒錄一片光碟以縮短真正需要復原時的下載時間。

由於很多檔案只要知道名字透過網路都可以找到,這些可以不用去備份它,來縮小備份檔的大小,加快檔案上傳到遠端伺服器。故我們需要的是找出真正需要備份的資料檔或設定檔。以我的例子來說,當初規劃的目標是安裝一部主機可以達到下列功能
a. Internet connection(ADSL)
b. Dynamic IP DNS Mapping(no-ip)
c. SSH Server
d. FTP Server
e. DNS Server
f. Mail Server(Postfix + POP3/IMAP + Anti-Spam + Virus Scan)
g. Web Server(Apache + Tomcat + SSL)
h. Database Server(PostgreSQL)
i. Traffic monitor(SNMP, MRTG, AWstats)
j. Firewall(Auto-block)
故當我要備份時便要找到它們相關的設定檔,我把它們的內容列在backup.ini內,大致如下:
/etc/awstats/*
/etc/cron.hourly/split-vhost.sh
/etc/httpd/conf/httpd.conf
/etc/httpd/conf/workers.properties
/etc/httpd/conf/ssl.crt/server.crt
/etc/httpd/conf/ssl.key/server.key
/etc/httpd/conf.d/*.conf
/etc/mrtg/mrtg.cfg
/etc/mrtg/mrtg.cpu
/etc/mrtg/mrtg.ram
/etc/postfix/access
/etc/postfix/*.cf
/etc/rc.d/init.d/noip
/etc/rc.d/init.d/tomcat
/etc/ssh/sshd_config
/etc/sysconfig/i18n
/etc/vsftpd/vsftpd.conf
/etc/yum.repos.d/CentOS-Base.repo
/etc/aliases
/etc/amavisd.conf
/etc/crontab
/etc/dovecot.conf
/etc/f-prot.conf
/etc/fstab
/etc/group
/etc/hosts
/etc/hosts.allow
/etc/hosts.deny
/etc/named.conf
/etc/passwd
/etc/php.ini
/etc/resolv.conf
/etc/vsftpd.chroot_list
/etc/vsftpd.ftpusers
/etc/vsftpd.user_list
/root/admin/*
/root/newsite/*
/root/setup/*.sh
/root/setup/*/*.sh
/usr/bin/split-vhost.pl
/usr/lib/sasl2/smtpd.conf
/var/lib/pgsql/data/*.conf
/var/lib/awstats/*
/var/lib/webalizer/*
/var/named/chroot/var/named/named.*
/var/robust/worker1/conf/server.header
/var/robust/worker1/conf/server.host
/var/robust/worker1/conf/server.footer
/var/robust/worker1/conf/server.xml
/var/robust/worker1/conf/tomcat-users.xml
/var/robust/worker1/conf/Catalina/*
/var/robust/worker2/conf/server.header
/var/tomcat5/bin/setenv.sh
/var/tomcat5/common/classes/*
/var/tomcat5/common/endorsed/jarlist.txt
/var/tomcat5/common/lib/jarlist.txt
/var/www/mrtg/*.png
/var/www/mrtg/*.old
/var/www/mrtg/*.log
/var/www/mrtg/cpu.html
/var/www/mrtg/ram.html
/var/www/mrtg/net.html
/var/www/mrtg/index.html
/var/www/usage/*

/root/目錄下是我自己管理用的一些shell script,它們也一併備份起來。
接下來,我的網站安裝了兩套JForum來跑兩個網站,由於JForum可以由網路上下載得到,故我只需要備份無法從網路上下載得到的部分即可在需要復原網站時派上用場。另外,我自己開發了一些程式,我也一併整理進來,我把這個清單檔案命名為webapp.ini,內容大致如下:
/home/andowson/www/*.*
/home/andowson/www/images/*.gif
/home/andowson/www/images/avatar/*
/home/andowson/www/templates/default/*.htm
/home/andowson/www/templates/default/styles/zh_*.css
/home/andowson/www/upload/*
/home/andowson/www/WEB-INF/*.xml
/home/andowson/www/WEB-INF/config/*.*
/home/andowson/www/WEB-INF/config/database/generic/*
/home/andowson/www/WEB-INF/config/database/postgresql/*
/home/andowson/www/WEB-INF/config/languages/zh_*.properties
/home/andowson/www/aquamp/*
/home/30elite/www/*.*
/home/30elite/www/images/*.gif
/home/30elite/www/images/avatar/*
/home/30elite/www/templates/tp101/*.htm
/home/30elite/www/templates/tp101/styles/zh_*.css
/home/30elite/www/upload/*
/home/30elite/www/WEB-INF/*.xml
/home/30elite/www/WEB-INF/config/*.*
/home/30elite/www/WEB-INF/config/database/generic/*
/home/30elite/www/WEB-INF/config/database/postgresql/*
/home/30elite/www/WEB-INF/config/languages/zh_*.properties

好了,檔案的部分就差不多這樣子。別忘了,還有資料庫要備份,由於先前我還安裝了olat,故在資料庫上多了一個olat資料庫要備份,這段我把它通通整理到/root/admin/backup.sh裡面去,先把資料庫名稱存到陣列DBNAME去,透過迴圈的方式,透過pg_dump指令將資料庫備份到檔案,再將備份好的資料庫加到到db.tar去,最後再一次gzip起來。
由於這個backup.sh程式我可以設定為每天執行一次,故我想連系統狀態一併作個檢查,順便產生一個網頁檔好了,於是我又弄了一個backup.html的樣版檔,內容大致如下:
<html>
<head>
<title>[ hostname ] 每日檢查報表</title>
</head>
<body>
<center>
<h2>[ hostname ] 每日檢查報表</h2>
</center>
<div align="left">
    <table>
        <tr>
            <td>主機名稱:</td>
            <td>hostname</td>
        </tr>
        <tr>
            <td>主機IP:</td>
            <td>ip</td>
        </tr>
        <tr>
            <td>作業系統:</td>
            <td>os_version</td>
        </tr>
        <tr>
            <td>Maintainer:</td>
            <td>webmaster@hostname</td>
        </tr>
        <tr>
            <td>CPU型號:</td>
            <td>cpumodel</td>
        </tr>
        <tr>
            <td>快取記憶體大小:</td>
            <td>cachesize</td>
        </tr>
        <tr>
            <td>實體記憶體大小:</td>
            <td>memsize MB</td>
        </tr>
        <tr>
            <td>虛擬記憶體大小:</td>
            <td>swapsize MB</td>
        </tr>
        <tr>
            <td>已開機時間:</td>
            <td>UPtime</td>
        </tr>
        <tr>
            <td>備份時間:</td>
            <td>backtime</td>
        </tr>
    </table>
</div>
<table>
  <tr>
        <td>Log Type</td>
        <td>File Name</td>
        <td>Size</td>
    </tr>
    <tr>
        <td>Apache LOG</td>
        <td>/var/log/httpd/access_log</td>
        <td>httpd_log_size MB</td>
    </tr>
  <tr>
        <td>Tomcat LOG</td>
        <td>/var/robust/worker1/logs/catalina.out</td>
        <td>tomcat_log_size MB</td>
    </tr>
  <tr>
        <td>Login LOG</td>
        <td>/var/log/lastlog</td>
        <td>lastlog_size MB</td>
    </tr>
  <tr>
        <td>Sendmail LOG</td>
        <td>/var/log/maillog</td>
        <td>maillog_size byte(s)</td>
    </tr>
  <tr>
        <td>System LOG</td>
        <td>/var/log/messages</td>
        <td>messages_size byte(s)</td>
    </tr>
</table>
<p></p>
<table>
    <!-- MSTableType="layout" -->
    <tr>
        <td>IP</td>
        <td><a href="http://ip/mrtg/cpu.html">CPU Loading(%)</a></td>
        <td><a href="http://ip/mrtg/ram.html">RAM Usage(%)</a></td>
        <td>HD Usage(%)</td>
        <td><a href="http://ip/mrtg/ip_2.html">Bandwidth</a></td>
    </tr>
    <tr>
        <td>ip</td>
        <td>使用者: cpuusr%<p>系統: cpusys%</td>
        <td>實體: memused%<p>虛擬: swapused%</td>
        <td>

透過sed指令將一些變數取代掉。最後將這個網頁傳到遠端的網頁主機並發一封通知信,這樣就不會忘記每天去看一下狀態了。
詳細的backup.sh如下:
#! /bin/bash
# Name: Backup and System Health Check Report
# Author: Andowson Chang (andowson [at] gmail [dot] com)
# Version: 1.2
# First Released: 2005/11/09
# Last Modified: 2007/06/24

# Modify the following line for your environment
ADMIN_PATH=/root/admin
BACKUP_FILE_PATH=/home/andowson/backup
DBNAME=( forum elite olat )
MAILTO=someone@andowson.com
NOTICE=${BACKUP_FILE_PATH}/notice.html
REMOTE_WEB=remote.andowson.com

ip=`/sbin/ifconfig eth0|grep "inet addr"|awk '{print $2}'|cut -d":" -f2`
checkdate=`date +%Y%m%d`

# Generate jarlist.txt for recover jar files
cd /var/tomcat5/common/endorsed
ls *.jar > jarlist.txt
cd /var/tomcat5/common/lib
ls *.jar > jarlist.txt

# Backup system config files
rm -rf ${BACKUP_FILE_PATH}/${ip}.tar.gz
tar zcvf ${BACKUP_FILE_PATH}/${ip}.tar.gz `cat ${ADMIN_PATH}/backup.ini`

# Backup web application files
tar zcvf ${BACKUP_FILE_PATH}/webapp_${checkdate}.tar.gz `cat ${ADMIN_PATH}/webapp.ini`

# Backup PostgreSQL databases
for (( i = 0 ; i &lt ${#DBNAME[@]} ; i++ ))
do
    su - postgres -c "pg_dump ${DBNAME[i]} > /var/lib/pgsql/backups/${DBNAME[i]}_${checkdate}.bak"
    tar rvf ${BACKUP_FILE_PATH}/db_${checkdate}.tar /var/lib/pgsql/backups/${DBNAME[i]}_${checkdate}.bak
done
gzip -f ${BACKUP_FILE_PATH}/db_${checkdate}.tar

backuptime=`date "+%Y-%m-%d %T"`

# Get system hardware information and status
hostname=`/bin/hostname`
os_version=`uname`" "`uname -r`
cpumodel=`cat /proc/cpuinfo|grep "model name"|awk '{print $4" "$5" "$6" "$7}'|head -1`
clock=`cat /proc/cpuinfo|grep "model name"|awk '{print $7}'|head -1`
cachesize=`cat /proc/cpuinfo|grep "cache size"|awk '{print $4" "$5}'|head -1`
mem=`cat /proc/meminfo|grep "MemTotal:"|awk '{print $2}'`
swap=`cat /proc/meminfo|grep "SwapTotal:"|awk '{print $2}'`
let MB=1024*1024
let KB=1024
let memsize=$mem/$KB
let swapsize=$swap/$KB
UPtime=`/usr/bin/uptime | awk '{print $3 " " $4 " " $5}' | cut -d"," -f1-2`

cpuusage=`/usr/bin/sar -u 1 3 | grep Average | awk '{print $3 " " $5}'`
cpuusr=`echo $cpuusage | cut -d" " -f1`
cpusys=`echo $cpuusage | cut -d" " -f2`

ramusage=`/usr/bin/sar -r 3 3 | grep Average | awk '{print $4 " " $9}'`
memused=`echo $ramusage | cut -d" " -f1`
swapused=`echo $ramusage | cut -d" " -f2`

hdusage=`df -t ext3 -h|awk '{print $6"\t" $2"\t" $3"\t" $4"\t" $5}'`

let lastlog_size=`/bin/ls -l /var/log/lastlog|awk '{print $5}'`/$MB
let maillog_size=`/bin/ls -l /var/log/maillog|awk '{print $5}'`
let messages_size=`/bin/ls -l /var/log/messages|awk '{print $5}'`
let httpd_log_size=`/bin/ls -l /var/log/httpd/access_log|awk '{print $5}'`/$MB
let tomcat_log_size=`/bin/ls -l /var/robust/worker1/logs/catalina.out|awk '{print $5}'`/$MB

grep "b/秒" /var/www/mrtg/${ip}_2.html |awk '{print $2 $3}'|cut -d ">" -f3|head -6 > /tmp/mrtg.tmp
maxin=`head -1 /tmp/mrtg.tmp`
avgin=`tail -5 /tmp/mrtg.tmp|head -1`
maxout=`tail -3 /tmp/mrtg.tmp|head -1`
avgout=`tail -2 /tmp/mrtg.tmp|head -1`
# Generate HTML report page
sed -e "s/hostname/$hostname/g" -e "s/ip/$ip/g" -e "s/backtime/$backuptime/g" \
    -e "s/os_version/$os_version/g" -e "s/cpumodel/$cpumodel/g" \
    -e "s/cachesize/$cachesize/g" -e "s/memsize/$memsize/g" \
    -e "s/swapsize/$swapsize/g" -e "s/UPtime/$UPtime/g" \
    -e "s/lastlog_size/$lastlog_size/g" -e "s/maillog_size/$maillog_size/g" \
    -e "s/messages_size/$messages_size/g" -e "s/httpd_log_size/$httpd_log_size/g" \
    -e "s/tomcat_log_size/$tomcat_log_size/g" -e "s/cpuusr/$cpuusr/g" \
    -e "s/cpusys/$cpusys/g" -e "s/memused/$memused/g" \
    -e "s/swapused/$swapused/g" ${ADMIN_PATH}/backup.html > ${BACKUP_FILE_PATH}/${ip}_${checkdate}.html
echo "<pre>$hdusage</pre>" >> ${BACKUP_FILE_PATH}/${ip}_${checkdate}.html
echo "</td>
		<td >最大流入: ${maxin}<br>平均流入: ${avgin}<br>最大流出: ${maxout}<br>平均流出: ${avgout}</td>
	</tr>
</table>
</body>

</html>" >> ${BACKUP_FILE_PATH}/${ip}_${checkdate}.html
rm -rf /tmp/mrtg.tmp

echo "<html>
<head>
<title>每日系統檢查表</title>
</head>
<body>
<ul>
<li><a >${ip}</a></li>
</ul>
</body>
</html>" > ${BACKUP_FILE_PATH}/index.html

# Upload to remote backup server
cd ${BACKUP_FILE_PATH}
# The disk space is limited, so we only keep the lastest version
cp db_${checkdate}.tar.gz db.tar.gz
cp webapp_${checkdate}.tar.gz webapp.tar.gz
. ${ADMIN_PATH}/ftp.sh `cat ${ADMIN_PATH}/ftp.cfg` backup index.html
. ${ADMIN_PATH}/ftp.sh `cat ${ADMIN_PATH}/ftp.cfg` backup ${ip}_${checkdate}.html
. ${ADMIN_PATH}/ftp.sh `cat ${ADMIN_PATH}/ftp.cfg` backup db.tar.gz
. ${ADMIN_PATH}/ftp.sh `cat ${ADMIN_PATH}/ftp.cfg` backup ${ip}.tar.gz
. ${ADMIN_PATH}/ftp.sh `cat ${ADMIN_PATH}/ftp.cfg` backup webapp.tar.gz
rm -rf db.tar.gz
rm -rf webapp.tar.gz

echo "http://${REMOTE_WEB}/backup/${ip}_${checkdate}.html" > ${NOTICE}
mail -s "${hostname} ${checkdate}的備份及系統檢查已完成" ${MAILTO} &lt ${NOTICE}

echo "Done!"

對了,遠端伺服器的FTP設定我另外存到ftp.cfg去,格式如下:
remotehost username password

remotehost:請改成您的遠端主機IP(需有啟動FTP Server)
username:請改成您的FTP帳號
password:請改成您的FTP密碼
注意您得在遠端的主機上先建立一個backup的目錄!

至於ftp.sh的內容則很簡單,如下:
#! /bin/bash
/usr/bin/ftp -v -n >> /tmp/ftp.log <<EOD
open $1
user $2 $3
bi
prompt
cd $4
mput $5
quit
EOD

執行後可以到/tmp下看ftp的log檔。

最後,只要在/etc/crontab上加上定期自動執行backup.sh就完成了。
# backup data and generate system report(2007.06.24)
01 03 * * * root /root/admin/backup.sh > /var/log/backup.log


日後,如果有新安裝的程式或網站,只需要修改backup.ini或webapp.ini即可。

使用方式:
1.先將檔案下載存到/root/admin下,將backup.sh修改為可執行。
2.建立一個備份用的本地端目錄,例如如/home/andowson/backup。
3.在遠端伺服器上亦需建立一個backup資料夾。
4.編輯backup.ini, webapp.ini及ftp.cfg, 修改backup.sh上面的一些參數。
5.執行/root/admin/backup.sh > backup.log,看是否正常,如果正常才進行下個步驟,否則應繼續進行步驟4。
6.設定/etc/crontab

參考資料:
鳥哥的 Linux 私房菜-檔案的壓縮與打包
 Filename backup.ini [Disk] Download
 Description backup.ini
 Filesize 1 Kbytes
 Downloaded:  47 time(s)

 Filename backup.html [Disk] Download
 Description backup.html
 Filesize 2 Kbytes
 Downloaded:  53 time(s)

 Filename backup.sh [Disk] Download
 Description backup.sh
 Filesize 5 Kbytes
 Downloaded:  60 time(s)

 Filename webapp.ini [Disk] Download
 Description webapp.ini
 Filesize 1 Kbytes
 Downloaded:  57 time(s)

 Filename ftp.sh [Disk] Download
 Description ftp.sh
 Filesize 117 bytes
 Downloaded:  50 time(s)


分享經驗 累積智慧
[WWW] [MSN]
andowson

七段學員
[Avatar]

Joined: 2007-01-02 22:20:40
Messages: 705
Location: 台北
Offline
今天發現一篇備份MySQL資料庫的英文資料,供大家參考啦!
How to backup your MySQL tables and data every night using a bash script and cron

分享經驗 累積智慧
[WWW] [MSN]
andowson

七段學員
[Avatar]

Joined: 2007-01-02 22:20:40
Messages: 705
Location: 台北
Offline
backup.sh可以修改第11行來自動備份所有的PostgreSQL資料庫(除了postgres, template0, template1外)
DBNAME=( `psql -l -U postgres | awk '{print $1}' | sed -e "1,3d"|grep -v ":"|grep -v "("|grep -v "template"|grep -v "postgres"` )


分享經驗 累積智慧
[WWW] [MSN]
andowson

七段學員
[Avatar]

Joined: 2007-01-02 22:20:40
Messages: 705
Location: 台北
Offline
backup.sh每天會產生四種備份檔在本機硬碟上,檔名如下:
webapp_${checkdate}.tar.gz
${DBNAME[i]}_${checkdate}.bak
db_${checkdate}.tar.gz
${ip}_${checkdate}.html

時間久了也是會佔用很大的硬碟空間,所以我們需要定期去清理這些檔案,例如備份檔存放在/home/andowson/backup及/var/lib/pgsql/backups目錄下,我們只保留最近三十天的備份,則我們可以排定cron如下
44 04 1 * * root find /home/andowson/backup -name "*.tar.gz" -ctime +30 -type f -print0 | xargs -0 /bin/rm -f
46 04 1 * * root find /home/andowson/backup -name "192.168.1.2*.html" -ctime +30 -type f -print0 | xargs -0 /bin/rm -f
47 04 1 * * root find /var/lib/pgsql/backups -name "*.bak" -ctime +30 -type f -print0 | xargs -0 /bin/rm -f


分享經驗 累積智慧
[WWW] [MSN]
yuhfa2002

十級學員

Joined: 2009-01-11 20:07:37
Messages: 5
Offline
請問ftp.cfg這個檔案要放在哪裏?
andowson

七段學員
[Avatar]

Joined: 2007-01-02 22:20:40
Messages: 705
Location: 台北
Offline
yuhfa2002您好:
預設ftp.cfg是放在/root/admin目錄下,跟其他檔案放在一起。
您可以在backup.sh的113行看到下面的指令
. ${ADMIN_PATH}/ftp.sh `cat ${ADMIN_PATH}/ftp.cfg` backup index.html

而ADMIN_PATH的設定值是在backup.sh的第9行:
ADMIN_PATH=/root/admin

如果您想要放到不同的目錄,可以修改ADMIN_PATH的值即可。

分享經驗 累積智慧
[WWW] [MSN]
yuhfa2002

十級學員

Joined: 2009-01-11 20:07:37
Messages: 5
Offline
首先感謝您對我上一個問題的詳細回覆:
再者,要再請教你:請問若我的資料庫系統是mysql,則backup.sh,要怎麼更改?
而您在「使用方式」的第4點提到「.編輯backup.ini, webapp.ini及ftp.cfg, 修改backup.sh上面的一些參數。」其中的「 修改backup.sh上面的一些參數。」是要修改哪些「參數」?可否教導一下小弟,不好意思,因為小弟對於sh的語法不解,看到您這麼好的東西,想拿來運用,又怕設錯,只好一再打擾您!先謝謝了。
andowson

七段學員
[Avatar]

Joined: 2007-01-02 22:20:40
Messages: 705
Location: 台北
Offline
yuhfa2002您好:
感謝您的提問,讓我發現原來第二篇的MySQL備份英文資料已經消失了,我也沒有留下文章內容。所以我試著找一下MySQL官網的文件,發現有個mysqldump工具程式可以使用,請參考下面這幾個網址:
http://dev.mysql.com/doc/refman/5.0/en/mysqldump-sql-format.html
http://www.study-area.org/tips/mysql_backup.htm
要修改backup.sh,可以試著修改第32-37行替換為下面這幾行:
# line 032-037
# Backup MySQL databases
mysqldump --all-databases > /tmp/dump.sql
tar rvf ${BACKUP_FILE_PATH}/db_${checkdate}.tar /tmp/dump.sql

至於您問到的修改參數的部分,是指backup.sh的第8~14行,屬於我說明用的範例,請依您實際狀況修改,一般是修改備份的路徑、email和網站的網址。
008 # Modify the following line for your environment
009 ADMIN_PATH=/root/admin
010 BACKUP_FILE_PATH=/home/andowson/backup <=改成您的使用者名稱
011 DBNAME=( forum elite olat )<=改成您的資料庫名稱
012 MAILTO=someone@andowson.com <= 改成您的email信箱
013 NOTICE=${BACKUP_FILE_PATH}/notice.html
014 REMOTE_WEB=remote.andowson.com <= 改成您遠端的Web Server的網址或IP(有啟動FTP Server功能)

分享經驗 累積智慧
[WWW] [MSN]
yuhfa2002

十級學員

Joined: 2009-01-11 20:07:37
Messages: 5
Offline
不知怎麼?我的ftp登入都失敗?我已照您指導的在ftp.cfg裡做好相關的設定了。
我看其/tmp/ftp.log檔顯示如下:
Remote system type is UNIX.
Using binary mode to transfer files.
331 Password required for xxxxxx
530 Login incorrect.
Login failed.
然而我在ssh底下試著打入ftp指令登入到遠端,打入同於ftp.cfg裡的帳號、密碼,都可以正常登入!
不知問題在哪?
還望不吝賜教,謝謝!
andowson

七段學員
[Avatar]

Joined: 2007-01-02 22:20:40
Messages: 705
Location: 台北
Offline
yuhfa2002您好:
請試著將ftp.sh取代為下列的檔案內容,並自行修改第2~6行的變數值,然後單獨執行ftp.sh看看是否可以正常運作,如果有問題再將ftp.log附上。
#! /bin/bash
host=192.168.1.2
username=xxx
password=yyyyyyy
dir=/tmp
filename=test.txt
echo "test" > $filename
/usr/bin/ftp -v -n >> /tmp/ftp.log <<EOD
echo $host
open $host
echo $username
echo $password
user $username $password
bi
prompt
echo $dir
cd $dir
echo $filename
mput $filename
quit
EOD

分享經驗 累積智慧
[WWW] [MSN]
yuhfa2002

十級學員

Joined: 2009-01-11 20:07:37
Messages: 5
Offline
謝謝你的回覆,我試了,仍無法登入
ftp.log檔內容如下:
?Invalid command
?Invalid command
?Invalid command
?Invalid command
?Invalid command
331 Password required for xxxxxx
530 Login incorrect.
Login failed.
?Invalid command
?Invalid command
?Invalid command
?Invalid command
?Invalid command
?Invalid command
?Invalid command
530 Please login with USER and PASS
?Invalid command
?Invalid command
?Invalid command
mput test.txt^M^M? 530 Please login with USER and PASS
Passive mode refused.
?Invalid command
?Invalid command
221 Goodbye.
andowson

七段學員
[Avatar]

Joined: 2007-01-02 22:20:40
Messages: 705
Location: 台北
Offline
yuhfa2002您好:
抱歉,在ftp指令模式裡面不支援echo指令,所以應該要將所有的echo刪除:
#! /bin/bash
host=ftp.server.ip
username=ftpuser
password=ftppwd
dir=/
filename=test.txt
echo "test" > $filename
/usr/bin/ftp -v -n >> /tmp/ftp.log <<EOD
open $host
user $username $password
passive
bi
prompt
cd $dir
mput $filename
quit
EOD

另外,在您將ftp.sh上傳到主機時,請先執行一下dos2unix ftp.sh,然後再執行:
chmod 755 ftp.sh
./ftp.sh

注意,為便於除錯,建議每次執行ftp.sh前先刪除或清空/tmp/ftp.log

分享經驗 累積智慧
[WWW] [MSN]
yuhfa2002

十級學員

Joined: 2009-01-11 20:07:37
Messages: 5
Offline
已可登入,但ftp.log卻出現:

Passive mode off.
200 Type set to I
Interactive mode off.
250 CWD command successful
local: test.txt remote: test.txt
200 PORT command successful
550 test.txt: No such file or directory
221 Goodbye.

是不是因為ftp.sh裡的
dir=/
filename=test.txt
這兩行的設定要改?若是的話,請問要改為什麼?謝謝!
不好意思,一直打優!
andowson

七段學員
[Avatar]

Joined: 2007-01-02 22:20:40
Messages: 705
Location: 台北
Offline
yuhfa2002您好:
請先確認一下在您的ftp.sh目錄下,執行完./ftp.sh後有沒有產生一個test.txt檔案。
如果沒有請自行手動建立一個,然後再執行一次./ftp.sh。

分享經驗 累積智慧
[WWW] [MSN]
 
Forum Index » Linux
Go to: