【问题标题】:FTP Shell Script does not workingFTP Shell 脚本不起作用
【发布时间】:2014-04-19 07:18:12
【问题描述】:

我想使用 FTP 从服务器下载文件。

这是我的脚本代码。 (myscript.sh)

#!/bin/ksh
ftp -n $1 << END
user $2 $3
lcd $4
get $5
bye
EOF

编写脚本并运行后,它不起作用。

sh myscript.sh 111.222.333.444 testuser test /myfolder/src/data/ DATA20140419.txt

shell 显示此消息: 使用 lcd 本地目录

我的脚本代码有什么问题?

【问题讨论】:

  • 如果您必须使用sh myscript... 来启动此脚本,您是否使用了chmod 755 myscript.sh ?这将使它直接可执行,并且您不需要使用sh ...,这可能会使您的问题复杂化,正如@7heo.tk 在下面提到的那样。 (看起来你的脚本应该可以工作,否则)。祝你好运。
  • 是的,我已经更改了权限。如果我没有更改权限,shell 会显示“权限被拒绝”消息。感谢您的评论,我会尝试@7heo.tk 的解决方案。谢谢。

标签: linux shell ftp ksh


【解决方案1】:

尝试通过./myscript.sh 而不是sh ./myscript.sh 启动命令:您正在使用指定ksh 的shebang。直接调用 sh 肯定会“绕过”shebang(它会,除非 sh 读取它并启动 ksh - 这取决于您的 sh 实现),并且不会按需要调用 ksh

另外,如果 here document 需要 END,则不应以 EOF 结尾。另一点是您可能希望将所有参数($1$2 等)放在引号之间,这样您就可以确定它们的值没有被空格分隔(如 "$1""$2"、等等)。

但是,我怀疑这是导致错误消息的原因。关键是,即使我复制/粘贴您的脚本,我也无法在本地复制您的错误。然后,我不知道是什么原因导致出现此错误消息,因为空的 lcd 参数确实会在我的本地 FTP 客户端 (Debian) 上输出当前本地目录。

我能给你的唯一答案是在get之前,你应该cd到正确的目录(get命令应该只包含文件的路径当前 em> 目录)。那么你的脚本应该是:

#!/bin/ksh
ftp -n $1 << END
user $2 $3
lcd $4
cd $(dirname $5)
get $(basename $5)
bye
END

你应该像这样使用它:

$ ./myscript <server> <user> <passwd> <localdir> <remotedir/file>

例子:

$ ./myscript 1.2.3.4 7heo secret . /path/to/remote/file

【讨论】:

  • 仅供参考,您可以使用 ncftpget 在一行上做您想做的事情。见ncftp.com/ncftp/doc/ncftpget.html
  • 我正在尝试回答这个问题。我怀疑我可以用 ncFTP 做到这一点。我想您可能想对问题本身发表评论? :)
  • 明天我会试试你的解决方案。 (我家无法连接我公司的 FTP 服务器。:( ) 感谢您的回答。
【解决方案2】:

我解决了这个问题。

原因是,编码。

我使用windows编写脚本代码,在unix中运行。

我错过了“ENTER”的区别。

UNIX 的输入是 \n

但是,Windows 输入是\r\n

所以,不编码脚本代码,一定会出错。

大多数 Windows 编辑器都提供编码选项。 (UNIX、DOS、WINDOWS 风格。)

如果您使用 unix 编辑器(例如,vi),则不需要编码。

加法。

  1. 如果你没有设置远程目录(cd)或本地目录(lcd), 源和目标是默认文件夹。

  2. END,EOF 不影响脚本代码。你可以使用任何字符串。

  3. 要运行 shell 脚本,您必须使用“sh”关键字。 "./" 无法运行 shell 脚本。

【讨论】:

  • 你所说的“ENTER”被称为newline。除此之外,您的“添加”中的第 2 点和第 3 点是错误的:EOFNOT 结束 heredocument 字符串,它被发送到 ftp 客户端。由于EOF 不是已知的ftp 命令,它是伪造的,因此被您的ftp 客户端忽略。由于它也是最后一条指令,因此它不会导致脚本“出错”(尝试在您的 EOF 之后回显某些内容,您会看到)。此外,要运行 shell 脚本,您可以使用 ./scriptname 调用它。这就是使用 shebang 的全部意义所在。