下载网页的脚本

时间:2015-05-05 15:50:37

标签: linux bash webserver

我创建了一个Web服务器来本地显示我的页面,因为它位于一个连接不良的地方所以我想要做的是下载页面内容并替换旧的,所以我让这个脚本在后台运行但是我不太确定这是否会全天候工作(2米只是为了测试它,但我希望它等待6-12小时),所以,¿你对这个脚本怎么看?不安全吗?或者足够我正在做什么?谢谢。

#!/bin/bash
a=1;
while [ $a -eq 1 ]
do
echo "Starting..."
sudo wget http://www.example.com/web.zip  --output-document=/var/www/content.zip
sudo unzip -o /var/www/content.zip -d /var/www/
sleep 2m
done
exit

更新:我现在使用的代码: (只是原型,但我假装不使用sudo)

#!/bin/bash
a=1;
echo "Start"
while [ $a -eq 1 ]
do
echo "Searching flag.txt"
if [ -e flag.txt ]; then
    echo "Flag found, and erasing it"
    sudo rm flag.txt

    if [ -e /var/www/content.zip ]; then
    echo "Erasing old content file"
        sudo rm /var/www/content.zip
    fi
    echo "Downloading new content"
    sudo wget ftp://user:password@xx.xx.xx.xx/content/newcontent.zip  --output-document=/var/www/content.zip
    sudo unzip -o /var/www/content.zip -d /var/www/
    echo "Erasing flag.txt from ftp"
    sudo ftp -nv < erase.txt
    sleep 5s
else
    echo "Downloading flag.txt"
    sudo wget ftp://user:password@xx.xx.xx.xx/content/flag.txt
    sleep 5s
fi
echo "Waiting..."
sleep 20s

done
exit 0

erase.txt

open xx.xx.xx.xx
user user password
cd content
delete flag.txt
bye

2 个答案:

答案 0 :(得分:2)

我建议设置一个cron作业,这比具有巨大sleep s的脚本更可靠。

简要说明:

如果您拥有/var/www/的写入权限,只需将下载内容放入您的个人crontab即可。 运行crontab -e,粘贴此内容,保存并退出编辑器:

17 4,16 * * * wget http://www.example.com/web.zip --output-document=/var/www/content.zip && unzip -o /var/www/content.zip -d /var/www/

或者您可以从系统crontab运行下载。 创建文件/etc/cron.d/download-my-site并将此内容放入:

17 4,16 * * * <USERNAME> wget http://www.example.com/web.zip --output-document=/var/www/content.zip && unzip -o /var/www/content.zip -d /var/www/

<USERNAME>替换为具有/var/www的适当权限的登录信息。

或者您可以将所有必要的命令放入单个shell脚本中,如下所示:

#!/bin/sh
wget http://www.example.com/web.zip --output-document=/var/www/content.zip
unzip -o /var/www/content.zip -d /var/www/

并从crontab调用它:

17 4,16 * * * /path/to/my/downloading/script.sh

这项任务每天运行两次:4:17和16:17。如果您愿意,可以设置另一个时间表。

更多关于cron jobs,crontabs等的信息:

答案 1 :(得分:1)

简单地unzip ping你的新版本的内容可能不是最好的解决方案。如果您从网站中删除文件怎么办?本地副本仍将拥有它。此外,使用基于zip的解决方案,您每次复制时都会复制每个文件,而不仅仅是已更改的文件。

我建议您使用rsync来同步您的网站内容。

如果您将本地文档设置为/var/www/mysite/,则替代脚本可能如下所示:

#!/usr/bin/env bash

logtag="`basename $0`[$$]"

logger -t "$logtag" "start"

# Build an array of options for rsync
#
declare -a ropts
ropts=("-a")
ropts+=(--no-perms --no-owner --no-group)
ropts+=(--omit-dir-times)
ropts+=("--exclude ._*")
ropts+=("--exclude .DS_Store")

# Determine previous version
#
if [ -L /var/www/mysite ]; then
    linkdest="$(stat -c"%N" /var/www/mysite)"
    linkdest="${linkdest##*\`}"
    ropts+=("--link-dest '${linkdest%'}'")
fi

now="$(date '+%Y%m%d-%H:%M:%S')"

# Only refresh our copy if flag.txt exists
#
statuscode=$(curl --silent --output /dev/stderr --write-out "%{http_code}" http://www.example.com/flag.txt")
if [ ! "$statuscode" = 200 ]; then
    logger -t "$logtag" "no update required"
    exit 0
fi

if ! rsync "${ropts[@]}" user@remoteserver:/var/www/mysite/ /var/www/"$now"; then
    logger -t "$logtag" "rsync failed ($now)"
    exit 1
fi

# Everything is fine, so update the symbolic link and remove the flag.
#
ln -sfn /var/www/mysite "$now"
ssh user@remoteserver rm -f /var/www/flag.txt

logger -t "$logtag" "done"

此脚本使用了一些您可能需要安装的外部工具(如果它们尚未在您的系统上):

  • rsync,你已经读过,
  • curl,可以用wget替换..但我更喜欢curl
  • logger,可能与syslog或rsyslog一起安装在您的系统中,也可能是“unix-util”软件包的一部分,具体取决于您的Linux发行版。

rsync提供了许多有用的功能。特别是:

  • 它尝试仅复制已更改的内容,这样就不会在相同的文件上浪费带宽,
  • --link-dest选项允许您引用以前的目录来创建未更改文件的“链接”,这样您就可以拥有目录的多个副本,只包含未更改文件的单个副本。

为了实现此目的,rsync部分和ssh部分,您需要设置SSH密钥,以便您无需密码即可进行连接。这并不难,但如果你不知道它,那就是一个不同问题的主题......或者用你最喜欢的搜索引擎进行简单的搜索。

您可以每5分钟从crontab运行一次:

*/5 * * * * /path/to/thisscript

如果您想更频繁地运行它,请注意,对于涉及更新的每项检查,您将使用的“流量”是flag.txt文件的HTTP GET。 / p>