执行以下命令时,系统会提示我输入密码:
$ git pull
Enter passphrase for key (...)
当我尝试使用Apache Commons Exec以编程方式显示相同的信息时,程序会卡住并且不会打印任何内容:
CommandLine cmd = new CommandLine( "git" );
cmd.addArgument( "pull" );
DefaultExecutor executor = new DefaultExecutor();
executor.setStreamHandler( new PumpStreamHandler( System.out, System.err, System.in ) );
executor.execute( cmd );
为什么示例在没有打印任何内容的情况下卡住,并且在使用本机控制台时它会提示我提供git密码?
答案 0 :(得分:2)
这是因为SSH密码短语应该从pseudo terminal
而非STDIN
读取。您必须在父(您的程序)和子(git)进程之间创建伪tty通信流,并通过该流执行整个通信。看一下Pseudo terminal to use with ssh in java来了解这个想法。
还应该注意,git
不是要求密码短语。 git
本身不执行任何身份验证,只需依赖ssh
(当然,仅适用于可通过ssh访问的存储库)。这是行动的顺序
git
检测到可以通过ssh访问给定的存储库并调用ssh transport 您可以查看pty4j,它使用JNA来实现终端和流程执行低级别的东西。或者看看JGit这是git的纯java重新实现,它根本不会调用命令行git。 JGit是例如Eclipse Git plugin或Gerrit Code review system的基础,因此它经过精心设计和完善。