SSHJ+ExpectIt:无法发送多个命令
SSHJ+ExpectIt: Unable to send multiple commands
我正在使用 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();
}
注意:此代码中省略了一些敏感(但与此问题无关)的代码。
您应该等到一个命令被服务器处理后再发送下一个命令。这是因为您与之通信的远程 shell 同步执行命令。
Expect.sendLine
方法非常快,它在第一个命令完成之前传输数据。
我建议您在每个 sendLine
之后添加 Expect.expect(PROMPT)
方法调用以接收 a shell prompt 以确保完成前面的命令。
查看 ExpectIt 主页中的示例:
我正在使用 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();
}
注意:此代码中省略了一些敏感(但与此问题无关)的代码。
您应该等到一个命令被服务器处理后再发送下一个命令。这是因为您与之通信的远程 shell 同步执行命令。
Expect.sendLine
方法非常快,它在第一个命令完成之前传输数据。
我建议您在每个 sendLine
之后添加 Expect.expect(PROMPT)
方法调用以接收 a shell prompt 以确保完成前面的命令。
查看 ExpectIt 主页中的示例: