我有一个很长的脚本(> 500 行),我从本地文件加载到网页的每次引导中。该脚本的源代码经常更新并在某个 URL 下呈现,以便所有用户都可以更新包含该脚本的本地文件(因为很多人更喜欢在本地加载它)。
不更新此脚本经常会暴露我的网站存在安全漏洞,但我不想在每次更新时复制和粘贴数据,而是想使用 Cron 任务自动将其重新加载到本地(例如0 0 1 * 0
)。
Unix 中有没有办法将 URL 可访问脚本中的所有数据复制并粘贴到本地脚本文件中?
我想这将包括类似的重写<< EOF > ... EOF
,但这次,不是来自我自己在 Bash 提示符中的本地标准输入,而是来自远程文件。
答案1
至少有两种可能的方法可以做到这一点:
方式 1 - 在 cron 作业中使用curl:
使用curl
(如果尚未安装,请安装)。curl
使用任何常用协议(HTTP、HTTPS、FTP)下载文件。您可以curl
在 cron 作业中使用定期下载脚本的新副本。用于man curl
调用详细信息。
curl -o /path/to/script http://www.example.com/script
您可能希望以与生产中执行的脚本不同的名称下载脚本,并且当下载成功时,mv
它会覆盖生产脚本;这是为了避免在下载过程中调用脚本时出现任何问题。
方式 2 - 使用包装脚本:
编写一个包装器,根据需要下载脚本,然后exec
调用它(取决于脚本语言)。示例是用Bash编写的,这样逻辑很容易理解;对于其他脚本语言,您将不得不适应。例如,假设本地脚本名为real-script
且 URL 为http://www.example.com/real-script
。包装器可以是wrapper-script
:
#! /bin/bash
if [ -f /path/to/real-script ] ; then
# Local copy exists, download only if remote file is newer
curl -z /path/to/real-script -o /path/to/real-script http://www.example.com/real-script
else
# Local copy does not exist, always download
curl -o /path/to/real-script http://www.example.com/real-script
fi
chmod 755 /path/to/real-script
exec /path/to/real-script "$@"
像调用真实脚本一样调用此包装脚本;如果没有本地副本或者本地副本比远程文件旧,包装器将下载真实脚本;然后它将执行传递任何参数的保证的新鲜副本。
如果现有本地副本不超过 5 分钟或您允许的任何时间间隔,您可能还希望避免寻找较新的版本。
请注意,在生产中使用此方法时,可能需要进行一些错误检查。