我使用的是Coldfusion9,我已经验证了sFTP主机是有效的,我可以使用"CyberDuck“连接。端口不是标准的21 (ftp)或22 (ssh)。
<cfftp
username= "myysername"
password= "mypassword"
port= "6589"
server= "ftphost.com"
secure= "yes"
name= "ftpconnection"
action= "open" />
<cfdump var="#ftpconnection#">结果,大约1分钟后:
com.jcraft.jsch.JSchException: Session.connect: java.net.SocketTimeoutException: Read timed out
at com.jcraft.jsch.Session.connect(Unknown Source)
at com.jcraft.jsch.Session.connect(Unknown Source)
at coldfusion.tagext.net.SftpHandler.getConnection(SftpHandler.java:265)
at coldfusion.tagext.net.SftpHandler.createConnection(SftpHandler.java:76)
at coldfusion.tagext.net.FtpTag.doStartTag(FtpTag.java:675)
at coldfusion.runtime.CfJspPage._emptyTcfTag(CfJspPage.java:2722)我还尝试通过手动调用JSCH类( http://www.jcraft.com/jsch/examples/Sftp.java.html )来构建这个连接,但没有成功。
问题是,为什么在代码中超时,而不是在使用像CyberDuck这样的程序时呢?
编辑以添加CF代码
jsch = CreateObject("java", "com.jcraft.jsch.JSch");
jsession = CreateObject("java", "com.jcraft.jsch.Session");
jChannel = CreateObject("java", "com.jcraft.jsch.Channel");
jChannelSFTP = CreateObject("java", "com.jcraft.jsch.ChannelSftp");
jUserInfo = CreateObject("java", "com.jcraft.jsch.UserInfo");
jProperties = CreateObject("java", "java.util.Properties");
jLogger = CreateObject("java", "com.jcraft.jsch.Logger");
host = "ftphost.com";
username = "myusername";
portNumber = "6589";
javaCast("String", "host");
javaCast("String", "username");
/* *********************** */
jProperties.put("StrictHostKeyChecking", "no");
jsession = jsch.getSession(username, host, portNumber);
jsession.setPassword("mypassword");
jsession.setPort(6589);
jsession.setUserInfo(jUserInfo);
jsession.setConfig(jProperties);
writeOutput("Connect ...");
getPageContext().getOut().flush();
jsession.connect();
writeOutput("done <br>");这段代码本身并没有错误,但是connect()方法从未“返回”:
connection is closed by foreign host
The error occurred in /Library/WebServer/Coldfusion/SFTP/index.cfm: line 53
51 : writeOutput("Connect ...");
52 : getPageContext().getOut().flush();
53 : jsession.connect();
54 : writeOutput("done <br>");
55 : 编辑以显示CYBERDUCK连接日志
220 Service ready for new user.
AUTH TLS
234 Command AUTH okay; starting TLS connection.
USER myusername
331 User name okay, need password for myusername.
PASS ********
230 User logged in, proceed.
PBSZ 0
200 Command PBSZ okay.
PROT P
200 Command PROT okay.
FEAT
[ ... ]
OPTS UTF8 ON
200 Command OPTS okay.
NOOP
200 Command NOOP okay.
SYST
215 UNIX Type: Apache FtpServer
STAT /root
200--rw------- 1 SMG TGMS 263375 Nov 25 01:35 afile.txt发布于 2015-04-24 11:55:02
我也有类似的问题,根本原因是ColdFusion服务没有以本地用户的身份运行。如果您在控制台模式下运行CF,您将看到FTP站点正在等待用户接受身份验证。在CF方面,它只是超时。
为了解决这个问题,我在cfftp标记之前添加了这2行代码。
<cfset _jsch = CreateObject('java','com.jcraft.jsch.JSch')>
<cfset _jsch.setConfig("PreferredAuthentications", "publickey,keyboard-interactive,password")>发布于 2012-12-01 13:53:17
您是否尝试更改cfhttp的超时值。您可以通过使用<cfhttp timeout="240">并以秒为单位来更改默认超时。
https://stackoverflow.com/questions/13574641
复制相似问题