programing

FTP 업로드 및 다운로드 스크립트 방법

bestprogram 2023. 9. 19. 21:19

FTP 업로드 및 다운로드 스크립트 방법

FTP 서버에 파일을 업로드하기 위해 일괄 파일을 만들려고 합니다.수동으로 입력하면 정상적으로 작동하지만 배치 파일을 실행하면 연결된 후 중지됩니다.다음과 같이 적혀있습니다.

connected to domain.com.

220 microsoft ftp server

User(domain.com:(none)):

그리고 다른 건 없습니다.이게 무슨 일입니까?

아래는 제 배치 파일입니다.

ftp www.domainhere.com

user useridhere

passwordhere

put test.txt

bye

pause

원래 포스터가 상상했던 대로 FTP 세션을 스크립팅하는 것이 합리적인 생각이며, Expect가 도움이 될 것입니다.Windows의 배치 파일에서는 이 작업을 수행할 수 없습니다.

그러나 cURL이나 Expect를 실행하는 것보다 FTP와 PowerShell의 상호 작용을 스크립팅하는 것이 더 쉽다는 것을 알 수 있습니다.FTP 서버에 보낼 텍스트를 직접 스크립팅하지 않는다는 점에서 다른 모델입니다.대신 PowerShell을 사용하여 FTP 대화를 생성하는 개체를 조작할 수 있습니다.

업로드:

$File = "D:\Dev\somefilename.zip"
$ftp = "ftp://username:password@example.com/pub/incoming/somefilename.zip"

"ftp url: $ftp"

$webclient = New-Object System.Net.WebClient
$uri = New-Object System.Uri($ftp)

"Uploading $File..."

$webclient.UploadFile($uri, $File)

다운로드:

$File = "c:\store\somefilename.zip"
$ftp = "ftp://username:password@example.com/pub/outbound/somefilename.zip"

"ftp url: $ftp"

$webclient = New-Object System.Net.WebClient
$uri = New-Object System.Uri($ftp)

"Downloading $File..."

$webclient.DownloadFile($uri, $File)

이 작업을 수행하려면 PowerShell이 필요합니다.모르는 경우 PowerShell은 cmd와 같은 셸입니다..bat 파일을 실행하는 exe.그러나 PowerShell은 .ps1 파일을 실행하며 훨씬 더 강력합니다.PowerShell은 Windows(윈도우)에 무료로 추가되는 기능으로 향후 버전의 Windows(윈도우)에 기본 제공됩니다.여기로 가져와요.

출처 : http://poshcode.org/1134

명령어로 명령어 파일을 만듭니다.

즉, 파일 명령어입니다.txt:

open www.domainhere.com
user useridhere
passwordhere
put test.txt
bye

그런 다음 명령줄에서 FTP 클라이언트를 실행합니다.

ftp -s:commands.txt

참고: Windows FTP 클라이언트에서 사용할 수 있습니다.

배치 파일은 그런 식으로 작동하지 않습니다.하는 것이 이 에는 자"합니다를을합니다.ftp 명령을 ... 이 는 단지y을 뿐입니다ftp퇴장합니다.

만약 당신이 사용할 필요가 있다면.ftp을 실행한 다음 다예:commands.txt그리고 달리다ftp -s:commands.txt.

그러나 cURL이나 PHP/Perl/Python/어떤 스크립트를 사용하는 것이 더 좋은 생각일 수 있습니다.

PowerShell로 해봤습니다.

function DownloadFromFtp($destination, $ftp_uri, $user, $pass){
    $dirs = GetDirecoryTree $ftp_uri $user $pass

    foreach($dir in $dirs){
       $path = [io.path]::Combine($destination,$dir)

       if ((Test-Path $path) -eq $false) {
          "Creating $path ..."
          New-Item -Path $path -ItemType Directory | Out-Null
       }else{
          "Exists $path ..."
       }
    }

    $files = GetFilesTree $ftp_uri $user $pass

    foreach($file in $files){
        $source = [io.path]::Combine($ftp_uri,$file)
        $dest = [io.path]::Combine($destination,$file)

        "Downloading $source ..."
        Get-FTPFile $source $dest $user $pass
    }
}

