[英]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_proxy
和http_proxy
。
接下来,在将转储环境的 cron-job 中包含一行,例如env >/tmp/your.env
。
也许有一些区别......另外,您是否仔细检查了-n
开关的正确用法?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.