renard
renard

Reputation: 1468

store ftp command output in a variable

I am using bash a script to connect to an FTP server for deleting a file. I would like to store the output message and code of the delete command executed on the FTP server into a variable of my script.

How could I do this ?

Here is my snippet :

...
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)
...

By the way I do above I only get the message, no way to get the returned code. Is there another way allowing to get the code and the message, in 1 or 2 variables ?

Thanks, Cheers

Upvotes: 1

Views: 2252

Answers (3)

anishsane
anishsane

Reputation: 20980

Other answers on this question should provide you what you want.

However, if you are keen on specifically using ftp command, you can use expect command for the same...
Note, that this is not the best way to achieve what you are trying.

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"

You may need to add some more lines in the above for the login & shell prompts returned by the ftp command.

Upvotes: 2

lx42.de
lx42.de

Reputation: 428

I just tested the following curl command, which make your task easy.

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

Please do not forget the slash at the end of your directory, it is necessary.

curl: (19) RETR response: 550

550 oldfile.pdf: No such file or directory

curl: (19) RETR response: 250

250 DELE command successful

curl is available at http://curl.haxx.se/.

Upvotes: 3

David W.
David W.

Reputation: 107040

One of the ways to get FTP to act automatically is to use a Netrc file. By default, FTP will use $HOME/.netrc, but you can override that via the -N parameter. The format of a netrc file is fairly straight forward. A line is either a Macrodef or a line that contains login information. Here's an example below:

Netrc File

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
...

The three first lines are the logins for various systems. The default is a login for any system which you don't define a particular login for. The lines that start with marcodef are macros you define to do a series of steps for you. The init macro automatically runs right after login. If the last line is quit, it will quit out of FTP for you. There should be a blank line to end the macro, (although most systems will take an End of the File as the end of the macrodef too).

You can create a Netrc file on the fly, enter your FTP command in that, and then, run your FTP command with that Netrc file:

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

ftp -N $netrc_file

You can capture the output via STDOUT, or in a variable and then parse that for what you need:

ftp -N $netrc_file | tee $ftp_output

Upvotes: 2

Related Questions