function UploadToFtp($artifacts, $ftp_uri, $user, $pass){
    $webclient = New-Object System.Net.WebClient 
    $webclient.Credentials = New-Object System.Net.NetworkCredential($user,$pass)  

    foreach($item in Get-ChildItem -recurse $artifacts){ 

        $relpath = [system.io.path]::GetFullPath($item.FullName).SubString([system.io.path]::GetFullPath($artifacts).Length + 1)

        if ($item.Attributes -eq "Directory"){

            try{
                Write-Host Creating $item.Name

                $makeDirectory = [System.Net.WebRequest]::Create($ftp_uri+$relpath);
                $makeDirectory.Credentials = New-Object System.Net.NetworkCredential($user,$pass) 
                $makeDirectory.Method = [System.Net.WebRequestMethods+FTP]::MakeDirectory;
                $makeDirectory.GetResponse();

            }catch [Net.WebException] {
                Write-Host $item.Name probably exists ...
            }

            continue;
        }

        "Uploading $item..."
        $uri = New-Object System.Uri($ftp_uri+$relpath) 
        $webclient.UploadFile($uri, $item.FullName)
    }
}

 function Get-FTPFile ($Source,$Target,$UserName,$Password) 
 { 
     $ftprequest = [System.Net.FtpWebRequest]::create($Source) 
     $ftprequest.Credentials = New-Object System.Net.NetworkCredential($username,$password) 
     $ftprequest.Method = [System.Net.WebRequestMethods+Ftp]::DownloadFile 
     $ftprequest.UseBinary = $true 
     $ftprequest.KeepAlive = $false 

     $ftpresponse = $ftprequest.GetResponse() 
     $responsestream = $ftpresponse.GetResponseStream() 

     $targetfile = New-Object IO.FileStream ($Target,[IO.FileMode]::Create) 
     [byte[]]$readbuffer = New-Object byte[] 1024 

     do{ 
         $readlength = $responsestream.Read($readbuffer,0,1024) 
         $targetfile.Write($readbuffer,0,$readlength) 
     } 
     while ($readlength -ne 0) 

     $targetfile.close() 
 } 

#task ListFiles {
#   
#    $files = GetFilesTree 'ftp://127.0.0.1/' "web" "web"
#    $files | ForEach-Object {Write-Host $_ -foregroundcolor cyan}
#}

function GetDirecoryTree($ftp, $user, $pass){
    $creds = New-Object System.Net.NetworkCredential($user,$pass)

    $files = New-Object "system.collections.generic.list[string]"
    $folders = New-Object "system.collections.generic.queue[string]"
    $folders.Enqueue($ftp)

    while($folders.Count -gt 0){
        $fld = $folders.Dequeue()

        $newFiles = GetAllFiles $creds $fld
        $dirs = GetDirectories $creds $fld

        foreach ($line in $dirs){
            $dir = @($newFiles | Where { $line.EndsWith($_) })[0]
            [void]$newFiles.Remove($dir)
            $folders.Enqueue($fld + $dir + "/")

            [void]$files.Add($fld.Replace($ftp, "") + $dir + "/")
        }
    }

    return ,$files
}

function GetFilesTree($ftp, $user, $pass){
    $creds = New-Object System.Net.NetworkCredential($user,$pass)

    $files = New-Object "system.collections.generic.list[string]"
    $folders = New-Object "system.collections.generic.queue[string]"
    $folders.Enqueue($ftp)

    while($folders.Count -gt 0){
        $fld = $folders.Dequeue()

        $newFiles = GetAllFiles $creds $fld
        $dirs = GetDirectories $creds $fld

        foreach ($line in $dirs){
            $dir = @($newFiles | Where { $line.EndsWith($_) })[0]
            [void]$newFiles.Remove($dir)
            $folders.Enqueue($fld + $dir + "/")
        }

        $newFiles | ForEach-Object { 
            $files.Add($fld.Replace($ftp, "") + $_) 
        }
    }

    return ,$files
}

