LINUX的SSH下FTP到远程服务器Entering Passive Mode失败解决

LINUX 系统FTP连接远程服务器经常出现在传输文件或者发出 ls命令时候出现 “Entering Passive Mode ”然后就再也无法运作了。该工作主要是因为LINUX的SSH里 FTP连接默认使用了被动命令,而被动命令会在连接过程不断变换端口,该端口也许会被客户端也许会被服务器端的防火墙拦截了。就会造成等待或者拒绝的情况。因此在进行传输的时候不妨进行2种尝试,以找到解决方法。我的FTP服务器端设置了防火墙,SSH请求端也设置了防火墙。解决办法就是采用主动模式。

解决这个问题就是使用命令关闭掉被动模式。
ftp> passive
Passive mode off.
执行该命令会自动选择,如果已经在ON状态则转成OFF状态,如果是OFF状态则转成ON状态。

-------------------
FTP、防火墙和被动模式
  前面我们讲过,FTP协议的数据传输存在两种模式:主动模式和被动模式。这两种模式发起连接的方向截然相反,主动模式是从服务器端向客户端发起;被动模式是客户端向服务器端发起连接。但是如果服务器和客户之间存在防火墙,主动模式经常会引起一些麻烦。设想,客户位于防火墙之后,防火墙允许所有内部向外部的连接通过,但是对于外部向内部发起的连接却存在很多限制。在这种情况下,客户可以正常地和服务器建立控制连接,而如果使用主动模式,ls、put和get等数据传输命令就很难成功运行,因为防火墙会阻塞从服务器向客户发起的数据传输连接。简单包过滤防火墙把控制连接和数据传输连接完全分离开了,因此很难通过配置防火墙允许主动模式的FTP数据传输连接通过。如果防火墙允许ICMP或者TCP RST报文通过,客户程序就会马上返回connection refused错误信息;而如果防火墙只是做简单的丢弃处理,会造成客户程序挂起一段时间。

  被动模式一般可以解决此类问题,因为在被动模式下,连接是由客户端发起的饿。不过,这要看FTP服务器和客户程序是否支持被动模式。命令行FTP客户程序一般使用passive命令关/开被动模式。例如:

  ftp>passive

  Passive mode off

  ftp>passive

  Passive mode on

  如果客户程序不支持被动模式,它就会返回?Invaild command;如果客户程序支持被动模式,而服务器不支持,就会返回"PASV:command not understood",PASV是一个FTP协议命令,使服务器进入到被动模式。
-----------------------
因此如果服务器FTP一段时间正常后,突然不能连接,则可以通过以上设置后调整。或者出现无法连接进行文本传输、列表等。可以尝试切换看看


展开阅读全文

ASP.NET 上传文件到FTP. 程序报错.看详细提示说.227 Entering Passive Mode (222,73,44,133,9,43)

11-20

