Ftp

Powershell FTP 腳本錯誤:遠端伺服器返回錯誤:227 進入被動模式

  • March 29, 2011

我遇到了 Powershell FTP 腳本問題。我已經把頭髮拉到這個上面了。

我最近為我的軟體項目設置了一個“自動建構伺服器”。所有軟體項目都被建構並捆綁到一個 zip 文件中。理論上,這個 zip 文件將通過 FTP 下載到幾個不同的伺服器。我正在嘗試建構一個 powershell 腳本,它將下載我的包並將其解壓縮到所需的目錄中。

我遇到問題的部分是通過 FTP 下載文件。我可以通過 DOS 命令視窗手動登錄 FTP 來訪問源文件。我可以很好地下載文件,所以我知道這不是防火牆問題。至少我認為不是。

每當 powershell 開始下載源 .zip 文件時,它就會掛起。我可以看到該文件出現在硬碟驅動器上,但是當腳本失敗時消失了。它永遠不會從 FTP 伺服器獲取任何字節。然後我收到此錯誤:

Powershell FTP 腳本錯誤:遠端伺服器返回錯誤:227 Entering Passive Mode (10,255,130,77,231,5) Blockquote

這是我的腳本:

#create destination directory (this is where the build files will be dropped)
[IO.Directory]::CreateDirectory("C:\tempftp")

"Creating staging folder..."
#create staging folder for deployment package bundle unzip
[IO.Directory]::CreateDirectory("C:\FINALDEPLOYMENTFOLDER")

#create destination and source paths for FTP copy command
$File = "C:\tempftp\MyPackageT.zip"
$ftp = "ftp://AdminiUser:adm1n1pwd@255.255.255.255/MyPackage.zip"

"ftp url: $ftp"

$webclient = New-Object System.Net.WebClient
$uri = New-Object System.Uri($ftp)

"Downloading $File..."

#perform the actual data transfer via FTP
$webclient.DownloadFile($ftp, $File)

"Unzip build package..."
#unzip the file that was transferred via FTP
$shell_app=new-object -com shell.application 
$zip_file = $shell_app.namespace("C:\tempftp\MyPackage.zip")         #source
$destination = $shell_app.namespace("C:\FINALDEPLOYMENTFOLDER")       #final destination

#unzip to destination folder
foreach ($item in $zip_file.Items())
{
$destination.CopyHere($item, 16)
}

我可以在我的建構伺服器上本地執行此腳本,並且執行良好。我知道這個腳本有效。我的問題是,為什麼這個腳本在我的非建構伺服器上會出錯?為什麼被動模式在這種情況下會出現這樣的問題,我該如何解決?我嘗試了 FTP IPv4 地址規則、FTP 防火牆支持更改等,但沒有成功。

值得注意的是,我確實在 IIS7 的 FTP 防火牆支持部分看到了一條警告消息。它指出:

要在使用 FTP over SSL (FTPS) 或防火牆不過濾數據包時接受被動連接,請配置防火牆的外部 IPv4 地址。

^ 我不確定這到底意味著什麼,但我會試一試。任何想法為什麼被動模式讓我的脖子如此痛苦?我不應該使用 WebClient 嗎?我真的很想避免下載另一個程序/更新檔來完成這項工作。我寧願在本機 Powershell 中工作……所以不,我不能使用 FTP 客戶端庫!

**** 編輯:我可以通過在我的防火牆上打開“所有埠”來解決這個問題,但這似乎有點可怕。有關跟踪需要哪些埠以使此被動模式錯誤消失的任何建議?我已經有了一個規則,允許一些我認為 FTP 正在使用的特定埠….但是我怎樣才能看到我需要啟用哪些埠?**

當您從命令提示符連接到 FTP 站點時,您使用的是活動 FTP(只有一個可用),這在防火牆方面更加可預測。當您使用 連接時System.Net.WebClient,您正在使用 PASV 連接,它從預定義的可用範圍中獲取一個隨機埠。這些請求在您的防火牆處停止。如果您必須堅持使用 PASV,您也可以嘗試打開防火牆上的埠範圍。否則,您需要弄清楚如何指定使用活動的 FTP 連接。這不能使用System.Net.WebClient.

看看System.Net.FtpWebRequest,它可能會做你想做的事。我看到有一個UsePassive屬性。

引用自:https://serverfault.com/questions/253242