Je veux un fichier batch à ftp sur un serveur, lire un fichier texte et me déconnecter. Le serveur nécessite un utilisateur et un mot de passe. j'ai essayé
@echo off
pause
@ftp example.com
username
password
pause
mais il ne s'est jamais connecté. Comment puis-je le faire fonctionner?
La réponse par x90h a beaucoup aidé ...
J'ai enregistré ce fichier sous le nom u.ftp:
open 10.155.8.215
user
password
lcd /D "G:\Subfolder\"
cd folder/
binary
mget file.csv
disconnect
quit
J'ai alors lancé cette commande:
ftp -i -s:u.ftp
Et ça a marché !!!
Merci beaucoup mec :)
En utilisant le client FTP Windows, vous voudriez utiliser l'option -s:filename
pour spécifier un script à exécuter par le client FTP. La documentation indique spécifiquement que vous ne devez pas essayer de canaliser une entrée dans le client FTP avec un caractère <
.
L'exécution du script va commencer immédiatement, donc ça marche pour nom d'utilisateur/mot de passe.
Cependant, la sécurité de cette configuration est discutable car vous avez maintenant un nom d'utilisateur et un mot de passe pour le serveur FTP visibles pour toute personne qui décide de consulter votre fichier batch.
De toute façon, vous pouvez générer le fichier de script à la volée à partir du fichier de commandes, puis le transmettre au client FTP de la manière suivante:
@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
Remplacez nom_serveur, nom_utilisateur et mot de passe par vos détails et le fichier de commandes générera le script sous le nom temp.txt, lancez ftp avec le script, puis supprimer le script.
Si vous obtenez toujours le même fichier, vous pouvez remplacer le %1
par le nom du fichier. Sinon, lancez simplement le fichier de commandes et indiquez le nom du fichier à obtenir comme argument.
Ceci est un ancien post cependant, une alternative consiste à utiliser les options de commande:
ftp -n -s:ftpcmd.txt
le -n supprimera la connexion initiale et le contenu du fichier serait: (remplacez le 127.0.0.1 par l'URL de votre site FTP)
open 127.0.0.1
user myFTPuser myftppassword
other commands here...
Cela évite l'utilisateur/mot de passe sur des lignes séparées
Vous devez écrire les commandes ftp dans un fichier texte et le définir comme paramètre pour la commande ftp comme ceci:
ftp -s:filename
Plus d'infos ici: http://www.nsftools.com/tips/MSFTP.htm
Je ne suis pas sûr si cela fonctionnerait avec le nom d'utilisateur et le mot de passe Invite.
Utilisation
ftp -s:FileName
comme décrit dans Documentation de Windows XP Professional .
Le nom de fichier que vous devez spécifier à la place de Nom de fichier doit contenir les commandes FTP que vous souhaitez envoyer au serveur. Parmi ces commandes sont
Plus de commandes peuvent être trouvées sous sous-commandes FTP .
Chaque ligne d'un fichier batch sera exécutée; mais seulement après la fin de la ligne précédente. Dans votre cas, dès qu’il atteint la ligne FTP, le programme FTP démarre et prend en charge les entrées de l’utilisateur. Quand il est fermé, les lignes restantes seront exécutées. Cela signifie que le nom d'utilisateur/mot de passe n'est jamais envoyé au programme FTP, mais sera envoyé à la commande même une fois le programme ftp fermé.
Au lieu de cela, vous devez passer tout ce dont vous avez besoin sur la ligne de commande ftp. Quelque chose comme:
@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
Vous pouvez également utiliser PowerShell. c'est ce que j'ai fait. Comme j'avais besoin de télécharger un fichier basé sur un modèle, j'ai créé dynamiquement un fichier de commande, puis laissé ftp
faire le reste.
J'ai utilisé les commandes de base PowerShell. Je n'ai pas eu besoin de télécharger de composants supplémentaires. J'ai d'abord vérifié si le nombre requis de fichiers existait. S'ils ont invoqué le FTP la deuxième fois avec un Mget. J'exécute ceci depuis Windows Server 2008 en me connectant à un serveur distant 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"
}
Voici ce que j'utilise. Dans mon cas, certains serveurs ftp (pure-ftpd pour un) demanderont toujours le nom d'utilisateur, même avec le paramètre -i, et intercepteront la commande "user username" comme mot de passe interactif. Ce que je fais, saisissez quelques commandes NOOP (aucune opération) jusqu’à expiration du délai imparti au serveur FTP, puis connectez-vous:
open ftp.example.com
noop
noop
noop
noop
noop
noop
noop
noop
user username password
...
quit