tait@versatc.UUCP (Tait Kirkham) (08/25/88)
Does anyone out there know if it is possible to run ftp in a "batch" mode?
Specifically, I wish to be able to connect to a remote system and execute
FTP commands from a batch file, rather than having to log in and type the
commands in at the terminal.
Does anyone know if this is possible? Currently I am running on a 286 PC,
DOS, and Excelan software.
I would appreciate any information you may have to offer.
Thanks in advance
Tait Kirkham
--
{pyramid,uunet}!versatc!tait Tait Kirkham
Versatec, 2805 Bowers Avenue, Santa Clara, Ca. 95051 (408)988-2800x5070nancy@ftp.COM (Nancy Connor) (08/26/88)
You can execute FTP commands from a batch file on some systems. I don't know if Excelan's version of TCP/IP on the PC does this, but some do. In particular, FTP Software's PC/TCP product does this via "take files". Our FTP client will allow you to specify your login name, password and the name of a file on the command line and will then execute commands from the batch file you've specified. If you want more information on PC/TCP, send me mail, but I can't help with Excelan's product. -Nancy Connor FTP Software ...!harvard!ftp!nancy nancy@ftp.com
sung@june.cs.washington.edu (Sung Kwon Chung) (08/28/88)
Here are two quick solutions to do batch-mode ftp. They are written in
shell script, that means they are of no use for some of you who don't have
the shell, sorry.
The first one (ftp1.sh) is for simple ftp'ing. It works fine for small number
of files. The limit depends on the command buffer size of `mget' and some
other factors unknow to me :-) Is is used like,
% ftp1.sh host pub a b c d e f g
to get file a, b, ..., g on host:pub.
The second one (doftp) is a bit more complicated, but versatile (and
extensible if you want). doftp uses other two shell scripts (ftp.sh and
waitfor). It requires a file which contains the names of the files to be
ftp'ed. Each line in the file contains one file name. If `files.list'
contains wanted file names on host:pub,
% doftp host pub files.list
will transfer all of them (of course, if everything goes right).
I used it to bring over 70 odd (irregularly selected) files from
an archive site.
To use them, extract the scripts to their names and do "chmod +x" them.
Please see the notes at the end of this message before trying them.
========================= ftp1.sh =========================
#!/bin/sh
#
# simple ftp
# Usage: ftp1.sh host direcrory file1 file2 file3 .....
#
host=$1; directory=$2; shift; shift;
ftp -n -i $host << ___EOF___
user anonymous guest
cd $directory
mget $*
bye
___EOF___
exit $?
------------------------------------------------------------
The following three files are for the `doftp'.
========================= doftp =========================
#!/bin/sh
# Usage: doftp host directory namelistfile
# needs ftp.sh and waitfor
# Set up the pipes and temp files, and invoke ftp and its command feeder
# ftp-out$$ : conversation during the job, feed-back to ftp.sh
# ftp-log$$ : just for logging the commands
# sung@cs.washinton.edu, 8/22/88
if test "$#" != "3"
then
echo "doftp host directory namelistfile" 1>&2
exit 1
fi
oldmask=`umask` #
umask 077 # if we need to make the conversation unreadable
cat >ftp-out$$ </dev/null
cat >ftp-log$$ </dev/null
umask $oldmask
( ftp.sh $2 $3 <ftp-out$$) |
tee ftp-log$$ |
( ftp -v -n $1 >ftp-out$$ 2>&1 )
------------------------------------------------------------
========================= ftp.sh =========================
#!/bin/sh
# ftp.sh: ftp command feeder
#
# Uage: (sleep 1; ftp.sh dir namelistfile <ftp-out) |
# (ftp -v -n host-name >ftp-out)
# See `doftp' and `waitfor'
# sung@cs.washington.edu, 8/22/88
if test "$#" != "2"
then
echo " Uage: (sleep 1; ftp.sh dir namelistfile <ftp-out) | (ftp -v -n host-name >ftp-out)" 1>&2
exit 2
fi
echo "user anonymous guest" # login
result=`waitfor "230"` # okay?
if test "$result" = "ERROR"
then exit 1
fi
echo "cd $1"
result=`waitfor "250"` # 250 CWD successful
if test "$result" = "ERROR"
then exit 1
fi
# other FTP commands here, if needed
for f in `cat $2` # main loop
do
destName=$f # file name change may be used here. a:b.c --> a-b.c
if test ! -f $destName # get it, only when it is not there
then
echo "get $f $destName"
result=`waitfor "226"` # 226 Transfer complete
case "$result" in
"OK") echo "got $f" 1>&2 ;;
"ERROR") echo "failed getting $f, abort the job" 1>&2;
exit 1;;
# other cases may need to be considered here
esac
fi
done
exit 0
------------------------------------------------------------
========================= waitfor ==========================
#!/bin/sh
# Usage: result=`waitfor string`
# wait for given string from std input while monitoring error messages
# Usually, `string' is an expected message number (e.g., 250). It
# detects 5xx error messages.
# sung@cs.washington.edu, 8/22/88
while true
do
read aLine
if test "$aLine" != ""
then
case "$aLine" in
"$1"*) echo "OK"; exit 0 ;;
*'timed out'*) echo "ERROR"; exit 1 ;; # timeed out message
5*) echo "ERROR"; exit 1 ;; # 5XX error msg
*) ;
esac
else
sleep 3
fi
done
------------------------------------------------------------
The scripts are for anonymous login. For non-anonymous login, you can
change the `user' command line. (Be sure to set proper file protection
in this case.) Or you can use .netrc file and auto-login feature. In this
case, '-n' option is in `doftp' should be removed.
There is much room for improvement especially for error message handling,
and retrial in the case of partial fairlure. So please feel free to
make further extensions or modifications as needed.
Hope this helps some of you.
Sung K. Chung | sung@cs.washington.edu
Dept. of Computer Science, FR-35 | {decvax,ucbvax}!uw-beaver!uw-june!sung
University of Washington |
Seattle, WA 98195 |schacht@tgate.UUCP (Bryan Schacht) (09/01/88)
The Excelan FTP package already comes with a batch file that will keep executing FTP after each session. Just type ftpserv to use this batch file. On my system, it is located in the c:\xln\bin directory. Bryan Schacht TransGate hplabs!felix!tgate!bryan