繁体   English   中英

shell 脚本中的 FTP 不起作用

[英]FTP inside a shell script not working

我的主机升级了我的 FreeBSD 版本,现在我的一个脚本坏了。 该脚本只是将数据馈送上传到谷歌以获取他们的商家服务。

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

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 在不同的用户下执行的。

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

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

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

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

请注意,上面的代码很容易被破坏,例如,在有问题的变量中使用空格。 此外,这种方法实际上使您无法可靠地检测和处理故障。

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

一些想法:

只是一个想法,因为这是在应该从父级正确继承的子shell中执行的,所以从脚本内执行的环境与从env执行时有什么不同吗?

你使用正确的“shebang”吗?

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

你能ping通主机吗?

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

您能否检查一下您的 shell 登录和 cron 作业之间的环境是否存在差异? 从您的登录名中运行env ,并注意ftp_proxyhttp_proxy

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

也许有一些区别......另外,您是否仔细检查了-n开关的正确用法?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM