【问题标题】:Why does this ftp get command work in my shell script but fail in cron为什么这个 ftp get 命令在我的 shell 脚本中工作但在 cron 中失败
【发布时间】:2015-06-24 15:43:14
【问题描述】:

我有一个 shell 脚本,我可以作为某个用户运行它以从服务器获取文件。我想在特定时间运行它。当我使用命令以该用户身份手动运行它时,它可以工作:

sudo -H -u myUser bash -c /absolute/path/to/my/script/myScript.sh

我想在一般 cron 中以该用户的身份运行脚本,所以我将该行添加到 /etc/crontab 中也可以:

16 10   * * *   myUser /absolute/path/to/my/script/myScript.sh >> /tmp/logOfMyScript.sh.txt

脚本本身是一个基本的(我的意思是基本的!)ftp 脚本,当我运行它时它可以工作:

#!/bin/bash
filename="myBinaryFile.dta"
hostname="ftp.mydomain.com"
username="myusername"
password="mypassword"
ftp -ivn $hostname <<EOF
quote USER $username
quote PASS $password
binary
get $filename
quit
EOF

当我使用命令(上)手动运行它时的结果是完美的:

[sudo] password for me: 
Connected to myDomain.com.
220---------- Welcome to Pure-FTPd [privsep] [TLS] ----------
220-You are user number 2 of 50 allowed.
220-Local time is now 07:55. Server port: 21.
220-IPv6 connections are also welcome on this server.
220 You will be disconnected after 15 minutes of inactivity.
331 User myUser OK. Password required
230 OK. Current restricted directory is /
200 TYPE is now 8-bit binary
local: myBinaryFile.dta remote: MyBinaryFile.dta
200 PORT command successful
150-Connecting to port 39317
150 1161.4 kbytes to download
226-File successfully transferred
226 2.476 seconds (measured here), 469.07 Kbytes per second
1189253 bytes received in 2.63 secs (442.0 kB/s)
221-Goodbye. You uploaded 0 and downloaded 1162 kbytes.
221 Logout.

比较我手动运行脚本的日志和 cron 的输出,以下几行是 cron 输出中的缺失。

200 PORT command successful
150-Connecting to port 39317
150 1161.4 kbytes to download
226-File successfully transferred
226 2.476 seconds (measured here), 469.07 Kbytes per second
1189253 bytes received in 2.63 secs (442.0 kB/s)

最糟糕的是最后一行说

221-再见。您上传了 0 字节,下载了 0 KB。

有人知道为什么在 cron 中不调用端口吗?是否有需要设置的变量。端口为正常端口21,在cron脚本的日志中显示为正常。

【问题讨论】:

  • 为什么不直接使用wget
  • 我试过 wget 但没用,或者我不明白如何指定文件的路径,因为 03 17 * * * myUser wget --user= "userName" --password="userPassword" "ftp.myDomain.com/myBinaryFile.dta"
  • 您必须指定ftp,例如wget --user="userName" --password="userPassword" "ftp://ftp.myDomain.com/myBinaryFile.dta" 确保首先在终端中尝试,并将 stdout 和 stderr 重定向到日志文件,以便您可以通过附加 &gt; /tmp/mylog 2&gt;&amp;1 来查看 cron 输出
  • 我按照你说的修改了命令: wget --ftp-user=myUserName --ftp-password=myPassword ftp.myDomain.com/myBinaryFile.dta > /tmp/mylog.txt 2 >&1 有趣...在调用命令时创建的视觉输出中显示“正在解析 ftp.myDomain.com (ftp.myDomain.com)... 1.2.3.4 连接到 ftp.myDomain.com (ftp.myDomain.com )|1.2.3.4|:80... 已连接。”但在日志中显示:“正在解析 ftp.myDomain.com (ftp.myDomain.com)...失败:名称或服务未知。wget: 无法解析主机地址 'ftp.myDomain.com'”
  • 为什么说:80而不是:21?你确实添加了ftp://,对吧?

标签: linux shell ftp get cron


【解决方案1】:

您最好不要将ftp 用于任何事情,尤其是不要使用非交互式使用。 wget 可以通过 ftp 以稳健、灵活和可预测的方式下载文件:

wget --user="userName" --password="userPassword" \
    "ftp://ftp.myDomain.com/myBinaryFile.dta"

【讨论】:

    猜你喜欢
    • 2011-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-30
    • 2013-09-01
    • 2013-09-28
    • 2016-01-13
    • 2018-02-14
    相关资源
    最近更新 更多