C# 将SshClient转换为SftpClient

C# 将SshClient转换为SftpClient,c#,ssh,C#,Ssh,我用它在我的ubuntu服务器上安全地发送文件和执行命令 总之,我经常需要发送文件和执行命令。所以我现在要做的是: using (Renci.SshNet.SshClient client1 = new Renci.SshNet.SshClient("someDomain.com", 22, "root", new PrivateKeyFile(@"C:\Path\To\PrivateKey\id_rsa"))) { // connect client1.Connect();

我用它在我的ubuntu服务器上安全地发送文件和执行命令

总之,我经常需要发送文件和执行命令。所以我现在要做的是:

using (Renci.SshNet.SshClient client1 = new Renci.SshNet.SshClient("someDomain.com", 22, "root", new PrivateKeyFile(@"C:\Path\To\PrivateKey\id_rsa")))
{
    // connect
    client1.Connect();

    // execute a command
    var c = client1.RunCommand("echo 'hello world' > /root/test.txt");

    // create a second connection in order to download a file 
    SftpClient client_2 = new SftpClient(client1.ConnectionInfo);
    client_2.Connect();

    using (FileStream fs = new FileStream("output.txt", FileMode.OpenOrCreate))
             client_2.DownloadFile("/root/test.txt", fs);
}
我的问题是,我可以从SshClient转换到SftpClient,这样我就不必创建两个连接吗?如果我可以这样做,那就太好了:

 SftpClient client_2 = (SftpClient)client1;
或者另一种解决方案是以base64格式传递文件。如果我这样做下载一个文件会被认为是不好的做法吗

 var fileConentInBase64 = client1.RunCommand("cat'/root/someFile' | base64");
使用相同的术语上载文件,我将执行以下操作:

 client1.RunCommand($"echo {base64ContentOfFile} | base64 -d > /path/to/file")

根据我对C#中的强制转换的了解,当您使用对象时,类必须具有共同的继承。

所以,如果SFTPlient从BaseClient继承,您可能可以通过某种方式来实现正如你在帖子评论中所说的,正是因为这个原因,实际上不可能做到这一点 对不起,我把医生的电话打得有点快了


也许我遗漏了什么,但你不能用SSH做所有的事情吗

虽然它们都是从
BaseClient
派生的,但它们不是从彼此派生的,因此强制转换似乎会导致编译器错误(我假设您在尝试键入上述代码时发现了这一点)。我希望能够异步删除一个文件。这不是Renci.SshNet本机支持的。如果我能够在SFtp连接中构造SshCommand对象,我可以自己实现它。当然,我可以通过SshClient做任何事情,但这似乎有些过分。如何使用Renci.SshNet.SshClient(ssh客户端)上传文件?也许这就是解决方案,但我认为这是不可能的,因为它在c#和windows上运行。因此,它存在一个
ScpClient
,但我最终会遇到同样的问题。我从未用过Renci.SshNet,所以我不知道。我只是想给你一个方向看看。很可能我比你笨得多。但据我所知,你可能只是无缘无故地陷入那种境地。建立两个连接是否真的有问题?它不是最优的,但它对您的项目有很大影响吗?如果没有,我会继续做其他更重要的事情,直到一些有经验的开发人员(我不是)在这里给你一个很好的回应。我想你是对的,我将创建两个连接,然后继续。