Powershell FTP 腳本錯誤:遠端伺服器返回錯誤:227 進入被動模式
我遇到了 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
屬性。