如何用batch fileftp?
我想要一个batch fileftp到服务器,读出一个文本文件,并断开连接。 服务器需要用户和密码。 我试过了
@echo off pause @ftp example.com username password pause
但从未login过。 我怎样才能使这个工作?
由0x90h的答案帮了很多…
我把这个文件保存为u.ftp:
open 10.155.8.215 user password lcd /D "G:\Subfolder\" cd folder/ binary mget file.csv disconnect quit
然后我运行这个命令:
ftp -i -s:u.ftp
它的工作!
非常感谢:)
使用Windows FTP客户端,您将希望使用-s:filename
选项来指定FTP客户端运行的脚本。 该文件特别指出,你不应该尝试用<
字符input到FTP客户端。
脚本的执行将立即开始,所以它可以用于用户名/密码。
但是,这个设置的安全性是有问题的,因为你现在有一个FTP服务器的用户名和密码,任何决定查看你的batch file的人都可以看到。
无论哪种方式,您都可以从batch file中随时生成脚本文件,然后将其传递到FTP客户端,如下所示:
@echo off REM Generate the script. Will overwrite any existing temp.txt echo open servername> temp.txt echo username>> temp.txt echo password>> temp.txt echo get %1>> temp.txt echo quit>> temp.txt REM Launch FTP and pass it the script ftp -s:temp.txt REM Clean up. del temp.txt
将服务器名称 , 用户名和密码replace为您的详细信息,batch file将以temp.txt生成脚本,然后使用脚本启动ftp,然后删除脚本。
如果您总是获取相同的文件,则可以用文件名replace%1
。 如果不是,则只需启动batch file并提供文件的名称以作为参数。
这是一个老post,但是,一个替代scheme是使用命令选项:
ftp -n -s:ftpcmd.txt
-n将禁止初始login,然后文件内容将是:(用您的FTP站点urlreplace127.0.0.1)
open 127.0.0.1 user myFTPuser myftppassword other commands here...
这避免了用户/密码分开的行
您需要将ftp命令写入文本文件,并将其作为ftp命令的参数,如下所示:
ftp -s:filename
更多信息在这里: http : //www.nsftools.com/tips/MSFTP.htm
我不知道,如果它会用户名和密码提示。
batch file的每一行都会被执行; 但是只有在上一行完成之后。 在你的情况下,一旦命中ftp行,ftp程序将启动并接pipe用户input。 当它closures时,剩下的线路将被执行。 这意味着用户名/密码永远不会被发送到FTP程序,而是一旦closures了ftp程序,就会被送到命令提示符本身。
相反,您需要在ftp命令行上传递所需的所有内容。 就像是:
@echo off echo user MyUserName> ftpcmd.dat echo MyPassword>> ftpcmd.dat echo bin>> ftpcmd.dat echo put %1>> ftpcmd.dat echo quit>> ftpcmd.dat ftp -n -s:ftpcmd.dat SERVERNAME.COM del ftpcmd.dat
使用
ftp -s:FileName
如Windows XP Professional产品文档中所述 。
您必须指定的文件名代替FileName必须包含要发送到服务器的FTP命令。 其中的命令是
- 打开Computer [Port]连接到FTP服务器,
- 用户的用户名[密码] [帐户]与FTP服务器进行authentication,
- 获取RemoteFile [LocalFile]来检索一个文件,
- 退出结束FTP会话并终止ftp程序。
更多命令可以在Ftp子命令下find。
这是我使用的。 在我的情况下,某些ftp服务器(pure-ftpd for one)将始终提示input用户名,即使使用-i参数,并将“user username”命令作为交互式密码。 我所做的是在ftp服务器超时之前input一些NOOP(无操作)命令,然后login:
open ftp.example.com noop noop noop noop noop noop noop noop user username password ... quit
你也可以使用PowerShell; 这是我做的。 由于我需要下载一个基于模式的文件,我dynamic地创build了一个命令文件,然后让ftp
完成其余的工作。
我使用了基本的PowerShell命令。 我不需要下载任何额外的组件。 我首先检查是否存在必要数量的文件。 如果他们用Mget第二次调用FTP。 我从连接到Windows XP远程服务器的Windows Server 2008中运行此操作。
function make_ftp_command_file($p_file_pattern,$mget_flag) { # This function dynamically prepares the FTP file. # The file needs to be prepared daily because the # pattern changes daily. # PowerShell default encoding is Unicode. # Unicode command files are not compatible with FTP so # we need to make sure we create an ASCII file. write-output "USER" | out-file -filepath C:\fc.txt -encoding ASCII write-output "ftpusername" | out-file -filepath C:\fc.txt -encoding ASCII -Append write-output "password" | out-file -filepath C:\fc.txt -encoding ASCII -Append write-output "ASCII" | out-file -filepath C:\fc.txt -encoding ASCII -Append If ($mget_flag -eq "Y") { write-output "prompt" | out-file -filepath C:\fc.txt -encoding ASCII -Append write-output "mget $p_file_pattern" | out-file -filepath C:\fc.txt -encoding ASCII -Append } else { write-output "ls $p_file_pattern" | out-file -filepath C:\fc.txt -encoding ASCII -Append } write-output quit | out-file -filepath C:\fc.txt -encoding ASCII -Append } ########################### Init Section ############################### $yesterday = (get-date).AddDays(-1) $yesterday_fmt = date $yesterday -format "yyyyMMdd" $file_pattern = "BRAE_GE_*" + $yesterday_fmt + "*.csv" $file_log = $yesterday_fmt + ".log" echo $file_pattern echo $file_log ############################## Main Section ############################ # Change location to folder where the files need to be downloaded cd c:\remotefiles # Dynamically create the FTP Command to get a list of files from # the remote servers echo "Call function that creates a FTP Command " make_ftp_command_file $file_pattern N #echo "Connect to remote site via FTP" # Connect to Remote Server and get file listing ftp -n -v -s:C:\Clover\scripts\fc.txt 10.129.120.31 > C:\logs\$file_log $matches=select-string -pattern "BRAE_GE_[AZ][AZ]*" C:\logs\$file_log # Check if the required number of Files available for download if ($matches.count -eq 36) { # Create the FTP command file # This time the command file has an mget rather than an ls make_ftp_command_file $file_pattern Y # Change directory if not done so cd c:\remotefiles # Invoke ftp with newly created command file ftp -n -v -s:C:\Clover\scripts\fc.txt 10.129.120.31 > C:\logs\$file_log } else { echo "The full set of files is not available" }
我写了一个脚本作为* .sh文件
#!/bin/sh set -x FTPHOST='host-address' FTPUSER='ftp-username' FTPPASSWD='yourPass' ftp -n -v $FTPHOST << EOT ascii user $FTPUSER $FTPPASSWD prompt ##Your commands bye EOT
为我工作得很好