function GetDirectories($creds, $fld){
    $dirs = New-Object "system.collections.generic.list[string]"

    $operation = [System.Net.WebRequestMethods+Ftp]::ListDirectoryDetails
    $reader = GetStream $creds $fld $operation
    while (($line = $reader.ReadLine()) -ne $null) {

       if ($line.Trim().ToLower().StartsWith("d") -or $line.Contains(" <DIR> ")) {
            [void]$dirs.Add($line)
        }
    }
    $reader.Dispose();

    return ,$dirs
}

function GetAllFiles($creds, $fld){
    $newFiles = New-Object "system.collections.generic.list[string]"
    $operation = [System.Net.WebRequestMethods+Ftp]::ListDirectory

    $reader = GetStream $creds $fld $operation

    while (($line = $reader.ReadLine()) -ne $null) {
       [void]$newFiles.Add($line.Trim()) 
    }
    $reader.Dispose();

    return ,$newFiles
}

function GetStream($creds, $url, $meth){

    $ftp = [System.Net.WebRequest]::Create($url)
    $ftp.Credentials = $creds
    $ftp.Method = $meth
    $response = $ftp.GetResponse()

    return New-Object IO.StreamReader $response.GetResponseStream()
}

Export-ModuleMember UploadToFtp, DownLoadFromFtp

를 로 작성할 수 .ftp휘로 합니다.-s:filename선택. 구문은 전달할 명령의 목록일 뿐입니다에게 전달하기 위한 입니다.ftp포탄, 각각은 새로운 선으로 끝납니다.페이지에는 다음과 같이 수행할 수 있는 명령에 대한 좋은 참조가 있습니다.ftp.

전체 디렉토리 구조 업로드/다운로드

인 을 사용하여ftpFTP 사이트에 전체 디렉터리 트리를 복사하거나 FTP 사이트에서 복사해야 할 때는 잘 작동하지 않습니다.그런 상황을 처리하기 위해 이런 것들을 사용할 수 있습니다.

는 윈도우즈() 합니다.ftp명령을 사용하여 단일 명령에서 전체 디렉토리를 업로드 및 다운로드할 수 있습니다.이를 통해 다른 시스템에서 사용할 때 매우 독립적으로 사용할 수 있습니다.

으로 덤프, /하고, ftp파일에 명령한 다음 매핑이 완료되면 해당 명령을 실행합니다.

ftpuppload 입니다.박쥐

@echo off

SET FTPADDRESS=%1
SET FTPUSERNAME=%2
SET FTPPASSWORD=%3
SET LOCALDIR=%~f4
SET REMOTEDIR=%5

if "%FTPADDRESS%" == "" goto FTP_UPLOAD_USAGE
if "%FTPUSERNAME%" == "" goto FTP_UPLOAD_USAGE
if "%FTPPASSWORD%" == "" goto FTP_UPLOAD_USAGE
if "%LOCALDIR%" == "" goto FTP_UPLOAD_USAGE
if "%REMOTEDIR%" == "" goto FTP_UPLOAD_USAGE

:TEMP_NAME
set TMPFILE=%TMP%\%RANDOM%_ftpupload.tmp
if exist "%TMPFILE%" goto TEMP_NAME

SET INITIALDIR=%CD%

echo user %FTPUSERNAME% %FTPPASSWORD% > %TMPFILE%
echo bin >> %TMPFILE%
echo lcd %LOCALDIR% >> %TMPFILE%

cd %LOCALDIR%

setlocal EnableDelayedExpansion
echo mkdir !REMOTEDIR! >> !TMPFILE!
echo cd %REMOTEDIR% >> !TMPFILE!
echo mput * >> !TMPFILE!
for /d /r %%d in (*) do (
    set CURRENT_DIRECTORY=%%d
    set RELATIVE_DIRECTORY=!CURRENT_DIRECTORY:%LOCALDIR%=!
    echo mkdir "!REMOTEDIR!/!RELATIVE_DIRECTORY:~1!" >> !TMPFILE!
    echo cd "!REMOTEDIR!/!RELATIVE_DIRECTORY:~1!" >> !TMPFILE!
    echo mput "!RELATIVE_DIRECTORY:~1!\*" >> !TMPFILE!
)

echo quit >> !TMPFILE!

