Expect script to automate FTP upload is sending corrupted file to server
If your file takes longer than 10 seconds to upload, you are hitting expect's default timeout: while expecting to see the "ftp>" prompt after sending the "put" command, after (default) 10 seconds, expect gives up times out
and continues on with the next command (send bye).
Try this:
set timeout -1
send "put local_file.t.Z remote_file.t.Z"
Also, after you "send bye" you should wait for the connection to end:
send "bye\r"
expect eof
How to script FTP upload and download
It's a reasonable idea to want to script an FTP session the way the original poster imagined, and that is the kind of thing Expect would help with. Batch files on Windows cannot do this.
But rather than doing cURL or Expect, you may find it easier to script the FTP interaction with PowerShell. It's a different model, in that you are not directly scripting the text to send to the FTP server. Instead you will use PowerShell to manipulate objects that generate the FTP dialogue for you.
Upload:
$File = "D:\Dev\somefilename.zip"
$ftp = "ftp://username:password@example.com/pub/incoming/somefilename.zip"
"ftp url: $ftp"
$webclient = New-Object System.Net.WebClient
$uri = New-Object System.Uri($ftp)
"Uploading $File..."
$webclient.UploadFile($uri, $File)
Download:
$File = "c:\store\somefilename.zip"
$ftp = "ftp://username:password@example.com/pub/outbound/somefilename.zip"
"ftp url: $ftp"
$webclient = New-Object System.Net.WebClient
$uri = New-Object System.Uri($ftp)
"Downloading $File..."
$webclient.DownloadFile($uri, $File)
You need PowerShell to do this. If you are not aware, PowerShell is a shell like cmd.exe which runs your .bat files. But PowerShell runs .ps1 files, and is quite a bit more powerful. PowerShell is a free add-on to Windows and will be built-in to future versions of Windows. Get it here.
Source: http://poshcode.org/1134
pipe stderr to syslog inside automated ftp script
This works without using a temp file for the error output. The 2>&1
sends the error output to where standard output is going — which is the pipe. The >>
changes where standard output is going — which is now the file — without changing where standard error is going. So, the errors go to logger
and the output to ftp.log
.
ftp -nv $FTPHOST <<END_FTP 2>&1 >> ftp.log | logger
user $FTP_USER $FTP_PASS
binary
mkdir $REMOTE_DIR
cd $REMOTE_DIR
lcd $LOCAL
put $FILE
bye
END_FTP
It is possible to insert for loop in ftp script?
You cannot use bash
loop inside ftp
prompt. But you can generate the stdin
for ftp
via a bash loop.
{
echo username passwd
echo bin
echo prompt
for DATA in d f g l m n o p q; do
echo mkdir /directory/$DATA
echo cd /directory/$DATA
echo mput *.$DATA
done
echo hash
echo bye
} | ftp -n ftp.server.com
Check for ftp authentication output for bash script
If it's possible for you to install additional programs onto the system of interest i encourage you to take a look at lftp
.
With lftp
it is possible to set paramters like the time between reconnects etc. manually.
To achieve your aim with lftp
you have to invoke the following
lftp -u user,password ${FTP_SERVER} <<END
set ftp:retry-530 "Authentication failed"
set net:reconnect-interval-base 60
set net:reconnect-interval-multiplier 10
set net:max-retries 10
<some more custom commands>
END
If the pattern after ftp:retry-530
matches the 530 reply of the server lftp
tries to reconnect every 60*10 seconds.
Related Topics
In Bash, Why 'X=100 Echo $X' Doesn't Print Anything
Tiny "Manually" Created Elf Giving Segmentation Fault
How to Force Cp to Overwrite Without Confirmation
How to Map a Hostname *And* a Port with /Etc/Hosts
Get First Line of a Shell Command's Output
Specify the from User When Sending Email Using the Mail Command
How to Use Linux 'Perf' Tool to Generate "Off-Cpu" Profile
Command to Get Time in Milliseconds
Git Diff with Line Numbers and Proper Code Alignment/Indentation
Squid: How to Disable Authentication
Deleting String Up to the First Occurrence of Certain Character
Is There a Command to List All Unix Group Names
Linux Command to Translate Domain Name to Ip