我需要自动执行一项任务,即在 https:// Web 服务器上下载 XML 文件(带有身份验证)并将其上传到 FTP 服务器(带有另一个身份验证)。
所以我认为最好的方法是使用 CURL(或 WGET)下载文件并使用 lftp 上传!?
但是我不知道如何在 .sh 文件中编写脚本来使用 cron(每周四早上 8 点)对其进行编程。
你有例子吗?
编辑
下载文件示例:
https://www.domain.ltd/.../export.aspx?dt=07.08.2017
(dd.mm.YYYY 格式)
上传时 FTP 服务器中的文件名示例:
export_07.08.2017.xml
答案1
您的问题实际上由三个问题组成:1)如何下载文件(使用身份验证)2)如何上传文件(使用身份验证)3)如何安排 CRON 作业
我的第一个问题是你想如何存储 id/passwd
广告 1) 您可以同时使用这两种方法curl
,wget
具体取决于哪种方法更适合您的用例。我建议您阅读 Daniel Stenberg 的精彩文章curl 与 Wget了解差异(快速总结 -curl
对开发人员更友好,也是一个库,一个wget
命令)。
我建议使用没有用户/密码的证书,因为这样每个拥有您的 ID 或组的人都可以看到它。
在我的示例中,我将使用curl
证书:
curl --cert certificate_file.pem https://example.com/example.xml
广告2)上传文件
curl -T example.xml --cert certificate_file.pem ftps://ftp.server.com/remotedir/
广告 3)Cron 格式:
# Minute Hour Day of Month Month Day of Week Command
# (0-59) (0-23) (1-31) (1-12 or Jan-Dec) (0-6 or Sun-Sat)
0 2 12 * * /usr/bin/find
您只能crontab -e
编辑 crontab 文件。其他方法可能会导致文件损坏。
如果您想要每周四上午 8 点运行文件,请按以下方式执行:
0 8 1-31 1-12 4 /path/your_script.sh
或者您也可以这样执行*
:0 8 * * 4 /path/your_script.sh
。
如果您想了解更多,请访问:Cron 和 Crontab 的使用及示例
现在把它们放在一起:
#!/bin/bash
# $1 is your command line input (e.g. example.xml)
file_download=$1
file_upload=$2
actual_download="curl --cert certificate_file.pem https://example.com/$file_download"
eval $actual_download
if [ -e "$file_upload" ] then
actual_upload="curl -T $file_upload --cert certificate_file.pem ftps://ftp.server.com/remotedir"
eval $actual_upload
else
echo "The $file_upload does not exist!"
fi
然后执行该文件:
your_script.sh /path/example_download.xml /path/example_upload.xml
答案2
在聊天中@djsmiley2k 和@tukan 的帮助下...我的工作方法如下:
#!/bin/bash
#source
host_from="https://some_web_server/.../export"
file_download=export.aspx?dt=`date +%d.%m.%Y`
user_from="www_user"
pass_from="www_password"
#download file form web server
xml_file="curl -u '$user_from:$pass_from' $host_from/$file_download"
# destination
host_to="some_ftp_server/httpdocs/subfolder/.../Export"
file_upload=`date +%d.%m.%Y`.xml
user_to="ftp_user"
pass_to="ftp_password"
#upload file to FTP server
xml_upload="curl -T $file_upload -u '$user_to:$pass_to' $host_to/$file_upload"
主要问题是使用单引号来转义用户和密码变量。