Cómo ftp con un archivo por lotes?

Quiero un archivo por lotes para ftp a un servidor, leer un archivo de texto y desconectarme. El servidor requiere un usuario y una contraseña. Lo intenté

@echo off pause @ftp example.com username password pause 

pero nunca se conectó. ¿Cómo puedo hacer que esto funcione?

La respuesta por 0x90h ayudó mucho …

Guardé este archivo como u.ftp:

 open 10.155.8.215 user password lcd /D "G:\Subfolder\" cd folder/ binary mget file.csv disconnect quit 

Luego ejecuté este comando:

 ftp -i -s:u.ftp 

¡¡¡Y funcionó!!!

Muchas gracias hombre 🙂

Con el cliente FTP de Windows, querrá usar la opción -s:filename para especificar un script para que se ejecute el cliente FTP. La documentación señala específicamente que no debe tratar de canalizar la entrada en el cliente FTP con un < carácter.

La ejecución de la secuencia de comandos se iniciará de inmediato, por lo que funciona para nombre de usuario / contraseña.

Sin embargo, la seguridad de esta configuración es cuestionable ya que ahora tiene un nombre de usuario y contraseña para el servidor FTP visible para cualquier persona que decida mirar su archivo por lotes.

De cualquier forma, puede generar el archivo de script sobre la marcha desde el archivo de proceso por lotes y luego pasarlo al cliente de FTP de esta manera:

 @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 

Reemplace nombre de servidor , nombre de usuario y contraseña con sus detalles y el archivo por lotes generará la secuencia de comandos como temp.txt ejecutar ftp con la secuencia de comandos y luego eliminar la secuencia de comandos.

Si siempre obtiene el mismo archivo, puede reemplazar el %1 con el nombre del archivo. Si no, acaba de iniciar el archivo por lotes y proporcionar el nombre del archivo para obtener como argumento.

Sin embargo, esta es una publicación anterior, una alternativa es usar las opciones de comando:

 ftp -n -s:ftpcmd.txt 

el -n suprimirá el inicio de sesión inicial y luego el contenido del archivo será: (reemplace el 127.0.0.1 con la URL de su sitio FTP)

 open 127.0.0.1 user myFTPuser myftppassword other commands here... 

Esto evita el usuario / contraseña en líneas separadas

Debe escribir los comandos ftp en un archivo de texto y asignarlo como un parámetro para el comando ftp de la siguiente manera:

 ftp -s:filename 

Más información aquí: http://www.nsftools.com/tips/MSFTP.htm

Aunque no estoy seguro de si funcionaría con la solicitud de nombre de usuario y contraseña.

Cada línea de un archivo por lotes se ejecutará; pero solo después de que la línea anterior se haya completado. En su caso, tan pronto como llegue a la línea de ftp, el progtwig ftp se iniciará y se hará cargo de la entrada del usuario. Cuando está cerrado, las líneas restantes se ejecutarán. Lo que significa que el nombre de usuario / contraseña nunca se envían al progtwig FTP y, en su lugar, se enviarán a la línea de comandos una vez que se cierre el progtwig ftp.

En su lugar, debe pasar todo lo que necesita en la línea de comando ftp. Algo como:

 @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 

Utilizar

 ftp -s:FileName 

como se describe en la documentación del producto Windows XP Professional .

El nombre de archivo que debe especificar en lugar de FileName debe contener los comandos FTP que desea enviar al servidor. Entre estos comandos están

  • abra Computer [Port] para conectarse a un servidor FTP,
  • usuario Nombre de usuario [Contraseña] [Cuenta] para autenticarse con el servidor FTP,
  • obtener RemoteFile [LocalFile] para recuperar un archivo,
  • salir para finalizar la sesión FTP y finalizar el progtwig ftp.

Se pueden encontrar más comandos bajo los subcomandos Ftp .

Esto es lo que uso. En mi caso, ciertos servidores ftp (pure-ftpd para uno) siempre solicitarán el nombre de usuario incluso con el parámetro -i, y tomarán el comando “user username” como la contraseña interactiva. Lo que hago ingresa unos pocos comandos de NOOP (sin operación) hasta que el servidor ftp agote el tiempo de espera y luego inicie sesión:

 open ftp.example.com noop noop noop noop noop noop noop noop user username password ... quit 

También puede usar PowerShell; Esto es lo que hice. Como necesitaba descargar un archivo basado en un patrón, dinámicamente creé un archivo de comando y luego deje que ftp hiciera el rest.

Utilicé comandos básicos de PowerShell. No necesité descargar ningún componente adicional. Primero verifiqué si el número requerido de archivos existía. Si ellos invocaron el FTP la segunda vez con un Mget. Lo ejecuto desde un servidor de Windows 2008 que se conecta a un servidor remoto de Windows XP.

 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" } 

He escrito una secuencia de comandos como archivo * .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 

Funciona bien para mí