SSHJ + ExpectIt:无法发送多个命令

时间:2015-01-21 02:09:00

标签: java ssh amazon-ec2 expect sshj

我正在使用SSHJ和ExpectIt将多个命令发送到托管在Amazon EC2上的虚拟机。我没有得到任何错误,但ExpectIt只执行第一个命令并忘记其余的命令。你能在这里找出我做错了什么吗?

{
 SSHClient ssh=new SSHClient();
 Session session;
 Shell shell;
 session=ssh.startSession();
 session.allocateDefaultPTY();
 shell=session.startShell();
 Expect expect = new ExpectBuilder()
        .withOutput(shell.getOutputStream())
        .withInputs(shell.getInputStream(), shell.getErrorStream())
        .build();
 expect.sendLine("sudo useradd "+uname+" -g sftponly -m -d /home/"+uname); //Only this command is getting executed
expect.sendLine("sudo passwd "+uname);
expect.sendLine(pwd);
statusbar.setText("Assigning access key to user...");
expect.sendLine("sudo mkdir /home/"+uname+"/.ssh");
expect.sendLine("sudo touch /home/"+uname+"/.ssh/authorized_keys");
expect.sendLine("sudo echo "+pemfile+">/home/"+uname+"/.ssh/authorized_keys");
statusbar.setText("Providing permissions to user...");
expect.sendLine("sudo chown root /home/"+uname);
expect.sendLine("sudo chmod go-w /home/"+uname);
expect.sendLine("sudo mkdir /home/"+uname+"/"+uname);
expect.sendLine("sudo chmod ug+rwX /home/"+uname);
expect.sendLine("sudo chmod 700 /home/"+uname+"/.ssh");
expect.sendLine("sudo chmod 600 /home/"+uname+"/.ssh/authorized_keys");
expect.sendLine("sudo chmod 755 /home/"+uname);
statusicon.setForeground(Color.green);
statusbar.setText("User created!");
expect.close();
}

注意:此代码中省略了一些敏感(但与此问题无关)代码。

1 个答案:

答案 0 :(得分:1)

您应该等到服务器处理命令后再发送下一个命令。这是因为您与之通信的远程shell,同步执行命令。

Expect.sendLine方法速度非常快,它在第一个命令完成之前传输数据。

我建议您在每个Expect.expect(PROMPT)之后添加sendLine方法调用以接收a shell prompt,以确保完成上述命令。

查看ExpectIt主页中的示例: