这是我的代码,用于连接文件并将文件发送到远程SFTP服务器。
public static void SendDocument(string fileName, string host, string remoteFile, string user, string password)
{
Scp scp = new Scp();
scp.OnConnecting += new FileTansferEvent(scp_OnConnecting);
scp.OnStart += new FileTansferEvent(scp_OnProgress);
scp.OnEnd += new FileTansferEvent(scp_OnEnd);
scp.OnProgress += new FileTansferEvent(scp_OnProgress);
try
{
scp.To(fileName, host, remoteFile, user, password);
}
catch (Exception e)
{
throw e;
}
}
我可以使用CoreFTP成功连接,发送和接收文件。因此,问题不在于服务器。当我运行上面的代码时,进程似乎停在scp.To方法。它只是无限期地挂起。
任何人都知道我的问题可能是什么?也许它与将密钥添加到SSH缓存有关?如果是这样,我将如何解决这个问题?
编辑:我使用wireshark检查了数据包,发现我的计算机没有执行Diffie-Hellman Key Exchange Init。这一定是问题所在。
编辑:我最终使用了以下代码。请注意,StrictHostKeyChecking已关闭以简化操作。
JSch jsch = new JSch();
jsch.setKnownHosts(host);
Session session = jsch.getSession(user, host, 22);
session.setPassword(password);
System.Collections.Hashtable hashConfig = new System.Collections.Hashtable();
hashConfig.Add("StrictHostKeyChecking", "no");
session.setConfig(hashConfig);
try
{
session.connect();
Channel channel = session.openChannel("sftp");
channel.connect();
ChannelSftp c = (ChannelSftp)channel;
c.put(fileName, remoteFile);
c.exit();
}
catch (Exception e)
{
throw e;
}
感谢。
答案 0 :(得分:6)
我使用Tamir.SharpSSH - 最新版本1.1.1.13
这有一个SFTP类。您可以直接使用此类来执行SFTP,而不是使用JSch,Session类。
此处快速示例:
127.0.0.1 - 服务器IP
/ SFTPFolder1 / SFTPFolder2 - 服务器位置我希望我的文件去哪里
Sftp sftpClient = new Sftp("127.0.0.1", "myuserName", "MyPassword");
sftpClient.Connect();
sftpClient.Put(@"C:\Local\LocalFile.txt", "/SFTPFolder1/SFTPFolder2");
如果您有任何问题,请告诉我。
答案 1 :(得分:1)
如果不查看日志文件,很难说出问题所在。
但请记住,SCP不是SFTP - 它们是通过SSH运行的完全不同的协议。您的SFTP可能实际上不支持SCP - 并非所有SFTP服务器都支持SCP。 CoreFTP可能正在使用SFTP。
我们的商业软件包edtFTPnet/PRO也可能值得尝试,只是作为尝试让不同的客户端针对您的服务器工作的替代方案。