首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用SSH.NET上传到SFTP服务器的SftpPathNotFoundException失败:“系统找不到指定的路径。”

使用SSH.NET上传到SFTP服务器的SftpPathNotFoundException失败:“系统找不到指定的路径。”
EN

Stack Overflow用户
提问于 2017-09-20 15:21:21
回答 1查看 7K关注 0票数 2

我正在使用Renci SSH.NET在SFTP上上传一个文件。

连接:

  • 连接到sFTP站点,使用SSH.NET似乎有效:SftpClientIsConnected返回true。
  • 然而,使用FileZilla连接FileZilla会触发此警告: 服务器的主机密钥未知

上传:

1)使用SftpClientUploadFile方法:

代码语言:javascript
运行
复制
    client.UploadFile(fileStream, "/Path/" + fileName, null);

...I获得一个Renci.SshNet.Common.SftpPathNotFoundException:“系统找不到指定的路径。”

  • 我试过对路径进行硬编码--同样的结果。
  • 我试过使用SftpClientWorkingDirectory --但这转换成了一串看上去像中文的字符,而且也不起作用。

2)采用SftpClientBeginUploadFile方法:

代码语言:javascript
运行
复制
    client.BeginUploadFile(fileStream, "/Path/" + fileName, asyncCallback, null, UpdateUploadProgress);

...I没有错误/异常,但是:

  • 文件没有上传
  • aSyncCallbackuploadCallback似乎不起作用

3)使用FileZilla,我可以上传得很好(使用与上面完全相同的目标路径:"/ path /Filename.txt")

我的代码:

代码语言:javascript
运行
复制
    var connectionInfo = new ConnectionInfo(IpAddress,
                        Port,
                        UserName,
                        new PasswordAuthenticationMethod(UserName, Password),
                        new PrivateKeyAuthenticationMethod("rsa.key"));
            connectionInfo.Encoding = Encoding.Unicode;
            using (var client = new SftpClient(connectionInfo))
            {
                client.Connect();

                if (client.IsConnected)
                {
                    Console.WriteLine("SSH-client is connected");
                }
                var fileStream = new FileStream(FileMaker.GetFullyQualifiedPath(), FileMode.Open);
                client.BufferSize = 4 * 1024;
                string fileName = new FileMaker().GetFileName();
                //client.UploadFile(fileStream, "/Path/" + fileName, null);
                AsyncCallback asyncCallback = new AsyncCallback(NotifyUploadComplete);
                client.BeginUploadFile(fileStream, "/Path/" + fileName, asyncCallback, null, UpdateUploadProgress);
                client.Disconnect();
            }

回调处理程序:

代码语言:javascript
运行
复制
    private void UpdateUploadProgress(ulong uploaded)
    {
        MainViewModel mainViewModel = (MainViewModel)System.Windows.Application.Current.FindResource("mainViewModel");
        mainViewModel.UploadProgress = uploaded;
    }

    private void NotifyUploadComplete(IAsyncResult result)
    {
        MessageBox.Show("File uploaded.", "File uploaded");
    }

UPDATE:我做了一个最小的例子并测试了它(相同的结果)。

使用UploadFile:

代码语言:javascript
运行
复制
var connectionInfo = new ConnectionInfo(IpAddress,
            Port,
            UserName,
            new PasswordAuthenticationMethod(UserName, Password),
            new PrivateKeyAuthenticationMethod("rsa.key"));
connectionInfo.Encoding = Encoding.Unicode;
using (var client = new SftpClient(connectionInfo))
{
    client.Connect();

    if (client.IsConnected)
    {
        Console.WriteLine("SSH-client is connected");
    }
    var fileStream = new FileStream(@"C:\File.txt", FileMode.Open);
    client.BufferSize = 4 * 1024;
    client.UploadFile(fileStream, "/SSHUsersPath/File.txt", null);
    //AsyncCallback asyncCallback = new AsyncCallback(NotifyUploadComplete);
    //client.BeginUploadFile(fileStream, "/SSHUsersPath/File.txt", asyncCallback, null, UpdateUploadProgress);
    client.Disconnect();
}

下面是请求的FileZilla日志文件的摘录:

2017-09-21 10:08:36 11252 1状态:连接到sshserv.CENSORED.com 2017-09-21 10:08:36 11252命令: pwd 2017-09-21 10:08:36 11252 1响应:当前目录是:" /SSHUsersPath“2017-09-21 10:08:36 11252 1命令: ls 2017-09-21 10:08:37 11252 12017年-09-21 10:08:58 11252 3回应: fzSftp启动protocol_version=8 2017-09-21 10:08:58 11252 3命令:打开"CENSORED@sshserv.CENSORED.com“22 2017-09-21 10:59 11252 3命令:信任新主机:1 2017-09-21 10:00 11252 3命令:通行证:* 2017- 21 10:00 11252 3状态:连接到sshserv.CENSORED.com 2017-09-21 10:00 11252 3状态:开始上传C:\File.txt 2017-09-21 10:09:00 11252 3命令: cd "/SSHUsersPath“2017-09-21 10:01 11252 3响应:新目录是:"/SSHUsersPath”2017-09-21 10:01 11252 3命令:放置"C:\File.txt“C:\File.txt "File.txt”2017-09-21 10:01 11252 3命令: local:C:\File.txt => remote:/SSHUsersPath/File.txt 2017-09-21 10:01 11252 3状态:文件传输成功,传输4个字节在1秒,2017-09-21 10:09:01 11252 3状态:检索目录列表的“/SSHUsersPath”.命令: ls 2017-09-21 10:01 11252 3状态:列表目录/SSHUsersPath 2017-09-21 10:09:02 11252 3

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-21 12:58:28

主要问题是:

代码语言:javascript
运行
复制
connectionInfo.Encoding = Encoding.Unicode;

Encoding.Unicode是UTF-16.任何SFTP服务器都不会处理UTF-16编码的文件名.SFTP服务器应该使用UTF-8.因此,SSH.NET默认为Encoding.UTF8。如果使用UTF-8,服务器会损坏文件名中的非ascii字符( .Encoding是关于文件名,而不是文件内容),这肯定是因为SFTP被破坏了,并且使用了一些遗留编码。但可以肯定的是,不是UTF-16。它是一些ISO*编码或Windows-*编码。

另一个问题是,当您使用BeginUploadFile时,您不会等待它完成并立即断开连接。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46325986

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档