shell脚本中的FTP无法正常工作

时间:2011-05-24 20:42:14

标签: bash shell ftp freebsd

我的主机升级了我的FreeBSD版本,现在我的一个脚本坏了。该脚本只需将数据Feed上传到谷歌的商家服务。

脚本(在升级之前工作):

ftp ftp://myusername:mypassword@uploads.google.com/<<END_SCRIPT
ascii
put /usr/www/users/myname/feeds/mymerchantfile.txt mymerchantfile.txt
exit
END_SCRIPT

现在脚本说“未知主机”。相同的脚本适用于OSX。

我尝试删除“ftp://”。 - 没有效果 如果我手动输入用户名和密码,我可以从命令行登录。

我一直在寻找其他解决方案,并尝试了以下方法:

HOST='uploads.google.com'
USER='myusername'
PASSWD='mypassword'
ftp -dni <<END_SCRIPT
open $HOST
quote USER $USER
quote PASS $PASS
ascii
put /usr/www/users/myname/feeds/mymerchantfile.txt mymerchantfile.txt
END_SCRIPT

HOST='uploads.google.com'
USER='myusername'
PASSWD='mypassword'
ftp -dni <<END_SCRIPT
open $HOST
user $USER $PASS
ascii
put /usr/www/users/myname/feeds/mymerchantfile.txt mymerchantfile.txt
END_SCRIPT

我在网上找不到任何东西似乎都在做伎俩。有没有人有任何其他想法?我不想使用.netrc文件,因为它是由cron在不同的用户下执行的。

5 个答案:

答案 0 :(得分:1)

ftp(1)表明有一个简单的-u命令行开关来上传文件;由于ascii是默认值( shudder ),您可以用一个命令行替换整个脚本:

ftp -u ftp://username:password@uploads.google.com/mymerchantfile.txt\
/usr/www/users/myname/feeds/mymerchantfile.txt

(用\\n包裹的长行,随意删除反斜杠并将其全部放在一行上。)

答案 1 :(得分:0)

ftp $HOSTNAME <<EOFEOF
$USER
$PASS
ascii
put $LOCALFILE $REMOTETEMPFILE
rename $REMOTETEMPFILE $REMOTEFINALFILE
EOFEOF

请注意,上述代码可以通过例如在相关变量中使用空格来轻松破解。此外,这种方法几乎无法可靠地检测和处理故障。

如果你还没有,请查看expect工具。你可能会发现它解决了你不知道的问题。

答案 2 :(得分:0)

一些想法:

只是一个想法,因为这是在子shell中执行的,它应该从父级正确继承,env在脚本中执行时是否显示与shell相比有什么不同?

你使用正确的“shebang”吗?

任何需要身份验证的代理?

你可以ping主机吗?

答案 3 :(得分:0)

在BSD中,您可以创建一个ftp可用于登录的NETRC脚本。您甚至可以使用NETRC参数在ftp命令中指定-N文件。否则,使用默认NETRC$HOME/.netrc)。

答案 4 :(得分:0)

您可以检查shell-login和cron-job之间的环境是否存在差异?在您的登录信息中,运行env,并留意ftp_proxyhttp_proxy

接下来,在cron-job中包含一条将转储环境的行,例如: env >/tmp/your.env

也许存在一些差异......另外,您是否仔细检查了-n开关的正确用法?