Chcę plik wsadowy do ftp do serwera, odczytać plik tekstowy i rozłączyć. Serwer wymaga użytkownika i hasła. Spróbowałem:Jak korzystać z ftp z plikiem wsadowym?
ale nigdy się nie zalogował. Jak mogę to uruchomić?
Chcę plik wsadowy do ftp do serwera, odczytać plik tekstowy i rozłączyć. Serwer wymaga użytkownika i hasła. Spróbowałem:Jak korzystać z ftp z plikiem wsadowym?
ale nigdy się nie zalogował. Jak mogę to uruchomić?
Musisz napisać polecenia ftp w pliku tekstowym i przekazać go jako parametr dla komendy ftp jak ten:
ftp -s:filename
Więcej informacji tutaj: http://www.nsftools.com/tips/MSFTP.htm
Nie jestem pewien, ale jeśli będzie działać z monitem nazwy użytkownika i hasła.
Każda linia pliku wsadowego zostanie wykonana; ale dopiero po zakończeniu poprzedniej linii. W twoim przypadku, gdy tylko dotrze do linii ftp, uruchomi się program ftp i przejmie dane wprowadzane przez użytkownika. Po zamknięciu pozostałe linie zostaną wykonane. Oznacza to, że nazwa użytkownika/hasło nigdy nie są wysyłane do programu FTP, a zamiast tego będą podawane do wiersza poleceń, gdy program ftp zostanie zamknięty.
Zamiast tego musisz przekazać wszystko, czego potrzebujesz, w linii komend ftp. Coś jak:
@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
Zastosowanie
ftp -s:FileName
jak opisano w Windows XP Professional Product Documentation.
Nazwa pliku, którą należy podać w miejsce Nazwa pliku, musi zawierać polecenia FTP, które chcesz wysłać do serwera. Wśród prac są polecenia
Więcej poleceń można znaleźć pod Ftp subcommands.
Używając klienta FTP z systemem Windows, należy użyć opcji -s:filename
, aby określić skrypt do uruchomienia klienta FTP. W dokumentacji wyraźnie zaznaczono, że nie należy próbować potokować danych wejściowych do klienta FTP za pomocą znaku <
.
Wykonanie skryptu rozpocznie się natychmiast, więc działa pod nazwą użytkownika/hasłem.
Jednak bezpieczeństwo tej instalacji jest wątpliwe, ponieważ masz teraz nazwę użytkownika i hasło do serwera FTP widoczne dla każdego, kto zdecyduje się spojrzeć na plik wsadowy.
Tak czy inaczej, można wygenerować plik skryptu w locie z pliku wsadowego, a następnie przekazać go do klienta FTP tak:
@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
Wymień nazwa_serwera, użytkownika i hasło ze swoimi danymi i plikiem wsadowym wygeneruje skrypt jako temp.txt uruchamiając ftp ze skryptem, a następnie usunie skrypt.
Jeśli zawsze otrzymujesz ten sam plik, możesz zamienić nazwę %1
na nazwę pliku. Jeśli nie, po prostu uruchom plik wsadowy i podaj nazwę pliku, który chcesz pobrać jako argument.
Odpowiedź przez 0x90h pomogło ...
Uratowałem ten plik jako u.ftp:
open 10.155.8.215
user
password
lcd /D "G:\Subfolder\"
cd folder/
binary
mget file.csv
disconnect
quit
I pobiegł polecenie:
ftp -i -s:u.ftp
I to działało !!!
dziękuję mężczyzna :)
Można użyć PowerShell, a także; to właśnie zrobiłem. Ponieważ musiałem pobrać plik w oparciu o wzorzec, dynamicznie utworzyłem plik poleceń, a następnie pozwoliłem, aby ftp
zrobił resztę.
Użyłem podstawowych poleceń PowerShell. Nie musiałem pobierać żadnych dodatkowych składników. Najpierw sprawdziłem, czy istnieje wymagana liczba plików. Jeśli po raz drugi wywołałem FTP przy pomocy Mget. Uruchomiłem to z Windows Server 2008, łącząc się z serwerem zdalnym XP Windows .
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"
}
Oto, czego używam. W moim przypadku niektóre serwery ftp (pure-ftpd for one) będą zawsze pytać o nazwę użytkownika, nawet z parametrem -i, i przechwycić polecenie "user username" jako interaktywne hasło. Co zrobić, to wprowadzić kilka noop (bez operacji) Polecenia do czasów serwera ftp na zewnątrz, a następnie zalogować:
open ftp.example.com
noop
noop
noop
noop
noop
noop
noop
noop
user username password
...
quit
To jest stara poczta jednak jeden Alternatywą jest użycie opcji polecenia:
ftp -n -s:ftpcmd.txt
-n będzie tłumić początkowy login i następnie zawartość pliku będzie: (Wymień 127.0.0.1 z adresu URL witryny FTP)
open 127.0.0.1
user myFTPuser myftppassword
other commands here...
Pozwala to uniknąć użytkownika/hasło na oddzielnych liniach
Napisałem skrypt jako plik * 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
działa dobrze dla mnie
Co robi linia "ascii"? Konwertowanie na kodowanie znaków ASCII lub szukanie plików ASCII? – ChristianG
Nvm, Nauczyłem się, że linia "ASCII" się konwertuje. – ChristianG
Czy próbowałeś użyciu coś jak rury „|” aby skierować do niego nazwę użytkownika i hasło? A może plik tekstowy zawierający nazwę użytkownika i hasło, a następnie "ftp domain.net
TimH