下载网页的脚本
Script to download a web page
我做了一个网络服务器来在本地显示我的页面,因为它位于一个连接不良的地方所以我想做的是下载页面内容并替换旧的,所以我制作了这个脚本运行 在后台,但我不太确定这是否会 24/7 工作(2m 只是为了测试它,但我希望它等待 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
我建议设置一个 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 作业、crontab 等的更多信息:
简单地 unzip
ping 新版本的内容覆盖旧的可能不是最好的解决方案。如果您从站点中删除文件怎么办?本地副本仍将拥有它。此外,使用基于 zip 的解决方案,您每次复制时都会复制每个文件,而不仅仅是已更改的文件。
我建议您改用 rsync
来同步您的网站内容。
如果您将本地文档根设置为类似 /var/www/mysite/
的内容,则替代脚本可能如下所示:
#!/usr/bin/env bash
logtag="`basename [=10=]`[$$]"
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
选项让您可以参考以前的目录来创建 "links" 未更改的文件,这样您就可以拥有目录的多个副本,而只有一个未更改文件的副本。
为了完成 rsync
部分和 ssh
部分,您需要设置 SSH 密钥,以便无需密码即可连接。这并不难,但如果您还不知道,那就是另一个问题的主题......或者使用您最喜欢的搜索引擎进行简单搜索。
您可以每 5 分钟从 crontab 运行 执行此操作:
*/5 * * * * /path/to/thisscript
如果你想更频繁地运行它,请注意你将用于每个不涉及更新的检查的"traffic"是flag.txt 文件的 HTTP GET。
我做了一个网络服务器来在本地显示我的页面,因为它位于一个连接不良的地方所以我想做的是下载页面内容并替换旧的,所以我制作了这个脚本运行 在后台,但我不太确定这是否会 24/7 工作(2m 只是为了测试它,但我希望它等待 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
我建议设置一个 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 作业、crontab 等的更多信息:
简单地 unzip
ping 新版本的内容覆盖旧的可能不是最好的解决方案。如果您从站点中删除文件怎么办?本地副本仍将拥有它。此外,使用基于 zip 的解决方案,您每次复制时都会复制每个文件,而不仅仅是已更改的文件。
我建议您改用 rsync
来同步您的网站内容。
如果您将本地文档根设置为类似 /var/www/mysite/
的内容,则替代脚本可能如下所示:
#!/usr/bin/env bash
logtag="`basename [=10=]`[$$]"
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
选项让您可以参考以前的目录来创建 "links" 未更改的文件,这样您就可以拥有目录的多个副本,而只有一个未更改文件的副本。
为了完成 rsync
部分和 ssh
部分,您需要设置 SSH 密钥,以便无需密码即可连接。这并不难,但如果您还不知道,那就是另一个问题的主题......或者使用您最喜欢的搜索引擎进行简单搜索。
您可以每 5 分钟从 crontab 运行 执行此操作:
*/5 * * * * /path/to/thisscript
如果你想更频繁地运行它,请注意你将用于每个不涉及更新的检查的"traffic"是flag.txt 文件的 HTTP GET。