1

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

: 一部の重要な (ただし、この質問には関係のない) コードは、このコードから省略されています。

4

1 に答える 1

1

コマンドがサーバーによって処理されるまで待ってから、次のコマンドを送信する必要があります。これは、通信するリモート シェルが同期的にコマンドを実行するためです。

このExpect.sendLine方法は非常に高速であるため、最初のコマンドが終了する前にデータを送信します。

Expect.expect(PROMPT)それぞれの後にメソッド呼び出しを追加してシェルプロンプトsendLineを受け取り、前のコマンドが確実に実行されるようにすることをお勧めします。

ExpectItホームページの例を見てみましょう。

于 2015-01-22T20:20:20.683 に答える