3

我正在尝试使用 java 包装 rsync,并且在处理交互式登录时遇到了困难。我可以让 unix 命令行实用程序expect工作,但我似乎无法找出 java 等效的ExpectJ. 这是我当前的代码:

import java.io.IOException;

import expectj.ExpectJ;
import expectj.Spawn;


public class ExpectjTest {

    /**
     * @param args
     * @throws IOException 
     */
    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        String mypassword= "example";
        String cmd = "rsync  -e ssh --list-only --recursive   user@host:~/\n";
        ExpectJ expectinator = new ExpectJ();
        Spawn rsync = expectinator.spawn("/bin/bash");
        try {

            rsync.send(cmd);
            rsync.expect("password:",2);
            rsync.send(mypassword+"\n");
            rsync.expectClose();


        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }   
    }
}

当我运行它时,我收到错误:

ssh_askpass: exec(/usr/libexec/ssh-askpass): No such file or directory
Permission denied (gssapi-keyex,gssapi-with-mic,publickey,keyboard-interactive).

似乎没有启动正常的 ssh 交互式登录,因为我正在从 java 调用 rsync。使用的类似 shell 脚本expect工作得很好。此外,当我使用公钥授权时,类似的 java 代码似乎可以工作。如果我只是想使用ssh,我会使用 JSch 之类的库,但我并不真正信任任何 java rsync 库,所以我想包装命令行工具。

谢谢你的帮助!

4

0 回答 0