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?
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.
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.
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
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.
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
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 .
open ftp.example.com
noop
noop
noop
noop
noop
noop
noop
noop
user username password
...
quit
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"
}
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