windows - example - upload file ftp automatically
Cómo ftp con un archivo por lotes? (9)
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?
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 programa 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 programa FTP y, en su lugar, se enviarán a la línea de comandos una vez que se cierre el programa 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
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.
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.
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
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í
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 :)
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
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 resto.
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_[A-Z][A-Z]*" 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"
}
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 programa ftp.
Se pueden encontrar más comandos bajo los subcomandos Ftp .