我试图通过Java中的进程命令访问SVN,作为更大的GUI的一部分,以查看SVN上的文件。经过大量的研究,我已经大大改进了我的方法,但是我仍然无法完成它。如果我在GUI中运行代码,它就会挂起。为了发现那个问题,我将其简化并作为控制台程序运行。当我在那里运行它时,它显示了我的GNOME密钥环的请求。我的代码输入密码,但控制台似乎不接受它。我的代码如下:
public class SvnJavaTest{
public static void main(String[] args){
try {
String[] commands = {"svn", "ls", "https://svnserver"};
Process beginProcess = Runtime.getRuntime().exec(commands, null, new File("/home/users/ckorb/Desktop"));
BufferedReader br = new BufferedReader(new InputStreamReader(beginProcess.getInputStream()));
BufferedWriter write = new BufferedWriter(new OutputStreamWriter(beginProcess.getOutputStream()));
write.write("password");
write.flush();
String line=br.readLine();
while (line != null){
System.out.println(line);
line =br.readLine();
}
br.close();
write.close();
beginProcess.waitFor();
} catch (IOException e1) {
e1.printStackTrace();
} catch (InterruptedException ie) {
ie.printStackTrace();
}
}
}
我没有遇到任何运行此错误的错误,如果我手动输入密码进入控制台然后运行它,它会起作用,因为它会记住我的密码。我看了一下,发现有一些软件包会在登录时自动输入我的密钥环,但这不是一个真正的选择。非常感谢你。
答案 0 :(得分:0)
请改用SVN Kit库。
答案 1 :(得分:0)
最好使用svn java API(有几个,我不确定哪个更好),这是更简单的解决方案。 回答你的问题 - 您可以在网址中提供身份验证信息:https://username:password@svnserver
答案 2 :(得分:0)
这样的解决方案的主要问题是你没有真正控制stdin和stdout。恶意的人可以使用shell脚本包装svn命令,该脚本生成stdin的副本(从而捕获程序传输的所有密码)。虽然shell的灵活性使其在很多方面都很出色,但它与您的连接具有相同的灵活性,并且您最好对它感到满意(以及它的后果)。
这就是使用Java API来更好地使用客户端的真正原因,注入代码可以捕获敏感数据(以及更好的错误报告)的可能性要小得多。