将ftp命令输出存储在变量中

时间:2014-11-21 13:09:37

标签: bash ftp

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

我怎么能这样做?

这是我的代码:

...
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个变量中获取代码和消息?

谢谢,干杯

3 个答案:

答案 0 :(得分:3)

我刚刚测试了以下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命令成功

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

答案 1 :(得分:2)

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

但是,如果您热衷于专门使用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"

您可能需要在上面添加更多行以进行登录&amp; ftp命令返回的shell提示符。

答案 2 :(得分:1)

让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。应该有一个空行来结束宏,(尽管大多数系统也将文件的结尾作为macrodef的结尾)。

您可以动态创建 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