gpt4 book ai didi

.net - NGIT/JGIT/Git# 带有私钥的 SSH session 克隆 Git 存储库

转载 作者:行者123 更新时间:2023-12-02 14:39:14 32 4
gpt4 key购买 nike

session 部分用私钥连接,没问题。但是,当我执行 git Clone 时,它​​会给出错误“身份验证失败”。如何包装、绑定(bind)或使连接的 session 与 git clone 一起工作。我在 .NET 4.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();

最佳答案

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

克隆命令将从 SSHSessionFactory 获取它实际使用的 session 。 .首先,您需要创建一个实现 SSHSessionFactory 的类。抽象类,就像我在下面所做的那样:

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 命令在他们想要使用 session 时使用这个工厂:
var sessionFactory = new MySSHSessionFactory();
sessionFactory.Initialize();
SshSessionFactory.SetInstance(sessionFactory);

// Now you can do a clone command.

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

关于.net - NGIT/JGIT/Git# 带有私钥的 SSH session 克隆 Git 存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16233301/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com