using System;rnusing System.Collections.Generic;rnusing System.Text;rnusing System.Net;rnusing System.IO;rnrnnamespace Miracle.Utilityrnrn public class FtpUpDownrn rn public string ftpServerIP get; set;rn public string ftpUserID get; set; rn public string ftpPassword get; set; rn public FtpWebRequest reqFTP get; set; rnrn public FtpUpDown(string ftpServerIP, string ftpUserID, string ftpPassword)rn rn this.ftpServerIP = ftpServerIP;rn this.ftpUserID = ftpUserID;rn this.ftpPassword = ftpPassword;rn rnrn /// rn /// 建立ftp联接rn /// rn /// rn private void Connect(String path)//连接ftprn rn // 根据uri创建FtpWebRequest对象rn reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(path));rn // 指定数据传输类型rn reqFTP.UseBinary = true;rn // ftp用户名和密码rn reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);rn rnrn /// rn /// 从ftp服务器上载文件的功能rn /// rn /// rn public void Upload(string filename) rn rn FileInfo fileInf = new FileInfo(filename);rn string uri = "ftp://" + ftpServerIP + "/" + fileInf.Name;rn Connect(uri);//连接 rn // 默认为true,连接不会被关闭rn // 在一个命令之后被执行rn reqFTP.KeepAlive = false;rn // 指定执行什么命令rn reqFTP.Method = WebRequestMethods.Ftp.UploadFile;rn // 上传文件时通知服务器文件的大小rn reqFTP.ContentLength = fileInf.Length;rn // 缓冲大小设置为kb rn int buffLength = 2048;rn byte[] buff = new byte[buffLength];rn int contentLen;rn // 打开一个文件流(System.IO.FileStream) 去读上传的文件rn FileStream fs = fileInf.OpenRead();rn tryrn rn // 把上传的文件写入流rn Stream strm = reqFTP.GetRequestStream();rn // 每次读文件流的kbrn contentLen = fs.Read(buff, 0, buffLength);rn // 流内容没有结束rn while (contentLen != 0)rn rn // 把内容从file stream 写入upload stream rn strm.Write(buff, 0, contentLen);rn contentLen = fs.Read(buff, 0, buffLength);rn rn // 关闭两个流rn strm.Close();rn fs.Close();rn rn catch (Exception ex)rn rn //MessageBox.Show(ex.Message, "Upload Error");rn rn rnrn rnrn /// rn /// 上传文件到FTPrn /// rn /// 本地待上传的文件rn /// 上传到FTP中的相对根目录的路径rn /// 文件在FTP上的文件名rn /// 是否成功上传rn public bool fileUpload(FileInfo localFile, string ftpPath, string ftpFileName)rn rn bool success = false;rn FtpWebRequest ftpWebRequest = null;rn FileStream localFileStream = null;rn Stream requestStream = null;rn tryrn rn //string uri = "ftp://" + ftpServerIP + "/" + ftpFileName;rn string uri = "ftp://" + ftpServerIP + "/" + ftpPath + ftpFileName;rn ftpWebRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));rn ftpWebRequest.Credentials = new NetworkCredential(ftpUserID, ftpPassword);rn ftpWebRequest.UseBinary = true;rn ftpWebRequest.KeepAlive = false;rn ftpWebRequest.Method = WebRequestMethods.Ftp.UploadFile;rn ftpWebRequest.ContentLength = localFile.Length;rn int buffLength = 2048;rn byte[] buff = new byte[buffLength];rn int contentLen;rn localFileStream = localFile.OpenRead();rn requestStream = ftpWebRequest.GetRequestStream();rn contentLen = localFileStream.Read(buff, 0, buffLength);rn while (contentLen != 0)rn rn requestStream.Write(buff, 0, contentLen);rn contentLen = localFileStream.Read(buff, 0, buffLength);rn rn success = true;rn rn catch (Exception ex)rn rn string a =ex.Message;rn success = false;rn rn finallyrn rn if (requestStream != null)rn rn requestStream.Close();rn rn if (localFileStream != null)rn rn localFileStream.Close();rn rn rn return success;rn rnrn /// rn /// 上传文件到FTPrn /// rn /// 本地待上传文件的完全地址rn /// 上传到FTP中的相对根目录的路径rn /// 上传到FTP上的文件名,包括文件的扩展名rn /// 是否成功上传rn public bool fileUpload(string localPath, string ftpPath, string ftpFileName)rn rn bool success = false;rn tryrn rn FileInfo localFile = new FileInfo(localPath);rn if (localFile.Exists)rn rn success = fileUpload(localFile, ftpPath, ftpFileName);rn rn elsern rn success = false;rn rn rn catch (Exception)rn rn success = false;rn rn return success;rn rnrn rnrn 报错:rn[System.Net.Sockets.SocketException] = "由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。 222.73.44.133:2816" rnrn求各位大虾帮忙. 本人qq 308005405 可以联系我.谢谢. 论坛

没有更多推荐了,返回首页