SSHJ+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();
}

ПРИМЕЧАНИЕ. Некоторый чувствительный (но не относящийся к этому вопросу) код был исключен из этого кода.

1 ответ

Решение

Вам следует подождать, пока команда не обработает команду, прежде чем отправлять следующую. Это потому, что удаленная оболочка, с которой вы общаетесь, выполняет команды синхронно.

Expect.sendLine Метод настолько быстр, что передает данные до завершения первой команды.

Я предлагаю вам добавить Expect.expect(PROMPT) вызов метода после каждого sendLine получить приглашение оболочки, чтобы убедиться, что предыдущая команда выполнена.

Посмотрите на примеры с домашней страницы ExpectIt:

Другие вопросы по тегам