Reminiscence


PowerShell
이용하면서 PowerShell 내에서 FTP 데이터를 다운 받아 처리 있는 방법은 없을까 고민하던 FTP 관련 함수들을 찾아보기 시작했습니다.

 

PowerShell에서 FTP 대한 기능들을 사용 있도록 해주는 모듈을 판매하는 업체도 있었지만, 해당 모듈을 구매하여 사용하는 것은 의미가 없으므로, 실제 데이터를 주고 받을 있는 함수들을 찾아보았습니다.

 

아래 내용은 FTP 이용하여 파일을 다운로드 하는 스크립트 입니다.

아래 내용에서 가장 중요한 부분은 .NET Component 사용하는 부분이며, 이에 대한 자세한 정보는 http://msdn.microsoft.com/en-us/library/system.net.ftpwebrequest.aspx 에서 확인 있습니다.

 

 

# Get-FTPfile 함수를 선언

function Get-FTPFile ($Source,$Target,$UserName,$Password) 

{ 

 

# FTP 주소를 .Net 컴포넌트중 FtpWebRequest의 Craete명령을 통해 열어 줍니다.

# 단, 이때 사용되는 $Source 주소의 경우 FTP Web Request이기 때문에 FTP://주소/ 형식으로 입력되어야 합니다.

$ftprequest = [System.Net.FtpWebRequest]::create($Source) 

 

 

# NetworkCredential Class는 기본, 다이제스트, NTLM, Kerberos 인증과 같은 암호 기반의 인증 체계에 자격증명을 제공하기 위해서 사용 합니다.

# 참고 : http://msdn.microsoft.com/ko-kr/library/system.net.networkcredential(v=VS.80).aspx

 

$ftprequest.Credentials = 

    New-Object System.Net.NetworkCredential($username,$password) 

 

# ::DownloadFile : FTP 서버에서 파일을 다운로드 하는데 사용되는 FTP RETR 프로토콜 메서드를 나타냅니다.

$ftprequest.Method = [System.Net.WebRequestMethods+Ftp]::DownloadFile 

# UseBinary : FTP 서버에서 파일 전송시 데이터 형식을 지정하는 Boolean 값을 설정 합니다.

$ftprequest.UseBinary = $true 

# KeepAlive : FTP 서버에서 제어 연결이 요청 완료 후 닫히는지 여부를 결정 합니다. 지속적인 세션 유지를 위해 False 값을 줍니다.

$ftprequest.KeepAlive = $false 

 

# FTP 서버에 응답을 반환 하는 메서드를 ftpresponse에 지정합니다.

$ftpresponse = $ftprequest.GetResponse() 

 

# FTP 서버에서 보낸 응답 데이터를 포함하는 스트림을 검색하여 reponsestream에 지정합니다.

$responsestream = $ftpresponse.GetResponseStream() 

 

# System.IO.FileStream 클래스를 사용하여 로컬 시스템의 디렉토리에 파일을 생성 할 수 있도록 준비 합니다.

# 이때 아래 [IO.FileMode]::Create는 로컬 시스템에서 파일을 생성할때 동일한 이름이 있으면 덮어쓰고, 동일한 이름이 없으면 새로 생성 함을 의미 합니다.)

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

 

# 파일을 받을 때 버퍼로 사용 할 ByteArray 변수를 생성합니다.

[byte[]]$readbuffer = New-Object byte[] 1024 

 

# ResponseStream.Read 메서드를 이용하여 Response된 Stream의 데이터를 Readbuffer에 저장하고 1024Byte 만큼 저장되면 이를 IO.FileStream의 Write 메서드를 이요하여 파일로 작성 합니다.

# 이 과정은 ResponseStream에서 읽어들인 데이터가 0일때까지 계속 됩니다. (파일을 받아오는 과정)

# 이와 관련된 과정은 http://msdn.microsoft.com/ko-kr/library/yet8z89t.aspx  http://msdn.microsoft.com/ko-kr/library/system.io.stream.read.aspx 를 참조하시기 바랍니다.

do{ 

    $readlength = $responsestream.Read($readbuffer,0,1024) 

    $targetfile.Write($readbuffer,0,$readlength) 

} 

while ($readlength -ne 0) 

# IO.FileStream.Close 메서드를 이용하여 파일을 닫습니다.

$targetfile.close() 

} 

 

# Get-FTPFile 함수 호출을 위한 기본적인 정보들을 입력합니다. 

$sourceuri = "ftp://MyFtpServer/FolderPath\File.txt" 

$targetpath = "C:\temp\MyFile.txt" 

$user = "Username" 

$pass = "Password" 

Get-FTPFile $sourceuri $targetpath $user $pass

 


다음편에서는
FTP 이용하기 (Upload Delete)편을 준비하도록 하겠습니다.

 

감사합니다.


저작자 표시 비영리
신고

댓글 0개가 달렸습니다.