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

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

 package lekko.svn;

 import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNURL;
import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager;
import org.tmatesoft.svn.core.internal.io.dav.DAVRepositoryFactory;
import org.tmatesoft.svn.core.internal.io.svn.SVNRepositoryFactoryImpl;
import org.tmatesoft.svn.core.wc.*; import java.io.File; /**
* 默认版本访问的SVNKit工厂
* @author lekko
*/
public class SvnKitFactory { public static ISVNOptions OPTION = SVNWCUtil.createDefaultOptions(true);
private static ISVNAuthenticationManager AUTH; private static SvnKitFactory _instance = new SvnKitFactory2(); private SvnKitFactory() {
init();
} /**
* 单例SVN连接类
*/
public static SvnKitFactory getInstance() {
return _instance;
} /**
* 快速获取连接
*/
public SVNClientManager getClient() {
if (AUTH != null) {
return SVNClientManager.newInstance(OPTION, AUTH);
}
return SVNClientManager.newInstance(OPTION);
} /**
* 对SVNKit连接进行认证,并获取连接
* @param username 用户名
* @param pwd 密码
* @param sshFilePath OpenSSH密钥
*/
public SVNClientManager getAuthClient(String username, String pwd, String sshFilePath) {
File dir = SVNWCUtil.getDefaultConfigurationDirectory();
AUTH = SVNWCUtil.createDefaultAuthenticationManager(dir, username, pwd.toCharArray(), new File(sshFilePath), new char[] {}, true);
return SVNClientManager.newInstance(OPTION, AUTH);
} private void init() {
// HTTP、HTTPS网络
DAVRepositoryFactory.setup();
// SSH网络
SVNRepositoryFactoryImpl.setup();
} public static void main(String[] args) throws SVNException {
SvnKitFactory factory = SvnKitFactory.getInstance();
SVNClientManager manager = factory.getAuthClient("lekko", "", "C:/Users/Public/Documents/lekko.openssh");
SVNWCClient client = manager.getWCClient();
SVNURL url = SVNURL.parseURIEncoded("svn+ssh://lekko@www.webxxx.com/xxx/xxx_rep/test_proj");
SVNInfo info = client.doInfo(url, SVNRevision.HEAD, SVNRevision.HEAD);
System.out.println("OK " + info);
}
}

这里我需要说明几个点:

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”方法,效率更高一些。上代码:

         try {
SVNClientManager manager = SvnKitFactory.getInstance().getClient(); // 尝试使用缓存
manager.getWCClient().doInfo(SVNURL.parseURIEncoded(url), null, SVNRevision.HEAD);
} catch (SVNException e) {
int code = e.getErrorMessage().getErrorCode().getCode();
if (code == 170001) {
try {
SVNClientManager manager = SvnKitFactory.getInstance().getAuthClient(username, pwd, sshfile); // 进行认证
manager.getWCClient().doInfo(SVNURL.parseURIEncoded(url), null, SVNRevision.HEAD);
} catch (SVNException ex) {
logger.error("Auth fail", ex);
}
} else {
_logger.error("Auth fail", e);
}
}

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

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

