SVNKit支持SSH连接

SVNKit这个开源工具,用于Java语言访问SVN库,咋看的时候很方便,其实坑特别多。我在这里只想跟大家说一句,如果你还没有用过,请不要在生产环境使用这个东西了,兼容性问题搞死你(替换方案是直接用svn命令行,自己组参数调用,然后解析返回数据)。如果你已经入坑,好吧,有问题可以一起交流。

本文讲述SVNKit认证方面的知识,包括常用的http、https格式的svn地址,同时支持svn+ssh格式的svn地址。废话不说,上代码:

 1 package lekko.svn;
 2
 3 import org.tmatesoft.svn.core.SVNException;
 4 import org.tmatesoft.svn.core.SVNURL;
 5 import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager;
 6 import org.tmatesoft.svn.core.internal.io.dav.DAVRepositoryFactory;
 7 import org.tmatesoft.svn.core.internal.io.svn.SVNRepositoryFactoryImpl;
 8 import org.tmatesoft.svn.core.wc.*;
 9
10 import java.io.File;
11
12 /**
13  * 默认版本访问的SVNKit工厂
14  * @author lekko
15  */
16 public class SvnKitFactory {
17
18     public static ISVNOptions OPTION = SVNWCUtil.createDefaultOptions(true);
19     private static ISVNAuthenticationManager AUTH;
20
21     private static SvnKitFactory _instance = new SvnKitFactory2();
22
23     private SvnKitFactory() {
24         init();
25     }
26
27     /**
28      * 单例SVN连接类
29      */
30     public static SvnKitFactory getInstance() {
31         return _instance;
32     }
33
34     /**
35      * 快速获取连接
36      */
37     public SVNClientManager getClient() {
38         if (AUTH != null) {
39             return SVNClientManager.newInstance(OPTION, AUTH);
40         }
41         return SVNClientManager.newInstance(OPTION);
42     }
43
44     /**
45      * 对SVNKit连接进行认证,并获取连接
46      * @param username 用户名
47      * @param pwd 密码
48      * @param sshFilePath OpenSSH密钥
49      */
50     public SVNClientManager getAuthClient(String username, String pwd, String sshFilePath) {
51         File dir = SVNWCUtil.getDefaultConfigurationDirectory();
52         AUTH = SVNWCUtil.createDefaultAuthenticationManager(dir, username, pwd.toCharArray(), new File(sshFilePath), new char[] {}, true);
53         return SVNClientManager.newInstance(OPTION, AUTH);
54     }
55
56     private void init() {
57         // HTTP、HTTPS网络
58         DAVRepositoryFactory.setup();
59         // SSH网络
60         SVNRepositoryFactoryImpl.setup();
61     }
62
63     public static void main(String[] args) throws SVNException {
64         SvnKitFactory factory = SvnKitFactory.getInstance();
65         SVNClientManager manager = factory.getAuthClient("lekko", "", "C:/Users/Public/Documents/lekko.openssh");
66         SVNWCClient client = manager.getWCClient();
67         SVNURL url = SVNURL.parseURIEncoded("svn+ssh://[email protected]/xxx/xxx_rep/test_proj");
68         SVNInfo info = client.doInfo(url, SVNRevision.HEAD, SVNRevision.HEAD);
69         System.out.println("OK " + info);
70     }
71 }

这里我需要说明几个点:

1、main方法只是用来测试的,可以不要。

2、关于“getAuthClient”的参数,username是必须的,pwd(密码)可以是空字符串“”,sshFilePath(SSH私钥文件路径)也可以是空字符串“”。但是pwd和sshFilePath分别有不同的认证作用,前者是用于HTTP、HTTPS的,后者是用于SSH的。缺少哪个,对应的链接方式就不能正常认证了。

3、Windows用户要特别注意,SSH私钥必须是OpenSSH格式的,如果你是用PuTTYGen生成的密钥,记得转成OpenSSH,不然SVNKit也不能成功使用它进行认证的。

4、SVNKit对用户名与密码是有缓存的,一般缓存的目录与系统的svn命令行一致:

- Windows在C:\Users\用户名\AppData\Roaming\Subversion\auth目录下

- Linux在~/.subversion/auth目录下

5、正由于SVNKit有缓存,所以实际上不需要每次都调用“getAuthClient”方法进行账号认证。我这里推荐大家的调用是这样,在系统初始化时,先调用一次“getClient”,并进行一次doInfo操作,如果异常再使用“getAuthClient”方法进行认证,后续也只需要使用“getClient”方法,效率更高一些。上代码:

 1         try {
 2             SVNClientManager manager = SvnKitFactory.getInstance().getClient();  // 尝试使用缓存
 4             manager.getWCClient().doInfo(SVNURL.parseURIEncoded(url), null, SVNRevision.HEAD);
 5         } catch (SVNException e) {
 6             int code = e.getErrorMessage().getErrorCode().getCode();
 7             if (code == 170001) {
 8                 try {
 9                     SVNClientManager manager = SvnKitFactory.getInstance().getAuthClient(username, pwd, sshfile);    // 进行认证
10                     manager.getWCClient().doInfo(SVNURL.parseURIEncoded(url), null, SVNRevision.HEAD);
11                 } catch (SVNException ex) {
12                     logger.error("Auth fail", ex);
13                 }
14             } else {
15                 _logger.error("Auth fail", e);
16             }
17         }    

