3

私はbashスクリプトで次のことを達成しようとしています:

  1. SSH 接続を試行し、失敗した場合はエラー、SSH 接続が失敗した場合はエラー
  2. 確認したら、「top」コマンドを実行し、結果をファイルに保存します
  3. リモートサーバーから戻るscpファイル

私は次のような個々のコマンドを知っています:1)ssh接続を確認する:

ssh -q user@ip exit

echo $?

これは、成功した場合は '0' を返し、エラーの場合は '255' を返します。

2) top を実行してファイルに保存するには、次のようにします。

top -n 1 -b > /tmp/top.out

3) リモートホストからの scp バックファイル

expect -c "
   set timeout 1
   spawn scp user@host:/tmp/top.out root@anotherhost:/.
   expect yes/no { send yes\r ; exp_continue }
   expect password: { send password\r }
   expect 100%
   sleep 1
   exit
"

より具体的には、これを完全にまとめることが私の問題です。

  • Expect を使用して SCP 接続をテストするときに、返された '0' と '255' の値を取得できないようです。

    • 再びexpectを使用してtopコマンドを実行できないようです。つまり、これは機能しません。

    expect -c " set timeout 1 spawn ssh user@host top -n 3 -b > /tmp/top.out expect password: { send password\r } sleep 1 exit "

    • したがって、3 番目のビットも機能しません。

どんな助けでも大歓迎です。私のスクリプトは#!/bin/bash宣言を含む .sh スクリプトであることに注意してください。さまざまな理由で#!/usr/bin/expectを使用できません。

4

2 に答える 2

4

今では醜いものです。多くの落とし穴があります。おそらく、シェルまたはプレーンなargv配列を使用して実行する場所がよくわからないでしょう。また、期待することは、行われることになっている方法はなく、それはただもろいです。

(AFAIKexpectは、主にモデム(ATコマンドセット)などとの通信に使用することを目的としています)。

パスワードの代わりに自動sshおよびscpにSSHキーを使用します。それが完了したら(または以前でも、パスワードを手動で入力する必要があります)、シェルでこれを起動します。

$ ssh user@server "top -n 1 -b" > /tmp/top.out

ファイルはローカルマシンにあります。(リダイレクトはローカルで行われたため、まだリモートでは行われていません)。scpする必要はありません。

これですべてです。

于 2012-06-29T14:45:16.797 に答える
0

これを確認してください: https://stackoverflow.com/a/23632210/524743

expect <<'END'
log_user 0
spawn sh -c {echo hello; exit 42}
expect eof
puts $expect_out(buffer)

lassign [wait] pid spawnid os_error_flag value

if {$os_error_flag == 0} {
    puts "exit status: $value"
} else {
    puts "errno: $value"
}
END

hello

exit status: 42

期待のマニュアルページから

[引数] を待つ

生成されたプロセス (または名前が付けられていない場合は現在のプロセス) が終了するまで遅延します。

通常、wait は 4 つの整数のリストを返します。最初の整数は、待機していたプロセスの pid です。2 番目の整数は、対応するスポーン ID です。3 番目の整数は、オペレーティング システム エラーが発生した場合は -1、それ以外の場合は 0 です。3 番目の整数が 0 の場合、4 番目の整数は、生成されたプロセスによって返されるステータスです。3 番目の整数が -1 の場合、4 番目の整数はオペレーティング システムによって設定された errno の値です。グローバル変数 errorCode も設定されます。

于 2015-05-07T15:30:41.597 に答える