2

Perl の Expect モジュールを使用して、インタラクティブなアクティビティを実行し、リモート マシンでコマンドを実行しています。これについてあなたの助けを求める

これが私が使用した手順です

ユーザーを別のアカウントに切り替えます。ログインするためのパスワードを送信します。新しいユーザーのシェルを取得したら、ssh コマンドを実行してリモート マシンに接続します。

次に、そのリモート マシンでコマンドを実行し、その応答を取得します。リモートマシンでコマンドを実行できます。端末にも出力が表示されます。しかし、それを変数に取り込んで値と比較することはできません。

use Expect;   
my $exp = Expect->new;
$exp->raw_pty(1);

$exp->spawn('su - crazy_user') or die "Cannot spawn switch user cmd: $!\n"
$exp->expect($timeout,
  [ qr/Password:/i,
            sub {   my $self = shift;
                    $self->send("$passwd\n");
                    exp_continue;
     }],

  [ qr/\-bash\-4.1\$/i,
            sub {   my $self = shift;
                    $self->send("ssh $REMOTE_MACHINE\n");
        $self->send("$COMMAND1\n");
        exp_continue;
  }]
 );
 $exp->soft_close();

$COMMAND1経由でリモート マシンで実行した結果を取得するにはどうすればよい$self->send("$COMMAND1\n")ですか?

4

1 に答える 1

1

私は決してこれについての専門家ではありませんが、これまで誰も答えていないので、試してみましょう.

あなたの期待コマンドはそのためsu、通常の期待は、そのコマンドが元のシェルに応答するものに対してのみ機能します。ただし、これはパスワード プロンプトのみであり、場合によってはいくつかのエラー メッセージが表示されます。コマンドを送信することはできますが、その応答は、expect コマンドが実行されたシェルではなく、新しいユーザーのシェルに表示されます。そのため、画面には表示されますが、expect オブジェクトで使用できるストリームには表示されません。どこで直接 ssh する場合でも、まったく同じ問題が発生する可能性が高いことに注意してください (なぜ su してから ssh を実行するのかわかりませんが、直接できませんssh crazy-user@remote_machineか?)。

解決策は、出力ストリームでリモート コンソールに書き込まれるすべてのものを提供するため、単純な Expect の代わりにNet::SSH::Expectsuを使用して、リモート マシンで必要なユーザーをssh直接削除することです。しかし、私の記憶が正しければ、ストリームを検査するための構文は少し異なります。

于 2014-11-13T18:10:00.800 に答える