可以把它封到你程序启动的时候,或者在失败时弹个框让用户输入什么的。

转载请注明原址:http://www.cnblogs.com/lekko/p/6005382.html

时间: 2024-10-26 06:28:06

SVNKit支持SSH连接的相关文章

ubuntu16.04无法通过ssh连接

笔者刚刚接触ubuntu这个系统不久,发现ubuntu不支持ssh连接,于是写出了这篇总结. 当xshell连接时出现如下错误"Could not connect to '127.0.0.1' (port 22): Connection failed." 但是此时是可以ping通的. 经过笔者查看各种资料,得出造成这种情况的原因可能有三种. 一,桥接模式可以使路由使用DHCP的方式来分配IP,如果你的网络拓扑中没有路由器也是ping不通的.如果存在路由器,由于防火墙导致无法连接,可以使

Docker入门实战-SSH连接docker容器

简介 什么是Docker Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目.它基于 Google 公司推出的 Go 语言实现. 项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 GitHub 上进行维护. Docker 自开源后受到广泛的关注和讨论,以至于 dotCloud 公司后来都改名为 Docker Inc.Redhat 已经在其 RHEL6.5 中集中支持 Docker:Google 也在其 PaaS

ubuntu SSH 连接、远程上传下载文件

转自:http://www.cnblogs.com/by-1075324834/p/5045096.html 安装 SSH(Secure Shell) 服务以提供远程管理服务 sudo apt-get install ssh SSH 远程登入 Ubuntu 机 ssh [email protected] 将 文件/文件夹 从远程 Ubuntu 机拷至本地(scp) scp -r [email protected]:/home/username/remotefile.txt . 将 文件/文件夹

SSH连接虚拟机中的Ubuntu 12.0.4

摘要:主要是解决不能使用ssh远程Ubuntu的问题.使用的远程工具是putty.也可以使用xshell.ubunut12.0.4是装在虚拟机中的.不过这个应该没有什么影响. 一:问题的出现 前两天使用VMware装了一个ubuntu12.0.4之后.因为常常使用命令行.又喜欢在虚拟机与实体机中切来切去.感觉很不方便.就想在xp中远程ubuntu.遇到了点小意外.经过一会调试解决成功.把过程记录一下.好记性不如烂笔头. 在开始连接的时候.老是连接不成功.就想着具体是哪方面的问题.按照思路一步一步

ECS云主机SSH连接提示“Connection reset by peer”的解决办法和解决思路

三周前刚从上家公司换到新的公司,这家公司与上家公司相比对阿里云的云计算环境更加的依赖,使用的ECS实例和其他服务如SLB.RDS.OSS等更多了一个数量级.这篇文章的背景就是为了解决阿里云ECS云主机SSH连接的一个问题,从故障发现到故障排除到最后反思的一个详细过程.文章比较长,图片众多,建议有时间仔细阅读,没时间就阅读文末的"总结和反思"部分即可. 故障发现: 2017-05-23 下午17:00点前同事报告称GitLab所在的服务器访问出现异常.经查发现在公司内无法正常通过SSH连

[Linux] 如何禁止使用口令只允许使用密钥建立 SSH 连接

1. 创建 SSH KEY 使用 ssh-keygen 生成一个密钥对,并且将公钥注册到服务器的 $HOME/.ssh/authorized_keys 文件. 2. 确保启用 SSH 公钥认证功能 查看 /etc/ssh/sshd_config 文件,确保以下两条为 yes: RSAAuthentication yes PubkeyAuthentication yes 一般它们默认都是 yes,如果不是,请修改为 yes,保存并且重启 SSH 服务: $ sudo service ssh rel

Linux下通过ssh连接github

github每次pull/push代码时要求推送代码的用户是合法的,所以每次推送时候都要输入账号密码用以验证用户是否为合法用户,而ssh是一种安全的传输模式,可以代替用户的这一"输入账号密码"的行为来验证用户. github共支持2种操作方式 https 可以随意克隆github上的项目,而不管是谁的:在pull/push的时候是需要验证用户名和密码的 ssh 克隆者必须是拥者或管理员,且需要先添加 SSH key ,否则无法克隆.在pull/push的时候不再是验证用户名和密码,而是

Linux系统下如何配置SSH_Centos7 ssh连接配置 CentOS7下安全配置

转自:http://www.linuxdown.net/install/config/2016/0611/5853.html Linux系统下如何配置SSH_Centos7 ssh连接配置 CentOS7下安全配置SSH 时间:2016-06-11 11:13来源:未知 作者:Linux先生 举报 点击:1804次 SSH 通常是我们进入新伺服器的第一个应用程式,它也取代了telnet 和rsh 成为管理伺服器的最主要介面. SSH 通常是我们进入新伺服器的第一个应用程式,它也取代了telnet

docker创建支持ssh服务的centos镜像

以centos为基础,目的使用ssh服务远程连接docker容器 环境:宿主机centos7,直接搜索docker的centos镜像,下载最新版本 1.先按照docker:yum install -y epel-release yum install -y docker 2.启动docker: systemctl start docker.service 3.使用ps查看docker是否启动 ps aux |grep docker 4.下载centos的docker镜像 docker pull