2008-11-05 34 views
26

Tôi muốn tự động tải xuống FTP của tệp sao lưu cơ sở dữ liệu bằng PowerShell. Tên tệp bao gồm ngày nên tôi không thể chạy cùng một tập lệnh FTP mỗi ngày. Có cách nào để làm điều này được xây dựng trong PowerShell hoặc sử dụng khung .Net?Cách tốt nhất để tự động hóa FTP bảo mật trong PowerShell là gì?

CẬP NHẬT Tôi quên đề cập rằng đây là một phiên FTP bảo mật.

Trả lời

1

Điều này không đơn giản như tôi mong muốn. Có ba lựa chọn mà tôi biết.

1) .Net - Bạn có thể sử dụng khung .Net để thực hiện việc này trong PS, nhưng nó liên quan đến thao tác ổ cắm thô mà tôi không muốn thực hiện trong tập lệnh. Nếu tôi đã đi tuyến đường này, sau đó tôi sẽ quấn tất cả các ftp rác vào một DLL trong C# sau đó sử dụng DLL từ PowerShell.

2) Thao tác tệp - Nếu bạn biết mẫu của tên tệp mà bạn cần nhận mỗi ngày thì bạn có thể chỉ cần mở tập lệnh ftp bằng PS và thay đổi tên tệp trong tập lệnh. Sau đó chạy tập lệnh.

3) Văn bản đường dẫn tới FTP - Tùy chọn cuối cùng là sử dụng quyền hạn để thông tin đường ống vào và ra khỏi phiên FTP của bạn. Xem here.

7

Taken từ here

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

trình cho tôi

+0

đó là một lựa chọn thứ 4 có giá trị mà tôi nên có ý nghĩ. Nếu bạn sẽ biết tên của tập tin trước thời hạn thì đây chắc chắn là một giải pháp tốt và bạn nên chấp nhận nó như là câu trả lời. – EBGreen

0

Tôi đã sử dụng thành công thư viện Indy Dự án .NET để làm FTP. Và ... ugh, trông giống như bản dựng .NET được lưu trữ không còn nữa.

0

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

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

FTPS -f $ đường dẫn -s: D: \ FTP.txt

ftp.txt là cách chúng tôi giữ tất cả thông tin kết nối của chúng tôi với máy chủ FTP. ftps là khách hàng chúng tôi sử dụng rõ ràng, vì vậy có thể phải thay đổi một vài điều. Tuy nhiên, điều này sẽ giúp bạn định vị ý tưởng.

4

Theo PowerShell, gói/n Software NetCmdlets bao gồm các lệnh ghép ngắn FTP (bao gồm cả hỗ trợ cho cả hai loại FTP an toàn) mà bạn có thể sử dụng khá dễ dàng cho việc này.

24

Sau một số thử nghiệm, tôi đã tìm ra cách này để tự động tải xuống FTP an toàn trong PowerShell. Tập lệnh này chạy khỏi số public test FTP server do Chilkat Software quản lý. Vì vậy, bạn có thể sao chép và dán mã này và nó sẽ chạy mà không cần sửa đổi.

$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() 

tôi tìm thấy rất nhiều thông tin hữu ích tại những liên kết này

Nếu bạn muốn sử dụng một kết nối SSL bạn cần phải thêm dòng

$ftprequest.EnableSsl = $true 

cho tập lệnh trước khi bạn gọi GetResponse(). Đôi khi bạn có thể cần phải đối phó với chứng chỉ bảo mật máy chủ đã hết hạn (như tôi không may làm). Có một trang tại PowerShell Code Repository có một đoạn mã để làm điều đó. 28 dòng đầu tiên phù hợp nhất với mục đích tải xuống tệp.

+1

+1 để tìm và đăng giải pháp mã về điều này. Tuy nhiên, nó sẽ là tuyệt vời để xem một số ý kiến ​​trong mã. Bởi an toàn, tôi giả sử bạn có nghĩa là một người dùng/pass được cung cấp và không nhất thiết phải SFTP? –

+0

@Scott - Cảm ơn phản hồi của bạn. Tôi đã thêm một số nhận xét vào mã sẽ làm rõ mọi thứ. Tôi cũng đã thêm một số thông tin về kết nối qua SSL. Tôi đã không nghĩ về điều này trước đó. –

+0

Mã hữu ích, nhưng nó không giải quyết được vấn đề của bạn đối phó với tên tệp duy nhất –

1

Trình lập lịch công việc của JAMS cung cấp một số lệnh ghép ngắn để làm nhiệm vụ này trở nên đơn giản. Nó có một loạt các lệnh FTP để buổi an toàn cũng như cmdlet ngày để chuyển đổi ngày tự nhiên thành các đối tượng ngày Net chẳng hạn như "Ngày cuối cùng của tháng":

JAMS Job Scheduler Cmdlets

1

Something như thế này có thể làm việc:

$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 
} 

Kiểm tra này: Powershell: compress backups and FTP transfer

Các vấn đề liên quan