【问题标题】:store ftp command output in a variable将 ftp 命令输出存储在变量中
【发布时间】:2014-11-21 13:09:36
【问题描述】:

我正在使用 bash 脚本连接到 FTP 服务器以删除文件。 我想将在 FTP 服务器上执行的delete 命令的输出消息和代码存储到我的脚本变量中。

我该怎么做?

这是我的 sn-p:

...
function delete_on_ftp{
  ftp -i -n $ftp_host $ftp_port <<EOF
quote USER $ftp_login
quote PASS $ftp_pass
delete $1
quit
EOF
}
output_cmd=$(delete_on_ftp $myfile)
...

按照我上面的方式,我只得到消息,没有办法得到返回的代码。是否有另一种方法允许在 1 个或 2 个变量中获取代码和消息?

谢谢,干杯

【问题讨论】:

  • 运行脚本和手动执行 FTP 时得到的输出是什么?你在寻找类似250 Delete operation successful. 的东西吗?
  • 是的,如果操作成功,echo "$output_cmd" | grep '250 DELE command successful' 应该返回 0(即错误级别)。

标签: bash ftp


【解决方案1】:

我刚刚测试了以下 curl 命令,它可以让您轻松完成任务。

curl --ftp-ssl -vX "DELE oldfile.pdf" ftp://$user:$pass@$server/public_html/downloads/

请不要忘记目录末尾的斜线,这是必要的。

curl: (19) RETR response: 550

550 oldfile.pdf:没有这样的文件或目录

curl: (19) RETR response: 250

250 DELE 命令成功

curl 可在http://curl.haxx.se/ 获得。

【讨论】:

    【解决方案2】:

    让 FTP 自动运行的方法之一是使用 Netrc 文件。默认情况下,FTP 将使用$HOME/.netrc,但您可以通过-N 参数覆盖它。 netrc 文件的格式相当简单。一行是 Macrodef 或包含登录信息的行。下面是一个例子:

    Netrc 文件

    mysystem login renard password swordfish
    another login renard password 123456
    default login renard password foofighter
    
    macdef init
    binary
    cd foo
    get bar
    delete bar
    quit
    
    macdef fubar
    ...
    

    前三行是各种系统的登录名。 default 是您未定义特定登录名的任何系统的登录名。以marcodef 开头的行是您为执行一系列步骤而定义的宏。 init 宏在登录后立即自动运行。如果最后一行是quit,它将为您退出 FTP。应该有一个空行来结束宏,(尽管大多数系统也会以文件结尾作为宏定义的结尾)。

    您可以即时创建一个 Netrc 文件,在其中输入您的 FTP 命令,然后使用该 Netrc 文件运行您的 FTP 命令:

    cat > $netrc_file <<<EOF
    $ftp_host login $ftp_login password $ftp_password
    macdef init
    delete $my_file
    quit
    EOF
    
    ftp -N $netrc_file
    

    您可以通过 STDOUT 或在变量中捕获输出,然后根据需要对其进行解析:

    ftp -N $netrc_file | tee $ftp_output
    

    【讨论】:

      【解决方案3】:

      关于这个问题的其他答案应该能提供你想要的。

      但是,如果您热衷于专门使用ftp 命令,您可以使用expect 命令来实现相同的...
      请注意,这不是实现您正在尝试的最佳方式。

      expect -c "log_user 0;
                 spawn ftp -i -n $ftp_host $ftp_port;
                 expect \"<add ftp login username: prompt details here>\"
                 send \"quote USER $ftp_login\r\n\"
                 expect \"<add ftp login password: prompt details here>\"
                 send \"quote PASS $ftp_pass\r\n\"
                 expect \"<add ftp shell prompt details here>\"
                 log_user 1; send \"delete $1\r\n\"
                 log_user 0;
                 expect \"<add ftp shell prompt details here>\"
                 send \"quit\r\n\";
                 interact"
      

      对于 ftp 命令返回的登录和 shell 提示,您可能需要在上面添加更多行。

      【讨论】:

        猜你喜欢
        • 2015-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-20
        • 1970-01-01
        • 2022-08-10
        • 2012-04-03
        • 1970-01-01
        相关资源
        最近更新 更多