Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net NGIT/JGIT/Git#使用私钥的SSH会话克隆Git存储库_.net_Ssh_Jgit_Gitsharp_Ngit - Fatal编程技术网

.net NGIT/JGIT/Git#使用私钥的SSH会话克隆Git存储库

.net NGIT/JGIT/Git#使用私钥的SSH会话克隆Git存储库,.net,ssh,jgit,gitsharp,ngit,.net,Ssh,Jgit,Gitsharp,Ngit,会话部分使用私钥连接,没有问题。但是,当我进行git克隆时,会出现错误“Auth Fail”。如何使用git clone包装、绑定或使连接的会话工作。我在.NET4.0下使用NGIT,但我认为这并不重要,因为JGIT几乎是一样的 有什么想法吗 谢谢,加文 JSch jsch = new JSch(); Session session = jsch.GetSession(gUser, gHost, 22); jsch.AddIdentity(Priv

会话部分使用私钥连接,没有问题。但是,当我进行git克隆时,会出现错误“Auth Fail”。如何使用git clone包装、绑定或使连接的会话工作。我在.NET4.0下使用NGIT,但我认为这并不重要,因为JGIT几乎是一样的

有什么想法吗

谢谢,加文

        JSch jsch = new JSch();
        Session session = jsch.GetSession(gUser, gHost, 22);
        jsch.AddIdentity(PrivateKeyFile); // If I leave this line out, the session fails to Auth. therefore it works.
        Hashtable table = new Hashtable();
        table["StrictHostKeyChecking"] = "no"; // this works
        session.SetConfig(table);
        session.Connect(); // the session connects.



        URIish u = new URIish();
        u.SetPort(22);
        u.SetHost(gHost);
        u.SetUser(gUser);            
        NGit.Transport.JschSession jschSession = new JschSession(session,u );

        if (session.IsConnected())
        {
            try
            {
                CloneCommand clone = Git.CloneRepository()
                    .SetURI(gitAddress)
                    .SetDirectory(folderToSave);                                        
                clone.Call();                  

             //   MessageBox.Show(Status, gitAddress, MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (Exception ex)
            {
                // AUth Fail..... ????

            }
        }
        else
        {
            session.Disconnect();

        }
        session.Disconnect();

这里的问题是会话对象在任何时候实际上都没有与CloneCommand关联。因此,您为设置会话所做的所有工作实际上都不起任何作用,因为CloneCommand将自己创建自己的会话(使用默认会话项)

clone命令将从
sshsSessionFactory
获取它实际使用的会话。首先,您需要创建一个实现
sshsSessionFactory
抽象类的类,如下所示:

public class MySSHSessionFactory : SshSessionFactory
{
    private readonly JSch j;

    public MySSHSessionFactory()
    {
        this.j = new JSch();
    }

    public void Initialize()
    {
        this.j.SetKnownHosts(@"C:/known_hosts");
        this.j.AddIdentity(@"C:\id_rsa");
    }

    public override RemoteSession GetSession(URIish uri, CredentialsProvider credentialsProvider, NGit.Util.FS fs, int tms)
    {
        var session = this.j.GetSession(uri.GetUser(), uri.GetHost());
        session.SetUserInfo(new MyUserInfo());
        session.Connect();

        return new JschSession(session, uri);
    }
}
然后,您可以将所有新Git命令设置为在需要使用会话时使用此工厂:

var sessionFactory = new MySSHSessionFactory();
sessionFactory.Initialize();
SshSessionFactory.SetInstance(sessionFactory);

// Now you can do a clone command.

请注意,我仍然在弄清楚这个库,所以我可能没有以最佳方式编写myshSessionFactory(例如,它是否处理关闭会话的容错性?)。但这至少是一个开始。

这里的问题是会话对象实际上在任何时候都没有与CloneCommand关联。因此,您为设置会话所做的所有工作实际上都不起任何作用,因为CloneCommand将自己创建自己的会话(使用默认会话项)

clone命令将从
sshsSessionFactory
获取它实际使用的会话。首先,您需要创建一个实现
sshsSessionFactory
抽象类的类,如下所示:

public class MySSHSessionFactory : SshSessionFactory
{
    private readonly JSch j;

    public MySSHSessionFactory()
    {
        this.j = new JSch();
    }

    public void Initialize()
    {
        this.j.SetKnownHosts(@"C:/known_hosts");
        this.j.AddIdentity(@"C:\id_rsa");
    }

    public override RemoteSession GetSession(URIish uri, CredentialsProvider credentialsProvider, NGit.Util.FS fs, int tms)
    {
        var session = this.j.GetSession(uri.GetUser(), uri.GetHost());
        session.SetUserInfo(new MyUserInfo());
        session.Connect();

        return new JschSession(session, uri);
    }
}
然后,您可以将所有新Git命令设置为在需要使用会话时使用此工厂:

var sessionFactory = new MySSHSessionFactory();
sessionFactory.Initialize();
SshSessionFactory.SetInstance(sessionFactory);

// Now you can do a clone command.

请注意,我仍然在弄清楚这个库,所以我可能没有以最佳方式编写myshSessionFactory(例如,它是否处理关闭会话的容错性?)。但这至少是一个开始。

我添加了凭据提供程序,看看它是否有帮助。CloneCommand clone=Git.CloneRepository().SetCredentialsProvider(新的CustomCredentialsProvider()).SetURI(gitAddress).SetDirectory(folderToSave);clone.Call();您正在使用哪个版本的NGit?我注意到的一件事是,您从NuGet获得的NGit非常旧(2011年旧),因此可能在修复此问题的错误修复方面落后。在我的情况下,我根本无法连接,但随后将我的NGit版本更新到。我添加了凭据提供程序,以查看它是否有帮助。CloneCommand clone=Git.CloneRepository().SetCredentialsProvider(新的CustomCredentialsProvider()).SetURI(gitAddress).SetDirectory(folderToSave);clone.Call();您正在使用哪个版本的NGit?我注意到的一件事是,您从NuGet获得的NGit非常旧(2011年旧),因此可能在修复此问题的错误修复方面落后。在我的例子中,我根本无法连接,但随后将我的NGit版本更新为。谢谢标记,下面是另一个示例,在使用带有“ssh://”git存储库url表单(JGit ssh over http proxy)的JGit时,我使用此技巧启用http代理的设置,下面是另一个示例,在使用JGit和“ssh://”git存储库url表单(JGit-ssh-over-http-proxy)时,我使用此技巧启用http代理的设置