c# - Renci SSH.NET : can create symlink, 但删除符号链接(symbolic link)失败,为什么?

标签 c# .net ssh sftp ssh.net

我目前正在尝试使用 Renci SSH.NET 将文件复制到使用 SFTP 的 Unix 服务器,此外,我想创建一个指向已复制文件的符号链接(symbolic link)。这基本上是我的代码的样子,注意变量 sftpSftpClient 的工作实例:

string symlinkSource = @"/msyerver/SymSource/Test001"; //source to link to, exists
string newPath = @"/msyerver/somedirectory/Test001"; //place where the symlink should be created
sftp.SymbolicLink(symlinkSource, newPath); //link newPath to symlinkSource, works!
sftp.Delete(newPath); //fails with exception!

问题是:如何正确删除符号链接(symbolic link)?请注意:我只想删除指向文件夹 Test001 的链接,而不是引用的文件夹本身。为什么这不起作用?不幸的是,SSH.NET 没有抛出有意义的异常,我得到的唯一文本是“失败”,并且由于这在内部通过一些“请求”机制起作用,所以我无法调试问题的确切来源。

当我查看异常时,我发现:Data: {System.Collections.ListDictionaryInternal}
很明显,看起来 SSH.NET 正在尝试删除链接的文件夹。我想要的是删除符号链接(symbolic link)本身,而不是后面的文件夹。

最佳答案

确实,SftpClient.Delete 的方式(和 SftpClient.DeleteFile )已实现,它们无法删除符号链接(symbolic link)。他们首先调用SftpSession.GetCanonicalPath与路径,什么解决了链接。因此,您实际上是在尝试删除链接目标而不是链接本身,由于某种原因失败了。

无法使用 SSH.NET API 删除链接本身。

虽然通过一些反射黑客你可以绕过 SftpSession.GetCanonicalPath称呼:

public static class SftpClientExtensions
{
    public static void DeleteLink(this SftpClient client, string path)
    {
        Type sftpClientType = client.GetType();
        FieldInfo sftpSessionField = sftpClientType.GetField("_sftpSession", BindingFlags.NonPublic | BindingFlags.Instance);
        object sftpSession = sftpSessionField.GetValue(client);
        Type sftpSessionType = sftpSession.GetType();
        MethodInfo requestRemoveMethod = sftpSessionType.GetMethod("RequestRemove", BindingFlags.NonPublic | BindingFlags.Instance);
        requestRemoveMethod.Invoke(sftpSession, new object[] { path });
    }
}

使用上述扩展方法,您现在可以使用:
sftp.DeleteLink(newPath);

更好的办法是获取 SSH.NET 源代码的副本并将方法直接添加到 SftpClient类(class)。并向 SSH.NET project 提出请求支持删除链接。

关于c# - Renci SSH.NET : can create symlink, 但删除符号链接(symbolic link)失败,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37314258/

相关文章:

c# - 二维程序世界生成的动态多维数组

c# - 与 QuickBooks 成功连接的最佳 Dot.Net 电子商务开源

c# - 强类型数据绑定(bind)和泛型?

c# - WPF:ContentPresenter 上的 TextTrimming

linux - 如何将图像转换为低宽度 200

c# - 具有混合类型的 TreeView HierarchicalDataTemplate

c# - 二维数组,程序崩溃

.net - 在 Fsharp 中将 XML 文件转换为 CSV 文件

ubuntu - 使用 EC2 VPC 实例的新主机名动态更新主机文件

linux - ConEmu 和 linux 的 screen