programing

PowerShell에서 보안 FTP를 자동화하는 가장 좋은 방법은 무엇입니까?

goodsources 2023. 9. 3. 16:15
반응형

PowerShell에서 보안 FTP를 자동화하는 가장 좋은 방법은 무엇입니까?

PowerShell을 사용하여 데이터베이스 백업 파일의 FTP 다운로드를 자동화하고 싶습니다.파일 이름에 날짜가 포함되어 있어서 매일 같은 FTP 스크립트를 실행할 수 없습니다.PowerShell에 내장되어 있거나 를 사용하여 이 작업을 수행할 수 있는 깨끗한 방법이 있습니까?NET 프레임워크?

보안 FTP 세션을 사용합니다.

몇 가지 실험 끝에 PowerShell에서 안전한 FTP 다운로드를 자동화하는 방법을 생각해 냈습니다.이 스크립트는 Chilkat Software에서 관리하는 공용 테스트 FTP 서버에서 실행됩니다.따라서 이 코드를 복사하여 붙여넣으면 수정 없이 실행됩니다.

$sourceuri = "ftp://ftp.secureftp-test.com/hamlet.zip"
$targetpath = "C:\hamlet.zip"
$username = "test"
$password = "test"

# Create a FTPWebRequest object to handle the connection to the ftp server
$ftprequest = [System.Net.FtpWebRequest]::create($sourceuri)

# set the request's network credentials for an authenticated connection
$ftprequest.Credentials =
    New-Object System.Net.NetworkCredential($username,$password)

$ftprequest.Method = [System.Net.WebRequestMethods+Ftp]::DownloadFile
$ftprequest.UseBinary = $true
$ftprequest.KeepAlive = $false

# send the ftp request to the server
$ftpresponse = $ftprequest.GetResponse()

# get a download stream from the server response
$responsestream = $ftpresponse.GetResponseStream()

# create the target file on the local system and the download buffer
$targetfile = New-Object IO.FileStream ($targetpath,[IO.FileMode]::Create)
[byte[]]$readbuffer = New-Object byte[] 1024

# loop through the download stream and send the data to the target file
do{
    $readlength = $responsestream.Read($readbuffer,0,1024)
    $targetfile.Write($readbuffer,0,$readlength)
}
while ($readlength -ne 0)

$targetfile.close()

저는 이 링크에서 많은 도움이 되는 정보를 찾았습니다.

SSL 연결을 사용하려면 줄을 추가해야 합니다.

$ftprequest.EnableSsl = $true

GetResponse()를 호출하기 전에 스크립트로 이동합니다.때때로 만료된 서버 보안 인증서를 처리해야 할 수도 있습니다(불행히도 마찬가지입니다).PowerShell 코드 저장소에는 이를 위한 코드 조각이 있는 페이지가 있습니다.처음 28줄은 파일 다운로드 목적과 가장 관련이 있습니다.

여기서 찍은 사진:

$source = "ftp://ftp.microsoft.com/ResKit/win2000/dureg.zip"
$target = "c:\temp\dureg.zip"
$WebClient = New-Object System.Net.WebClient
$WebClient.DownloadFile($source, $target)

저한테는 효과가 있어요.

PowerShell에 관한 한 /n Software NetCmdlet 패키지에는 FTP cmdlet(두 보안 FTP 유형 모두에 대한 지원 포함)이 포함되어 있어 이에 매우 쉽게 사용할 수 있습니다.

@Eric이 가장 많이 투표한 자가 답변은 효과가 있지만 다음과 같습니다.

  • 1KB 버퍼로 비효율적임;
  • 재구현으로 불필요하게 복잡한 작업을 쉽고 효율적으로 수행할 수 있는 작업:
$fileUrl = "ftp://ftp.example.com/remote/path/file.zip"
$localFilePath = "C:\local\path\file.zip"

$downloadRequest = [Net.WebRequest]::Create($fileUrl)
$downloadRequest.Method = [System.Net.WebRequestMethods+Ftp]::DownloadFile
$downloadRequest.Credentials =
    New-Object System.Net.NetworkCredential("username", "password")
# Enable secure FTPS (FTP over TLS/SSL)
$downloadRequest.EnableSsl = $True

