【发布时间】:2013-01-20 10:04:13
【问题描述】:
我正在使用以下脚本文件 (ftp_test_2.ps1) 将文件传输到 ftp 服务器:
#we specify the directory where all files that we want to upload are contained
$Dir="C:/Users/you-who/Documents/textfiles/"
#ftp server
$ftp = "ftp://192.168.100.101:21/"
$user = "aP_RDB"
$pass = "pw"
$webclient = New-Object System.Net.WebClient
$webclient.Credentials = New-Object System.Net.NetworkCredential($user,$pass)
#list every txt file
foreach($item in (dir $Dir "*.txt"))
{
"creating URI..."
$uri = New-Object System.Uri($ftp+$item.Name)
$uri
"attempting upload... $item"
$webclient.UploadFile($uri, $item.FullName)
}
当 $ftp 设置为本地主机并连接到另一个 ftp 测试服务器时,这可以正常工作。但是,在生产 ftp 服务器上,服务器拒绝上传并出现 Powershell 错误:
Exception calling "UploadFile" with "2" argument(s): "The remote server returned an error: 227 Entering Passive Mode (192,168,101,99,228,67)."
At C:\Users\you-who\Documents\SandBox\ftp_test_2.ps1:17 char:24
\+$webclient.UploadFile <<<< ($uri, $item.FullName)
\+CategoryInfo : NotSpecified: (:) [], MethodInvocationException
\+ FullyQualifiedErrorId : DotNetMethodExceptionPP
在生产服务器上有一个 FileZilla 服务器正在运行。服务器 UI 中的消息“似乎”没有显示任何错误:
(000029)2/5/2013 5:58:53 AM - (not logged in) (192.168.100.101)> USER aP_RDB
(000029)2/5/2013 5:58:53 AM - (not logged in) (192.168.100.101)> 331 Password required for ap_rdb
(000029)2/5/2013 5:58:53 AM - (not logged in) (192.168.100.101)> PASS *******
(000029)2/5/2013 5:58:53 AM - ap_rdb (192.168.100.101)> 230 Logged on
(000029)2/5/2013 5:58:53 AM - ap_rdb (192.168.100.101)> OPTS utf8 on
(000029)2/5/2013 5:58:53 AM - ap_rdb (192.168.100.101)> 200 UTF8 mode enabled
(000029)2/5/2013 5:58:53 AM - ap_rdb (192.168.100.101)> PWD
(000029)2/5/2013 5:58:53 AM - ap_rdb (192.168.100.101)> 257 "/" is current directory.
(000029)2/5/2013 5:58:53 AM - ap_rdb (192.168.100.101)> CWD /
(000029)2/5/2013 5:58:53 AM - ap_rdb (192.168.100.101)> 250 CWD successful. "/" is current directory.
(000029)2/5/2013 5:58:53 AM - ap_rdb (192.168.100.101)> TYPE I
(000029)2/5/2013 5:58:53 AM - ap_rdb (192.168.100.101)> 200 Type set to I
(000029)2/5/2013 5:58:53 AM - ap_rdb (192.168.100.101)> PASV
(000029)2/5/2013 5:58:53 AM - ap_rdb (192.168.100.101)> 227 Entering Passive Mode (192,168,101,99,228,74)
(000029)2/5/2013 5:59:14 AM - ap_rdb (192.168.100.101)> disconnected.
从我笔记本电脑上的 FileZilla ftp 客户端,我可以在生产 ftp 服务器上连接和放置/获取文件如果我将“传输模式”设置为“活动”(在 FileZilla 客户端中)用于连接到生产 ftp 服务器。
由于我无法更改生产服务器,有没有办法在我上面的脚本中某处的 Powershell 中将传输模式设置为“活动”?我搜索了 web 和 MS 站点以寻求有关此方面的帮助,但在 .非常感谢任何帮助。
-戴夫·埃夫
【问题讨论】:
-
使用 System.Net.FtpWebRequest ?见serverfault.com/a/253255/102464
-
您可以在此处查看 ftp 客户端 powershell 模块:gallery.technet.microsoft.com/scriptcenter/… 设置连接时默认为活动模式,并且易于使用
-
@Goyuix 虽然此问题的答案包含在您链接的答案中,但我不会将其称为完全相同的副本,因为此问题专门询问如何使 FTP 连接处于活动状态与被动相反,而另一个只是询问如何使用 FTP 上传文件。
-
@SpellingD 感谢您的参与;我希望其他人可以从问题和回答中受益
-
@Goyuix 感谢您的链接;看来 FtpWebRequest 方法确实提供了更健壮的连接方法。事实证明,生产服务器的管理员确实了解了这个问题,并且不希望需要活动连接。他改变了对 ftp 服务器设置和防火墙设置的更改,为 ftp 连接开放了一个狭窄范围的端口,并在这些端口上启用了被动连接。
标签: powershell ftp