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 날짜 개체:
이것은 제가 바라는 것처럼 간단하지 않습니다.제가 알고 있는 세 가지 옵션이 있습니다.
.NET - 를 사용할 수 있습니다.PowerShell에서 이 작업을 수행하는 NET 프레임워크이지만 스크립트에서는 수행하고 싶지 않은 원시 소켓 조작이 포함됩니다.이 경로를 사용할 경우 모든 FTP 정크를 C#의 DLL로 포장한 다음 PowerShell에서 해당 DLL을 사용합니다.
파일 조작 - 매일 가져와야 하는 파일 이름의 패턴을 알고 있다면 PowerShell로 FTP 스크립트를 열고 스크립트에서 파일 이름을 변경하면 됩니다.그런 다음 스크립트를 실행합니다.
텍스트를 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
'programing' 카테고리의 다른 글
오류 코드: 1406.데이터가 너무 길어서 열에 사용할 수 없음 - MySQL (0) | 2023.09.08 |
---|---|
JWT를 사용한 소켓 IO 연결 인증 (0) | 2023.09.03 |
전화기의 Google Play 스토어 앱에서 "Rate This App" 링크 (0) | 2023.09.03 |
SQL Logic 연산자 우선 순위:And 및 Or (0) | 2023.09.03 |
파워셸:명령줄에서 powershell을 호출할 때 변수를 스위치 매개 변수로 전달하려면 어떻게 해야 합니까? (0) | 2023.09.03 |