Como ftp com um arquivo em lote?

quero um ficheiro em lote para ftp num servidor, ler um ficheiro de texto e desligar. O servidor necessita de um usuário e senha. Eu tentei.

@echo off
pause
@ftp example.com
username
password
pause
Mas nunca se ligou. Como posso fazer isto funcionar?

Author: Oswald, 2013-04-23

9 answers

A resposta de 0x90h ajudou muito...

Gravei este ficheiro como ftp:

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

Depois executei este comando:

ftp -i -s:u.ftp
E funcionou!!! Muito obrigado.
 49
Author: Outlier, 2017-05-23 12:02:39

Se usar o cliente de FTP do Windows, irá querer usar a opção -s:filename para indicar um programa para o cliente de FTP executar. A documentação indica especificamente que não deve tentar encaminhar a entrada para o cliente FTP com um carácter <.

A execução do script começará imediatamente, por isso funciona para o utilizador/Senha.

No entanto, a segurança desta configuração é questionável, uma vez que você agora tem um nome de utilizador e senha para o servidor FTP visível para qualquer um que decide olhar para o seu arquivo de lote.

De qualquer forma, você pode gerar o ficheiro de script na altura a partir do ficheiro em lote e depois passá - lo para o cliente FTP assim:

@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

Substituir servername, utilizador , e senha com os seus detalhes e o ficheiro em lote irá gerar o programa como temp.txt lançar ftp com o script e, em seguida, excluir o script.

Se estiver sempre a obter o mesmo ficheiro, poderá substituir o %1 pelo nome do ficheiro. Se não você apenas lança o batchfile e fornece o nome do arquivo para obter como um argumento.

 42
Author: 0x90h, 2016-01-18 23:59:53

Este é um post antigo, no entanto, uma alternativa é usar as opções de comando:

ftp -n -s:ftpcmd.txt

O -n irá suprimir a autenticação inicial e, em seguida, o conteúdo do ficheiro será: (substitua o 127. 0. 0. 1 pelo url do seu site FTP)

open 127.0.0.1
user myFTPuser myftppassword
other commands here...

Isto evita o utilizador / senha em linhas separadas

 9
Author: Mark Schultheiss, 2016-07-01 15:22:56

Tem de escrever os comandos ftp num ficheiro de texto e dá-lo como um parâmetro para o comando ftp como este:

ftp -s:filename

Mais informação aqui: http://www.nsftools.com/tips/MSFTP.htm

Não tenho a certeza se funcionaria com o nome de utilizador e senha prompt.

 6
Author: Lasse, 2016-01-19 00:00:08

Cada linha de um ficheiro em lote será executada; mas só depois de a linha anterior ter terminado. No seu caso, assim que ele atinge a linha ftp o programa ftp vai começar e assumir a entrada do Usuário. Quando estiver fechada, as linhas restantes serão executadas. O que significa que o utilizador/senha nunca são enviados para o programa FTP e, em vez disso, será enviado para a linha de comandos em si, uma vez que o programa ftp é fechado.

Em vez disso, tem de passar tudo o que precisa na linha de comandos ftp. Algo do género:
@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
 5
Author: NotMe, 2013-04-22 23:06:25

Utilizar

ftp -s:FileName 

Conforme descrito em a documentação profissional do Produto do Windows XP .

O nome do ficheiro que tem de indicar no lugar de o nome do ficheiro deve conter comandos FTP que deseja enviar para o servidor. Entre estes comandos estão

  • abrir o computador [Porta] para se ligar a um servidor FTP,
  • nome de utilizador [Senha] [Conta] para autenticar com o servidor FTP,
  • obter RemoteFile [Ficheiro local] para obter um ficheiro,
  • sair para terminar a sessão FTP e terminar o programa ftp.

Mais comandos podem ser encontrados nos subcomités de Ftp .

 4
Author: Oswald, 2013-04-22 23:08:46
Eis o que eu uso. No meu caso, certos servidores ftp (pure-ftpd para um) irão sempre pedir o nome do utilizador, mesmo com o parâmetro-i, e capturar o comando "user username" como a senha interativa. O que eu faço, introduza alguns comandos NOOP (sem operação) até que o servidor ftp termine, e depois faça o login:
open ftp.example.com 
noop
noop
noop
noop
noop
noop
noop
noop
user username password
...
quit
 0
Author: Justin Goldberg, 2015-01-31 22:38:30

Você pode usar PowerShell também; isto é o que eu fiz. Como eu precisava baixar um arquivo baseado em um padrão, eu criei dinamicamente um arquivo de comando e, em seguida, deixar ftp fazer o resto.

Usei comandos básicos de PowerShell. Eu não precisava baixar nenhum componente adicional. Eu verifiquei primeiro se o número necessário de arquivos existia. Se eu invocei o FTP pela segunda vez com um Mget. Executei isto a partir de um servidor do Windows 2008 a ligar-se a um servidor remoto do 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"
}
 0
Author: kev, 2016-06-08 19:08:24

Escrevi um script como ficheiro *.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 bem para mim

 -1
Author: Ghayel, 2016-07-06 10:53:57