$sourceStream = $downloadRequest.GetResponse().GetResponseStream()
$targetStream = [System.IO.File]::Create($localFilePath)
$sourceStream.CopyTo($targetStream);

$sourceStream.Dispose()
$targetStream.Dispose()

업로드는 PowerShell을 사용하여 FTP로 파일 업로드를 참조하십시오.

JAMS 작업 스케줄러는 이 작업을 쉽게 수행할 수 있는 몇 가지 cmdlet을 제공합니다.보안 세션을 위한 다양한 FTP cmdlet과 자연 날짜를 로 변환하기 위한 날짜 cmdlet이 있습니다."지난 달 마지막 날"과 같은 NET 날짜 개체:

JAMS 작업 스케줄러 cmdlet

이것은 제가 바라는 것처럼 간단하지 않습니다.제가 알고 있는 세 가지 옵션이 있습니다.

  1. .NET - 를 사용할 수 있습니다.PowerShell에서 이 작업을 수행하는 NET 프레임워크이지만 스크립트에서는 수행하고 싶지 않은 원시 소켓 조작이 포함됩니다.이 경로를 사용할 경우 모든 FTP 정크를 C#의 DLL로 포장한 다음 PowerShell에서 해당 DLL을 사용합니다.

  2. 파일 조작 - 매일 가져와야 하는 파일 이름의 패턴을 알고 있다면 PowerShell로 FTP 스크립트를 열고 스크립트에서 파일 이름을 변경하면 됩니다.그런 다음 스크립트를 실행합니다.

  3. 텍스트를 FTP로 파이프 - 마지막 옵션은 PowerShell을 사용하여 FTP 세션에 대한 정보를 파이프로 보내고 받는 것입니다.여기 보세요.

이와 같은 것이 효과가 있을 수 있습니다.

$bkdir = "E:\BackupsPWS" #backups location directory
$7Zip = 'C:\"Program Files"\7-Zip\7z.exe' #compression utility
$files_to_transfer = New-Object System.Collections.ArrayList #list of zipped files to be   transferred over FTP
$ftp_uri="myftpserver"
$user="myftpusername"
$pass="myftppassword"

# Find .bak files not zipped yet, zip them, add them to the list to be transferrd
get-childitem -path $bkdir | Sort-Object length |
where { $_.extension -match ".(bak)" -and
        -not (test-path ($_.fullname -replace "(bak)", "7z")) } |
foreach {
    $zipfilename = ($_.fullname -replace "bak", "7z")
    Invoke-Expression "$7Zip a $zipfilename $($_.FullName)"
    $files_to_transfer.Add($zipfilename)
}

# Find .bak files, if they've been zipped, delete the .bak file
get-childitem -path $bkdir |
where { $_.extension -match ".(bak)" -and
        (test-path ($_.fullname -replace "(bak)", "7z")) } |
foreach { del $_.fullname }

# Transfer each zipped file over FTP
foreach ($file in $files_to_transfer)
{
    $webclient = New-Object System.Net.WebClient
    $webclient.Credentials = New-Object System.Net.NetworkCredential($user,$pass) # FTP credentials
    $ftp_urix = $ftp_uri + "/" + $file.Substring($bkdir.Length + 1) # ftp address where to transfer   the file
    $uri=[system.URI] $ftp_urix
    $webclient.UploadFile($uri, $file) #transfer the file
}

Powershell: 백업 압축FTP 전송 확인

인디 프로젝트를 성공적으로 사용했습니다.FTP를 수행할 NET 라이브러리입니다.그리고... 음, 주최자인 것 같네요.NET 빌드를 더 이상 사용할 수 없습니다.

$realdate = (Get-Date).ToString("yyyyMMdd")

$path = "D:\samplefolderstructure\filename" + $realdate + ".msi"

ftps -f $path -s:D:\FTP.txt

ftp서버에 입니다. ftp.txt는 서버에 대한 연결 정보입니다.ftps분명히 우리가 사용하는 고객이기 때문에 몇 가지 사항을 변경해야 할 수도 있습니다.하지만, 이것은 당신이 아이디어를 얻는 데 도움이 될 것입니다.

언급URL : https://stackoverflow.com/questions/265339/whats-the-best-way-to-automate-secure-ftp-in-powershell

반응형