java为什么“git pull”exec命令被卡住而不打印?
执行以下命令时,系统会提示我键入密码:
$ 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密码
# 1 楼答案
这是因为SSH密码短语应该从
pseudo terminal
而不是从STDIN
读取。您必须在父进程(您的程序)和子进程(git)之间创建一个伪tty通信流,并通过该流执行整个通信。看看Pseudo terminal to use with ssh in java就知道了还应该注意的是,它不是
git
询问密码短语git
本身不执行任何身份验证,只依赖于ssh
(当然,仅适用于存储库,可通过ssh访问)。下面是行动的顺序git
检测到给定的存储库可以通过ssh访问并调用ssh传输您可以看一下pty4j,它使用JNA实现终端和进程执行的底层内容。或者看看JGit,这是git的纯java重新实现,它根本不调用命令行git。JGit是例如Eclipse Git plugin或Gerrit Code review system的基础,因此经过精心制作和抛光