endlocal EnableDelayedExpansion

ftp -n -i "-s:%TMPFILE%" %FTPADDRESS%

del %TMPFILE%

cd %INITIALDIR%

goto FTP_UPLOAD_EXIT

:FTP_UPLOAD_USAGE

echo Usage:    ftpupload [address] [username] [password] [local directory] [remote directory]
echo.

:FTP_UPLOAD_EXIT

set INITIALDIR=
set FTPADDRESS=
set FTPUSERNAME=
set FTPPASSWORD=
set LOCALDIR=
set REMOTEDIR=
set TMPFILE=
set CURRENT_DIRECTORY=
set RELATIVE_DIRECTORY=

@echo on

ftpget.bat

@echo off

SET FTPADDRESS=%1
SET FTPUSERNAME=%2
SET FTPPASSWORD=%3
SET LOCALDIR=%~f4
SET REMOTEDIR=%5
SET REMOTEFILE=%6

if "%FTPADDRESS%" == "" goto FTP_UPLOAD_USAGE
if "%FTPUSERNAME%" == "" goto FTP_UPLOAD_USAGE
if "%FTPPASSWORD%" == "" goto FTP_UPLOAD_USAGE
if "%LOCALDIR%" == "" goto FTP_UPLOAD_USAGE
if not defined REMOTEDIR goto FTP_UPLOAD_USAGE
if not defined REMOTEFILE goto FTP_UPLOAD_USAGE

:TEMP_NAME
set TMPFILE=%TMP%\%RANDOM%_ftpupload.tmp
if exist "%TMPFILE%" goto TEMP_NAME

echo user %FTPUSERNAME% %FTPPASSWORD% > %TMPFILE%
echo bin >> %TMPFILE%
echo lcd %LOCALDIR% >> %TMPFILE%

echo cd "%REMOTEDIR%" >> %TMPFILE%
echo mget "%REMOTEFILE%" >> %TMPFILE%
echo quit >> %TMPFILE%

ftp -n -i "-s:%TMPFILE%" %FTPADDRESS%

del %TMPFILE%

goto FTP_UPLOAD_EXIT

:FTP_UPLOAD_USAGE

echo Usage:    ftpget [address] [username] [password] [local directory] [remote directory] [remote file pattern]
echo.

:FTP_UPLOAD_EXIT

set FTPADDRESS=
set FTPUSERNAME=
set FTPPASSWORD=
set LOCALDIR=
set REMOTEFILE=
set REMOTEDIR=
set TMPFILE=
set CURRENT_DIRECTORY=
set RELATIVE_DIRECTORY=

@echo on

이 스크립트는 명령 파일을 생성한 다음 명령 파일을 ftp 프로그램에 파이프링하여 도중에 로그를 생성합니다.마지막으로 이 세션의 원래 bat 파일, 명령 파일 및 로그를 인쇄합니다.

@echo on
@echo off > %0.ftp
::== GETmy!dir.bat
>> %0.ftp echo a00002t
>> %0.ftp echo iasdad$2
>> %0.ftp echo help
>> %0.ftp echo prompt
>> %0.ftp echo ascii
>> %0.ftp echo !dir REPORT.CP1C.ROLLEDUP.TXT
>> %0.ftp echo get REPORT.CP1C.ROLLEDUP.TXT
>> %0.ftp echo !dir REPORT.CP1C.ROLLEDUP.TXT
>> %0.ftp echo *************************************************   
>> %0.ftp echo !dir CONTENT.CP1C.ROLLEDUP.TXT
>> %0.ftp echo get CONTENT.CP1C.ROLLEDUP.TXT
>> %0.ftp echo !dir CONTENT.CP1C.ROLLEDUP.TXT
>> %0.ftp echo *************************************************   
>> %0.ftp echo !dir WORKLOAD.CP1c.ROLLEDUP.TXT
>> %0.ftp echo get WORKLOAD.CP1C.ROLLEDUP.TXT
>> %0.ftp echo !dir WORKLOAD.CP1C.ROLLEDUP.TXT
>> %0.ftp echo *************************************************   
>> %0.ftp echo !dir REPORT.TMMC.ROLLEDUP.TXT
>> %0.ftp echo get REPORT.TMMC.ROLLEDUP.TXT
>> %0.ftp echo !dir REPORT.TMMC.ROLLEDUP.TXT
>> %0.ftp echo *************************************************   
>> %0.ftp echo !dir CONTENT.TMMC.ROLLEDUP.TXT
>> %0.ftp echo get CONTENT.TMMC.ROLLEDUP.TXT
>> %0.ftp echo !dir CONTENT.TMMC.ROLLEDUP.TXT
>> %0.ftp echo **************************************************   
>> %0.ftp echo !dir WORKLOAD.TMMC.ROLLEDUP.TXT
>> %0.ftp echo get WORKLOAD.TMMC.ROLLEDUP.TXT
>> %0.ftp echo !dir WORKLOAD.TMMC.ROLLEDUP.TXT
>> %0.ftp echo quit
ftp -d -v -s:%0.ftp 150.45.12.18 > %0.log
type %0.bat 
type %0.ftp 
type %0.log 

