Linux FTP Shell脚本不工作

Linux FTP Shell脚本不工作,linux,shell,ftp,ksh,Linux,Shell,Ftp,Ksh,我想使用FTP从服务器下载文件 这是我的脚本代码。(myscript.sh) shell显示此消息: 本地目录的用法 我的脚本代码有什么问题?尝试通过以下方式启动命令:/myscript.sh,而不是通过sh./myscript.sh:您正在使用shebang指定ksh。直接调用sh肯定会“绕过”shebang(它会,除非sh读取并启动ksh-这取决于您的sh实现),并且不会根据需要调用ksh 此外,如果您希望end,则不应以EOF结束。另一点是,您可能希望将所有参数($1,$2,等等)放在引号

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

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

shell显示此消息: 本地目录的用法


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

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

此外,如果您希望
end
,则不应以
EOF
结束。另一点是,您可能希望将所有参数(
$1
$2
,等等)放在引号之间,以便确保它们的值不被空格分隔(如
“$1”
“$2”
,等等)

但是,我怀疑这是导致错误消息的原因。关键是,我无法在本地复制您的错误,即使我复制/粘贴了您的脚本。然后,由于在本地FTP客户端(Debian)上有一个空的
lcd
参数输出当前本地目录,因此我无法判断是什么原因导致出现此错误消息

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

#!/bin/ksh
ftp -n $1 << END
user $2 $3
lcd $4
cd $(dirname $5)
get $(basename $5)
bye
END
我解决了这个问题

原因是,编码

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

我错过了“进入”的区别。

UNIX的输入是\n

但是,Windows enter是\r\n

因此,如果不编码脚本代码,则必须发生错误。

大多数windows editer都提供编码选项。(UNIX、DOS、WINDOWS风格。)

如果使用unix编辑器(ex,vi),则不需要进行编码

添加。

  • 如果未设置远程目录(cd)或本地目录(lcd), 源文件夹和目标文件夹是默认文件夹

  • 结束,EOF不影响脚本代码。你可以使用任何字符串

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


  • 仅供参考,您可以使用ncftpget在一条线上完成您正在尝试的操作。我想回答这个问题。我怀疑我能用ncFTP做到这一点。我想你可能想对这个问题本身留下一点评论?:)明天我会试试你的解决办法。(我无法在家中连接公司的FTP服务器。:)感谢您的回答。如果您必须使用
    sh myscript…
    来启动此脚本,您是否执行了
    chmod 755 myscript.sh
    ?这将使其直接可执行,并且您不需要使用
    sh…
    ,这可能会使您的问题复杂化,正如@7heo.tk在下面提到的那样。(看起来你的脚本应该可以工作,否则)。祝你好运。是的,我已经更改了权限。如果我没有更改权限,shell将显示“权限被拒绝”消息。谢谢你的评论,我将尝试@7heo.tk的解决方案。谢谢。你所谓的“回车”被调用。除此之外,“添加”中的第2点和第3点错误:
    EOF
    没有结束herdocument字符串,它被发送到ftp客户端。由于
    EOF
    不是已知的ftp命令,它是伪造的,因此被ftp客户端忽略。由于它也是最后一条指令,因此不会导致脚本出现“错误”(尝试在
    EOF
    之后回显一些内容,您将看到)。此外,要运行shell脚本,您可以使用
    /scriptname
    调用它。这就是使用shebang的全部意义。
    sh myscript.sh 111.222.333.444 testuser test /myfolder/src/data/ DATA20140419.txt
    
    #!/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