向Java进程发送密码

向Java进程发送密码,java,process,passwords,Java,Process,Passwords,我试图通过Java中的process命令访问SVN,作为更大GUI的一部分,以查看SVN上有哪些文件。经过大量的研究,我已经大大改进了我的方法,但我仍然无法完成它。如果我在GUI中运行代码,它就会挂起。为了发现问题所在,我简化了它,并将其作为控制台程序运行。当我在那里运行它时,它显示了对我的GNOME钥匙圈的请求。我的代码输入密码,但控制台似乎不接受它。我的代码如下: public class SvnJavaTest{ public static void mai

我试图通过Java中的process命令访问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();
                }
           }
    }

运行此命令时,我没有收到任何错误,如果我在控制台中手动输入密码,然后运行它,它会工作,因为它会记住我的密码。我查看了一下,发现有一些软件包会在登录时自动输入我的钥匙圈,但这并不是一个真正的选项。非常感谢。

改用该库。

最好使用svn java API(有几种,我不确定哪一种更好),它是更简单的解决方案。
回答您的问题-您可以在url中提供身份验证信息:

这样的解决方案的主要问题是您实际上无法控制stdin和stdout。恶意用户可以用一个shell脚本包装svn命令,该脚本复制stdin(从而捕获程序传输的所有密码)。虽然shell的灵活性在很多方面都很好,但它与您连接的灵活性是一样的,您最好能适应它(以及它的后果)

这就是为什么最好使用JavaAPI来使用客户端的真正原因,注入捕获敏感数据的代码的机会要小得多(以及更好的错误报告)