【问题标题】:FTP inside a shell script not workingshell脚本中的FTP不起作用
【发布时间】:2011-09-01 06:39:09
【问题描述】:

我的主机升级了我的 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 在不同的用户下执行的。

【问题讨论】:

  • 你的主机能解析uploads.google.com吗?尝试ping uploads.google.comhost uploads.google.comtelnet uploads.google.com ftp 尝试连接到他们的服务器。
  • 是的,如果我手动登录,我可以登录服务器:ftp uploads.google.com 并在命令提示符处输入用户名和密码。
  • 优秀的帖子,感谢您的格式。很容易理解你的问题。也就是说,我无法访问 FreeBSD 系统。在这里查看我的 ftp 回复,您可能会发现一些想法。祝你好运! *.com/questions/6054642/…

标签: bash shell ftp freebsd


【解决方案1】:
ftp $HOSTNAME <<EOFEOF
$USER
$PASS
ascii
put $LOCALFILE $REMOTETEMPFILE
rename $REMOTETEMPFILE $REMOTEFINALFILE
EOFEOF

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

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

【讨论】:

  • 这不起作用。它正在尝试使用本地服务器上的用户名登录 FTP 服务器。它似乎试图在传递用户和传递变量之前进行登录。
  • 在这种情况下更改为 $USERNAME。 (我在这里假设您将在 ftp 命令之前输入这些值或以其他方式定义它们。)
【解决方案2】:

一些想法:

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

你使用正确的“shebang”吗?

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

你能ping通主机吗?

【讨论】:

  • 我可以手动登录网站,所以应该不是 ping 问题。我在测试时以自己的用户身份执行脚本,所以我认为这也不是问题。
  • @user77413 不过,从脚本中尝试一下!你可能会感到惊讶...
【解决方案3】:

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

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

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

【讨论】:

  • 服务器在第一行显示未知主机失败。它不喜欢包含用户名和密码的初始 ftp 命令的语法。
  • @user77413,人力资源部。 which ftp 报告什么?也许ftp 中的第一个可执行文件PATH 与FreeBSD 提供的ftp(1) 不匹配?
  • 您忘记了示例中的 -u 吗?
  • @Pianosaurus,是的,是的,我做到了。谢谢。 (喜欢这个名字。:)
【解决方案4】:

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

【讨论】:

    【解决方案5】:

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

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

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

    【讨论】:

      最近更新 更多