2008-11-05 2 views
26

Я хотел бы автоматизировать FTP-загрузку файла резервной копии базы данных с помощью PowerShell. Имя файла включает дату, поэтому я не могу запускать один и тот же FTP-скрипт каждый день. Есть ли чистый способ сделать это, встроенный в PowerShell, или с помощью .Net framework?Каков наилучший способ автоматизации безопасного FTP в PowerShell?

ОБНОВЛЕНИЕ Я забыл упомянуть, что это безопасная FTP-сессия.

ответ

1

Это не так просто, как хотелось бы. Есть три варианта, о которых я знаю.

1) .Net. Вы можете использовать инфраструктуру .Net для этого в PS, но это связано с грубой обработкой сокета, которую я бы не хотел делать в скрипте. Если бы я шел по этому маршруту, я бы завернул весь мусор ftp в DLL на C#, а затем использовал эту DLL из powershell.

2) Манипулирование файлом - Если вам известен шаблон имени файла, который вам нужно получить каждый день, вы можете просто открыть свой ftp-скрипт с помощью PS и изменить имя файла в скрипте. Затем запустите скрипт.

3) Текст трубы на FTP - последний вариант - использовать powershell для передачи информации в и из вашей FTP-сессии. См. here.

7

Взятые из 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) 

Работы для меня

+0

это действует четвёртый вариант, который я должен был подумать о. Если вы будете знать имя файла раньше времени, то это, безусловно, хорошее решение, и вы должны принять его в качестве ответа. – EBGreen 2008-11-05 15:31:13

0

Я успешно использовал библиотеку Indy проекта .NET делать FTP. И ... тьфу, похоже, что размещенная .NET-сборка больше не доступна.

0

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

$ Путь = "D: \ samplefolderstructure \ имя_файла" + $ realdate + ".msi"

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

ftp.txt - это то, как мы храним всю информацию о нашем подключении на ftp-сервере. ftps - это клиент, которого мы используем, очевидно, поэтому, возможно, придется изменить несколько вещей. Но это должно помочь вам в этом.

4

Что касается PowerShell, в/n Software NetCmdlets пакет включает в себя FTP-командлеты (включая поддержку как для защищенных типов FTP), которые вы могли бы использовать довольно легко для этого.

24

После некоторых экспериментов я разработал этот способ для автоматизации безопасной загрузки FTP в PowerShell. Этот скрипт запускается с public test FTP server, администрируемого Chilkat Software. Таким образом, вы можете скопировать и вставить этот код, и он будет работать без изменений.

$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 Code Repository есть страница, для которой есть фрагмент кода. Первые 28 строк наиболее важны для загрузки файла.

+1

+1 для поиска и публикации кода. Однако было бы замечательно увидеть некоторые комментарии в коде. Безопасно ли я предполагаю, что вы имеете в виду, что пользователь/пропуск предоставляется, а не обязательно SFTP? – 2008-11-06 15:48:33

1

Планировщик заданий JAMS предлагает несколько командлетов, которые упростили бы эту задачу. Он имеет множество FTP командлетов для защищенных сессий, а также даты командлетов для преобразования природных даты в объекты .NET даты, такие как «последний день месяца»:

JAMS Job Scheduler Cmdlets

1

Нечто подобное мог бы работать:

$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: compress backups and FTP transfer

Смежные вопросы