PowerShell을 이용하면서 PowerShell 내에서 FTP로 데이터를 다운 받아 처리 할 수 있는 방법은 없을까 고민하던 중 FTP 관련 함수들을 찾아보기 시작했습니다.
PowerShell에서 FTP에 대한 기능들을 사용 할 수 있도록 해주는 모듈을 판매하는 업체도 있었지만, 해당 모듈을 구매하여 사용하는 것은 의미가 없으므로, 실제 데이터를 주고 받을 수 있는 함수들을 찾아보았습니다.
아래 내용은 FTP를 이용하여 파일을 다운로드 하는 스크립트 입니다.
아래 내용에서 가장 중요한 부분은 .NET Component를 사용하는 부분이며, 이에 대한 자세한 정보는 http://msdn.microsoft.com/en-us/library/system.net.ftpwebrequest.aspx 에서 확인 할 수 있습니다.
- 참고 : FTP 컴포넌트에 대한 각 속성 정보 : http://msdn.microsoft.com/ko-kr/library/6cxacd61(v=VS.85).aspx
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)편을 준비하도록 하겠습니다.
감사합니다.
'Powershell > 마성민' 카테고리의 다른 글
PowerShell로 IIS 로그의 송/수신 데이터 량을 확인하기 (0) | 2010.09.08 |
---|---|
PowerShell 자체 인증서 생성과 스크립트 인증 하기 (0) | 2010.07.21 |