web-dev-qa-db-fra.com

Comment ftp avec un fichier batch?

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?

45
user1935683

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 :)

53
Outlier

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.

45
0x90h

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

11
Mark Schultheiss

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.

6
Lasse

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

  • Ouvrez l'ordinateur [Port] pour vous connecter à un serveur FTP,
  • utilisateur Nom d'utilisateur [Mot de passe] [Compte] pour s'authentifier auprès du serveur FTP,
  • récupère un fichier dans RemoteFile [LocalFile] ,
  • quittez pour mettre fin à la session FTP et terminer le programme ftp.

Plus de commandes peuvent être trouvées sous sous-commandes FTP .

5
Oswald

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
5
NotMe

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

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
0
Justin Goldberg