SVNKit支持SSH连接的更多相关文章

  1. Centos7创建支持ssh服务的docker镜像

    如何在centos7中使用docker创建一个支持ssh连接的容器 1.拉取centos7.4镜像(由于7.4目前是最稳定的版本,所以推荐使用centos7.4) docker pull centos ...

  2. Redis可视化工具(支持ssh链接)

    1.Redis Desktop Manager RedisDesktopManager,简称RDM,这是一款很出名的Redis可视化管理工具,支持Windows,Mac,Ipad,LInux 开源地址 ...

  3. Putty——支持Telnet,ssh连接的连接软件

    简介 PuTTY 的官方网站:http://www.chiark.greenend.org.uk/~sgtatham/putty/,截止到 2007年6月,发布的最高稳定版本是 0.6.PuTTY 是 ...

  4. 001. 使用ssh连接不上centos 6.5的解决方法及其解决中文乱码

    1. 使用ssh连接不上centos 6.5的解决方法: 错误显示: Connecting to 192.168.1.106:22... Could not connect to '192.168.1 ...

  5. SSH连接 NAT型 VirtualBox + LINUX

    1.首先登录到虚拟机中的Linux系统,查看一下使用NAT网卡的IP地址. 2.关闭虚拟机. 3.依次点击 "设置 -> 网络 -> (网络地址转换)端口转发",其中需 ...

  6. 新购阿里云服务器ECS创建之后无法ssh连接的问题处理

    作者:13 GitHub:https://github.com/ZHENFENG13 版权声明:本文为原创文章,未经允许不得转载. 问题描述 由于原服务器将要到期,因此趁着阿里云搞促销活动重新购买了一 ...

  7. ssh连接原理介绍( 无密码连接登录的原理)

    SSH(Secure  Shell)一种在不安全网络上提供安全远程登录及其它安全网络服务的协议.由客户端和服务端的软件组成的,有两个不兼容的版本分别是:1.x和2.x.(SSH 2.x的客户程序是不能 ...

  8. [转]python3之paramiko模块(基于ssh连接进行远程登录服务器执行命令和上传下载文件的功能)

    转自:https://www.cnblogs.com/zhangxinqi/p/8372774.html 阅读目录 1.paramiko模块介绍 2.paramiko的使用方法 回到顶部 1.para ...

  9. 使用Dockerfile创建支持SSH服务的镜像

    1.前面我们学习了使用Dockerfile,那接下来我们就用Dockerfile创建一个支持SSH服务的镜像. 2.首先创建一个目录ssh_centos [root@rocketmq-nameserv ...

随机推荐

  1. C# salt+hash 加密

    一.先明确几个基本概念 1.伪随机数:pseudo-random number generators ,简称为:PRNGs,是计算机利用一定的算法来产生的.伪随机数并不是假随机 数,这里的" ...

  2. Android 关于ijkplayer

    基于ijkplayer封装支持简单界面UI定制的视频播放器 可以解析ts格式的so库 怎样编译出可以解析ts等格式的so库?就是编译的时候需要在哪一步修改配置? 一些电视台的m3u8 CCTV1综合, ...

  3. Atiti.大企业病与小企业病 大公司病与小公司病

    Atiti.大企业病与小企业病 大公司病与小公司病 1. 大企业病,一般会符合机构臃肿 .多重领导 .人才流失的特点.1 2. 大企业病避免方法1 3. 小企业病 1 3.1.1. 表现1 4. 如何 ...

  4. Apache2.4:AH01630 client denied by server configuration

    问题说明:Apache服务总共有4个,是为了防止单点故障和负载均衡,负载均衡控制由局方的F5提供. 访问的内容在NAS存储上,现象是直接访问每个apache的服务内容都是没有问题,但是从负载地址过来的 ...

  5. REGEX例子

    作为REGEX的例子,代码9.3显示了一个给定的文件有多少行,具有给定的模式,通过命令行输入(注:有更有效率的方式来实现这个功能,如Unix下的grep命令,在这里只是给出了另一种方式).这个程序像下 ...

  6. Firefox开发者专版浏览器,Web开发者利器.

    2015的11月9日,Firefox迎来了自己的十周岁生日.在庆祝Firefox十周年之际,Mozilla发布了Firefox开发者专版,这是首款专门为开发者打造的浏览器. 浏览器中独特的暗色调设计. ...

  7. 理解JavaScript中的“this”

    对于javascript的初学者来说,一般对“this”关键字都感到非常迷惑.本文的目的旨在让你全面的了解“this”,理解在每一个情景下如何使用“this”,希望通过本文,可以帮助同学们不在害怕“t ...

  8. 用Go实现的简易TCP通信框架

    接触到GO之后,GO的网络支持非常令人喜欢.GO实现了在语法层面上可以保持同步语义,但是却又没有牺牲太多性能,底层一样使用了IO路径复用,比如在LINUX下用了EPOLL,在WINDOWS下用了IOC ...

  9. [Intel Edison开发板] 02、Edison开发板入门

    一.前言 Start from the link: 开始学习的链接 上面链接是官网的教程,按照教程可以开发板入门: 其中第一步是了解开发板,涉及到如何组装.如何连线.一些主要的接口简单介绍等信息: 第 ...

  10. git 使用

    三个状态 文件由 git 维护三中状态 modified:文件被改动,但还没有被提交 staged:标记被改动的文件到下次需要提交的文件快照 committed:文件已经被安全保存到本地 可以使用命令 ...