2016-05-19 14 views
1

私は現在、SFTPを使用してRenci SSH.NETを使用してUnixサーバーにファイルをコピーしようとしています。さらに、コピーしたファイルへのシンボリックリンクを作成したいと思います。これは私のコードがどのように見えるか、基本的には、変数sftpSftpClientの作業インスタンスであることに注意してください。Renci SSH.NET:シンボリックリンクを作成できますが、シンボリックリンクを削除できないのはなぜですか?

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! 

質問です:どのように私は正しくシンボリックリンクを削除しますか?ご注意:参照先フォルダ自体ではなく、Test001というフォルダへのリンクを削除したいだけです。なぜこれは機能しませんか? SSH.NETは残念なことに意味のある例外をスローしません。私が得る唯一のテキストは「失敗」です。これは内部的に「要求」メカニズムを使って動作するため、問題の正確な原因をデバッグできません。

私は例外を見てみると、私は見つける:SSH.NETがリンクされたフォルダを削除しようとしているよう Data: {System.Collections.ListDictionaryInternal}

ので、明らかに、それが見えます。私が望むのは、シンボリックリンク自体を削除することです。

答えて

1

実際、SftpClient.Delete(およびSftpClient.DeleteFile)の方法では、シンボリックリンクを削除できません。最初に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クラスに追加します。また、リンクの削除をサポートするようにSSH.NET projectにリクエストを提出してください。

+1

ここではファイルの削除が含まれているので、ハックに対してアドバイスをして、通常のsshコマンド(同じライブラリを使って、sftpではなく)でリンクを削除してください。 – Evk

+1

これはハックです.1)SFTPシェルは同じファイルシステム/パス構文を使用します。例えば、一方はchrootされ、もう一方はchrootされます。 2)あなたはシェルへのアクセスが全くないという保証はありません。 3)SFTPはすべてのシステムで同じように動作しますが、異なるシステムでは異なるシェル/コマンドが使用されます(システムは* nixシステムではないかもしれません。 –

+0

はい、あなたは正しいです、それは確かにあまり良くありません。 – Evk

関連する問題