원래 포스터처럼 파일 업로드를 자동화하고 싶었지만 방법을 알 수 없었습니다.이것은 우리 가족 가게의 레지스터 터미널에 있기 때문에 파워셸을 설치하고 싶지 않았고(쉬운 옵션처럼 보이지만), 간단한 .bat 파일을 설치하고 싶었을 뿐입니다.

이것은 grudity와 다른 사용자가 말한 것과 거의 같습니다. 저는 이 일에 익숙하지 않기 때문에 여기에 더 자세한 예와 설명이 있습니다(.bat 파일 하나로 FTP 업로드를 자동화하는 방법을 Windows 명령줄에서 설명해 주신 덕분이기도 합니다).

기본적으로 .bat와 .txt의 두 파일이 필요합니다..bat은 ftp.exe에 사용할 스위치를 알려줍니다..txt는 ftp.exe에 명령 목록을 제공합니다.텍스트 파일에 다음을 입력합니다.

username
password
cd whereverYouWantToPutTheFile
lcd whereverTheFileComesFrom
put C:\InventoryExport\inventory.test (or your file path)
bye

원하는 곳에 저장하세요.BAT 파일에 다음을 입력합니다.

ftp.exe -s:C:\Windows\System32\test.txt destinationIP
pause

가 .-s:텍스트 파일이 있는 곳으로 이동할 수 있습니다.실제로 실행할 때는 일시 중지를 해제합니다. 오류가 있으면 바로 확인할 수 있습니다.론 "get"다를 할 수 .ftp을 수행합니다txt 파일에서 명령을 실행하여 필요한 모든 작업을 수행합니다.

이 긍정적이지 .lcd텍스트 파일에 명령을 입력합니다.말씀드린 것처럼, 저는 이런 종류의 일에 명령줄을 사용하는 것이 처음이지만, 이것은 저에게 효과가 있습니다.

저는 이와 같은 문제가 있었고, 치즈가 제공한 것과 유사한 해결책으로 해결했습니다.

"doesn가 작동하지 않습니다. 비밀번호가 필요합니다. 몇 가지 다른 방법으로 시도했습니다."

예, 명령어 파일을 통한 FTP 세션은 사용자 이름 앞에 문자열 "user"를 붙이지 않아도 되기 때문입니다.그거 내려놓고 한번 해보세요.

또는 FTP 명령 파일이 제대로 인코딩되지 않았기 때문에(나도 물어뜯었습니다) 이러한 현상이 나타날 수 있습니다.런타임에 FTP 명령 파일을 생성하는 것은 이 부분에 해당합니다.PowerShell의 외부 파일 cmdlet에는 Windows FTP에서 허용하는 인코딩 옵션이 없습니다(적어도 찾을 수 있는 인코딩 옵션은 없습니다).

그럼에도 불구하고, 웹 클라이언트를 수행하는 것처럼.Download File이 방법입니다.

수동으로 시도:

$ ftp www.domainhere.com 
> useridhere
> passwordhere
> put test.txt
> bye
> pause

언급URL : https://stackoverflow.com/questions/936108/how-to-script-ftp-upload-and-download