1

UNIX サーバーから次の行を実行しています。

expect -c 'spawn ssh otherHost chown -R user:group /usr ; expect password: ; send 123456\n ; interact ;'

戻り値 0、空の stderr、および という stdout を取得しています/usr/... Not owner, /usr/... Not Owner ..

コマンド ラインssh otherHost chown -R user:group /usrを単独で実行すると、このメッセージが適切に返され、戻り値 !=0 とエラー ストリーム内のエラー メッセージが返されます。

エラーが発生したかどうかをプログラムで知る必要があり、expect (パスワードを渡さないようにする必要があります) では許可されません。(sshkeysを作成するためにexpectを使用してから、通常どおりサーバーにsshすることをお勧めします-ただし、サーバー間にパスワードが必要です)。

とにかく、expect の使用中に発生したエラーを見つけるにはどうすればよいですか?

4

1 に答える 1

0

私はスクリプトですべての Expect のものを書くことに慣れています。これにより、デバッグが容易になり、読みやすくなります。

Expect では、いつでも、例外を処理する各 Expect に「タイムアウト」を追加できます。期待されるパターンが一致しない場合、状況を知らせるメッセージを入れることができます。たとえば、ssh を使用します。

spawn ssh user@192.168.1.1
expect {
        "Password:"     {send "user123\n"; exp_continue}
        timeout         {send_user "connection fail\n"; exit}
        -ex "$"
}

どのパターンも一致しない場合、Expect はtimeoutブロックを実行し、「接続失敗」を表示します。

私があなたなら、複雑な ssh コマンドを多くの単純なコマンドに分割します。つまり、最初にサーバーに ssh し、ログイン プロセスを処理してから、chown 処理を行います。スクリプトは次のようになります。

# login
spawn ssh user@192.168.1.1
expect {
        -ex "(yes/no)?" {send "yes\n"; exp_continue}
        "Password:"     {send "user123\n"; exp_continue}
        timeout         {send_user "connection fail\n"; exit}
        -ex "#"
}

# do chown
send "chown -R user /usr\n"
expect {
        "No such file or directory" {send_user "No such file or directory\n"; exp_continue}
        "Operation not permitted" {send_user "Operation not permitted\n"; exp_continue}
        "invalid user" {send_user "Invalid user name\n"; exp_continue}
        -ex "$"
}

ほとんどの場合、Expect はコマンドが成功したかどうかについて何も知らないことに注意してください。スクリプトは、出力文字列を期待して自身をチェックし、それぞれの状況を処理する必要があります。

あなたの場合、 $? の値でコマンドを確認する簡単な方法があると思います。元のコマンドを細かく分割した場合。

# after ssh login, do chown
send "chown -R user /usr\n"
expect -ex "$"
send "echo rv: $?\n"
expect {
        "rv: 0" {send_user "command successed\n"}
        timeout {send_user "command failed: $expect_out(buffer)\n"; exit}
}

お役に立てれば。

于 2012-10-12T09:52:06.313 に答える